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

发布于 2024-11-28 02:36:58 字数 846 浏览 3 评论 0原文

我正在尝试将 元数据字符串 添加到我的 LLVM 模块。我正在尝试的精简版本是

#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'

但正如人们所看到的,元数据没有显示。

我可以以某种方式将字符串添加到模块中吗? 模块本身似乎只提供对命名元数据的访问。现在我不知道还能去哪里寻找。有什么建议吗?

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

I'm trying to add a metadata string to my LLVM module. The stripped down version of what I'm trying is

#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();
}

I can compile and run it:

Desktop% g++ llvm.cc -o llvm `llvm-config --cppflags --ldflags --libs all`
Desktop% ./llvm 
; ModuleID = 'test'

But as one can see, the metadata does not show up.

Can I somehow add the string to the module? The module itself only seems to offer access to named metadata. Now I don't know where else I could look. Any suggestions?

Supplement: I got the feeling that you can't just have a metadata string "floating around" in your module, it seems like you have to add it to a named metadata node. Is that right?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北凤男飞 2024-12-05 02:36:58

试试这个:

#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 中找到了类似的代码。祝你好运。

Try this:

#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();
}

I am not sure if you are able to have metadata "floating around" as you say. If it's not attached to any part of your program then what good is it doing? I've been looking into MD a bit lately... I found similar code in lib/Analysis/DIBuilder.cpp. Good luck.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文