使用 constantInt 创建 llvm 元数据节点

Create llvm metadata node with constantInt

虽然语言参考中提到了很多关于 LLVM 元数据的内容,

我在 SO 上看到了一些帖子 - How to add a Metadata String to an LLVM module with the C++ API?

我还在 llvm 源代码中看到了一些代码- http://llvm.org/doxygen/DIBuilder_8cpp_source.html

但是,他们似乎没有提到如何创建包含特定宽度的 ConstantInt 的 MDNode。

下面是相关代码不行)-

std::vector<Metadata*> Elts = 
{
      ConstantInt::get(TheContext,APInt(returnType->getIntegerBitWidth(),decimal_val)) 
};



MDNode* Node = MDNode::get(TheContext, Elts);
callInst->setMetadata(LLVMContext::MD_range,Node);

谁能解释一下这是如何做到的?

谢谢!

我已经写了 this small post about how to insert metadata in LLVM IR. You can refer that. Basically you need to use ConstantAsMetadata 来实现这个。

所以显然我检查了 llvm class 层次结构并检查了子 classes 在元数据下。我发现了一些 classes,其中之一是 - ConstantAsMetadata

上面代码中对我有用的 change 是 -

std::vector<Metadata*> Elts = {
    ConstantAsMetadata::get(ConstantInt::get(TheContext,APInt(returnType,0)) ),

ConstantAsMetadata::get(ConstantInt::get(TheContext,APInt(returnType,decimal_val)) )    

  };

注意- 你应该(如果你想要正确的话)为你试图创建的每个范围指定一对数字。

如果您使用的是 llvm 提供的验证程序传递,如果您在初始化程序中只有一个 ConstantInt,则上述内容不会 work/make 有意义。 这是因为 llvm 提供的 Verifier pass 中的断言。