虽然语言参考提到了很多关于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);
任何人都可以解释如何做到这一点吗?
谢谢!
答案 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传递中的断言。