首先,我是LLVM通行证的新手。
我正在尝试在转换通过后(使用C++应用程序接口)向LLVM中的指令添加元数据。我打算存储此信息,以供工具链中的另一个工具使用。关于这个,我有两个问题。
我试着在论坛和llvm doxygen文档中阅读了很多讨论,但我没有得到所有问题的明确和完整的答案。我很感谢你的帮助或一些可以帮助我理解这一点的材料。
发布于 2012-12-11 16:14:20
在我看来:
1.元数据是正确的使用机制吗?
如果你的“其他工具”本身不是一个通行证,那么是的,我认为元数据是最好的方法--将所有内容保存在IR中,易于肉眼识别,易于手动添加以进行测试,而且--也许最重要的是--只要你不重用现有的元数据类型,就不会与其他任何东西发生冲突。
然而,如果你的“其他工具”本身是一个pass,那么还有一个选择:你可以让一个pass依赖于另一个pass,然后在后面的pass中直接使用前面的信息。这样做的好处是,您不必修改IR。
2.如何使用自定义元数据节点?
使用setMetadata
的char*
变体,如下所示:
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();
但是,如果您希望从相同的作用域重复调用getMetadata
或setMetadata
,则还可以使用Module::getMDKindID
来仅获取实际使用的种类,并使用这些方法的变体,这些方法使用kind值。
最后,请注意,您可以将元数据节点的作用域限制在一个函数内--为此使用MDNode::get(..., ..., true)
变体--尽管我自己从未使用过它。
https://stackoverflow.com/questions/13425794
复制相似问题