【发布时间】:2016-01-03 15:49:08
【问题描述】:
目前我正在开发一种工具,该工具可以识别任意程序上全局变量和字段变量的加载和存储访问。此外,访问的变量应该由它们的源级名称/标识符来标识。 为了做到这一点,我将诊断程序的源代码编译到带有调试信息的 LLVM IR 中。到目前为止一切顺利,生成的元数据节点包含所需的源级别标识符。但是,我无法与某些 LLVM IR 标识符和元数据中的信息建立联系。
例如,考虑一个类的 satic 成员:
class TestClass {
public:
static int Number;
};
对应的 LLVM IR 如下所示:
@_ZN12TestClass6NumberE = external global i32, align 4
...
!15 = !DIDerivedType(tag: DW_TAG_member, name: "Number", scope: !"_ZTS12TestClass", file: !12, line: 5, baseType: !16, flags: DIFlagPublic | DIFlagStaticMember)
在这个受控示例中,我知道“@_ZN12TestClass6NumberE”是“数字”的标识符。但是,总的来说,我看不到如何找出哪些 IR 标识符对应于哪些元数据。
有人可以帮帮我吗?
【问题讨论】: