如何使用C ++ API将元数据字符串添加到LLVM模块?

时间:2011-08-07 15:05:11

标签: c++ metadata llvm

我正在尝试向我的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本身似乎只提供对命名元数据的访问。现在我不知道我还能在哪里看。有什么建议吗?

补充:我觉得你不能只在你的模块中有一个“浮动”的元数据字符串,似乎你必须将它添加到一个命名的元数据节点。是吗?

1 个答案:

答案 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找到了相似的代码。祝你好运。