使用constantInt创建llvm元数据节点

时间:2017-06-13 15:15:51

标签: metadata llvm constants

虽然语言参考提到了很多关于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);

任何人都可以解释如何做到这一点吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我写了一篇关于如何在LLVM IR中插入元数据的this小帖子。你可以参考一下。基本上你需要使用ConstantAsMetadata来实现这一点。

答案 1 :(得分:0)

所以显然我检查了llvm类层次结构并检查了子类 在MetaData下。我发现了一些类,其中一个是 - ConstantAsMetadata

以上代码中的更改对我有用 -

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

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

  };

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

如果您正在使用llvm提供的验证程序传递,如果您在初始化程序中只有一个ConstantInt,则上述操作无效/有意义。 这是因为llvm提供的Verifier传递中的断言。