llvm 为每个堆栈分配添加一个 8 字节的元数据
llvm adding a 8-byte meta data for each stack allocation
我是 llvm pass 的新手,我想编写一个代码,通过它我可以在每个堆栈对象分配之前添加一个元数据。换句话说,每当我看到一个AllocaInst,我就分配了一个堆栈并用我的值填充它。但是,当我检查堆栈(在 gdb 中)时,我看到所有元数据首先添加到堆栈中,然后是堆栈对象。但是我试图在每个堆栈对象之间获取元数据(如下所示)
<metadata>
stack_obj1
<metadata>
stack_obj2
这是我写的:
if (AllocaInst *AI = dyn_cast<AllocaInst>(&I)){
IRBuilder<> IRB(AI);
auto* A = IRB.CreateAlloca (IntTy->getPointerTo(), nullptr, "a");
auto* V = ConstantInt::get(Type::getInt8Ty(m.getContext()), <a value>)
IRB.CreateStore(V, A, false);
}
尝试按以下方式添加元数据:
if (llvm::Instruction* I = dyn_cast<llvm::Instruction>(X)) {
llvm::Value *C = llvm::ConstantInt::get(
llvm::Type::getInt32Ty(VMContext), 100);
llvm::MDNode *Ndata = llvm::MDNode::get(VMContext,
llvm::ValueAsMetadata::getConstant(C));
I->setMetadata("meta_data", Ndata);
}
您需要根据自己的代码调整此逻辑。需要注意的一点是,我们不需要创建存储节点来向其中添加一些元数据。
我是 llvm pass 的新手,我想编写一个代码,通过它我可以在每个堆栈对象分配之前添加一个元数据。换句话说,每当我看到一个AllocaInst,我就分配了一个堆栈并用我的值填充它。但是,当我检查堆栈(在 gdb 中)时,我看到所有元数据首先添加到堆栈中,然后是堆栈对象。但是我试图在每个堆栈对象之间获取元数据(如下所示)
<metadata>
stack_obj1
<metadata>
stack_obj2
这是我写的:
if (AllocaInst *AI = dyn_cast<AllocaInst>(&I)){
IRBuilder<> IRB(AI);
auto* A = IRB.CreateAlloca (IntTy->getPointerTo(), nullptr, "a");
auto* V = ConstantInt::get(Type::getInt8Ty(m.getContext()), <a value>)
IRB.CreateStore(V, A, false);
}
尝试按以下方式添加元数据:
if (llvm::Instruction* I = dyn_cast<llvm::Instruction>(X)) {
llvm::Value *C = llvm::ConstantInt::get(
llvm::Type::getInt32Ty(VMContext), 100);
llvm::MDNode *Ndata = llvm::MDNode::get(VMContext,
llvm::ValueAsMetadata::getConstant(C));
I->setMetadata("meta_data", Ndata);
}
您需要根据自己的代码调整此逻辑。需要注意的一点是,我们不需要创建存储节点来向其中添加一些元数据。