首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >向LLVM IR中的指令添加元数据

向LLVM IR中的指令添加元数据
EN

Stack Overflow用户
提问于 2012-11-17 07:12:14
回答 1查看 7.8K关注 0票数 20

首先,我是LLVM通行证的新手。

我正在尝试在转换通过后(使用C++应用程序接口)向LLVM中的指令添加元数据。我打算存储此信息,以供工具链中的另一个工具使用。关于这个,我有两个问题。

  1. 我希望我作为元数据存储的信息能够提供给另一个在LLVM上工作的工具。那么元数据是个好主意吗?我打算将字符串作为元数据存储在一些instructions.
  2. If元数据中,这是正确的方法,我需要一些帮助来创建元数据节点。我计划使用setMedata()函数将其附加到指令。使用setMetadata()的哪个变体是正确的。我不确定我的数据应该属于哪个MDKind。我想创建一个MDString,将它附加到我的MDNode上,然后使用指令调用setMetadata()。如果我想将元数据附加到函数内部的指令中,我应该在setMedata()中使用什么上下文。上下文与元数据的相关性是什么?

我试着在论坛和llvm doxygen文档中阅读了很多讨论,但我没有得到所有问题的明确和完整的答案。我很感谢你的帮助或一些可以帮助我理解这一点的材料。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-11 16:14:20

在我看来:

1.元数据是正确的使用机制吗?

如果你的“其他工具”本身不是一个通行证,那么是的,我认为元数据是最好的方法--将所有内容保存在IR中,易于肉眼识别,易于手动添加以进行测试,而且--也许最重要的是--只要你不重用现有的元数据类型,就不会与其他任何东西发生冲突。

然而,如果你的“其他工具”本身是一个pass,那么还有一个选择:你可以让一个pass依赖于另一个pass,然后在后面的pass中直接使用前面的信息。这样做的好处是,您不必修改IR。

2.如何使用自定义元数据节点?

使用setMetadatachar*变体,如下所示:

LLVMContext& C = Inst->getContext();
MDNode* N = MDNode::get(C, MDString::get(C, "my md string content"));
Inst->setMetadata("my.md.name", N);

如果它是第一次在setMetadata中使用该字符串,它会自动将my.md.name注册为模块中的新类型(我相信它实际上在整个上下文中是一致的)。稍后,您可以使用以下命令检索字符串:

cast<MDString>(Inst->getMetadata("my.md.name")->getOperand(0))->getString();

但是,如果您希望从相同的作用域重复调用getMetadatasetMetadata,则还可以使用Module::getMDKindID来仅获取实际使用的种类,并使用这些方法的变体,这些方法使用kind值。

最后,请注意,您可以将元数据节点的作用域限制在一个函数内--为此使用MDNode::get(..., ..., true)变体--尽管我自己从未使用过它。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13425794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档