查找元数据节点的所有用途

时间:2013-11-20 08:45:06

标签: llvm

我有MDNode*(使用DebugInfoFinder找到)。我想找出使用​​它的模块中的所有其他MDNode,但它的使用列表似乎是空的。我怎么找到它?

例如,我有类似的东西:

...
!5 = metadata !{i32 100}
...
!8 = metadata !{i32 101, metadata !5}
...

如果我有metadata !{i32 100},我该如何获得对metadata !{i32 101, metadata !5}的引用?

1 个答案:

答案 0 :(得分:1)

由于!5的“使用”是!8,另一个MDNode,这是故意的。

MDNode不被视为“用户”;请注意,虽然InstructionUser,但MDNode却不是。元数据不能通过设计影响代码生成。如果MDNode是值的“用户”,那么唯一用于元数据的死值就无法被杀死,这违背了设计。

实际上,这意味着要对元数据执行有趣的分析,您需要自己从模块构建此用法图。如果这听起来很昂贵,请不要担心,因为DebugInfoFinder已经很好了。因此,您可以使用自己的分析(相同的成本)替换它,以收集更多有用的信息。