C++ llvm为每个堆栈分配添加8字节元数据

C++ llvm为每个堆栈分配添加8字节元数据,c++,stack,llvm,stack-overflow,C++,Stack,Llvm,Stack Overflow,我是llvm pass的新手,我想写一段代码,通过它我可以在每个堆栈对象分配之前添加元数据。换句话说,每当我看到AllocaInst时,我就分配一个堆栈并用我的值填充它。但是,当我检查堆栈(在gdb中)时,我看到所有元数据都首先添加到堆栈中,然后添加到堆栈对象中。但是我试图在每个堆栈对象之间建立元数据(如下所示) 堆栈_obj1 堆栈_obj2 这是我写的: if (AllocaInst *AI = dyn_cast<AllocaInst>(&I)){ IRBuil

我是llvm pass的新手,我想写一段代码,通过它我可以在每个堆栈对象分配之前添加元数据。换句话说,每当我看到AllocaInst时,我就分配一个堆栈并用我的值填充它。但是,当我检查堆栈(在gdb中)时,我看到所有元数据都首先添加到堆栈中,然后添加到堆栈对象中。但是我试图在每个堆栈对象之间建立元数据(如下所示)


堆栈_obj1
堆栈_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(AllocaInst*AI=dyn\u cast(&I)){
IRB(AI);
auto*A=IRB.CreateAlloca(IntTy->getPointerTo(),nullptr,“A”);
auto*V=ConstantInt::get(类型::getInt8Ty(m.getContext()),)
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);
    }
if(llvm::指令*I=dyn\u cast(X)){
llvm::Value*C=llvm::ConstantInt::get(
llvm::Type::getInt32Ty(VMContext),100);
llvm::MDNode*nda=llvm::MDNode::get(VMContext,
llvm::ValueAsMetadata::getConstant(C));
I->setMetadata(“元数据”,数据);
}

您需要根据自己的代码调整此逻辑。需要注意的是,我们不需要创建存储节点来添加一些元数据。

太好了!我可以得到如下代码auto*AI=dyn_cast(LI->getOperand(0));llvm::MDNode*md=cast(AI->getMetadata(“meta_data”);现在我有了
元数据i64 100
。我不确定如何将其传递给函数以执行检查?我有一个带有函数的c文件,但是,由于类型是元数据,我无法将其传递给前面提到的函数。我需要定义一个内在函数吗?我建议你写一个IR通行证。在这一过程中,您可以以任何方式使用此元数据。
  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);
    }