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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (58)

试图在转换通过后(使用C++API)将元数据添加到LLVM中的指令中。我打算存储这些信息,供工具链中的另一个工具使用。

关于这个我有两个问题。

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

我试着在论坛和lvm doxygen文档中阅读了很多讨论,但我没有得到对我所有问题的清晰和完整的答案。

提问于
用户回答回答于

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

如果“其他工具”本身并不是一个过关,那么是的,我认为元数据是最好的方法--保持IR中的所有东西都易于用眼睛识别,简单地手工添加以进行测试,而且--也许最重要的是--只要不重用现有的元数据类型,就不会与其他任何东西发生冲突。

但是,如果“其他工具”本身就是一个传递,那么还有一个选择:可以通过另一个传递,而不是在后面的传递中直接使用前面的信息。优点是不必修改IR。

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

使用char*变体setMetadata,就像这样:

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 to just get the actual kind used, and use the variations of these methods that use the kind value.

可以将元数据节点范围限制在函数中--使用MDNode::get(..., ..., true)变体-虽然我自己从未用过。

扫码关注云+社区