使用 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 中的断言。
虽然语言参考中提到了很多关于 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 中的断言。