我正在尝试向我的LLVM模块添加metadata string。我正在尝试的精简版
#include <llvm/LLVMContext.h>
#include <llvm/Module.h>
#include <llvm/Metadata.h>
using namespace llvm;
int main() {
Module* module = new Module("test", getGlobalContext());
MDString::get(module->getContext(), "test");
module->dump();
}
我可以编译并运行它:
Desktop% g++ llvm.cc -o llvm `llvm-config --cppflags --ldflags --libs all`
Desktop% ./llvm
; ModuleID = 'test'
但是可以看出,元数据没有显示出来。
我可以以某种方式将字符串添加到模块中吗? module本身似乎只提供对命名元数据的访问。现在我不知道我还能在哪里看。有什么建议吗?
补充:我觉得你不能只在你的模块中有一个“浮动”的元数据字符串,似乎你必须将它添加到一个命名的元数据节点。是吗?
答案 0 :(得分:4)
试试这个:
#include <llvm/LLVMContext.h>
#include <llvm/Module.h>
#include <llvm/Metadata.h>
using namespace llvm;
int main() {
Module* module = new Module("test", getGlobalContext());
Value *Elts[] = {
MDString::get(module->getContext(), "test1")
};
MDNode *Node = MDNode::get(getGlobalContext(), Elts);
NamedMDNode *NMD = module->getOrInsertNamedMetadata("test2");
NMD->addOperand(Node);
module->dump();
}
我不确定你是否能够像你说的那样“浮动”元数据。如果它没有附加到你的程序的任何部分那么它有什么用呢?我最近一直在研究MD ......我在lib/Analysis/DIBuilder.cpp找到了相似的代码。祝你好运。