如何从给定LLVM IR的源代码中获取变量的所有行号?

时间:2019-09-25 10:21:03

标签: c llvm llvm-ir

我完全是LLVM的新手。我想知道如何从给定LLVM IR的源代码中获取特定变量的所有行号?

例如(显示LLVM IR的片段)

store i32 0, i32* %i, align 4, !dbg !12
!12 = !DILocation(line: 2, column: 6, scope: !7)
%4 = load i32*, i32** %ip, align 8, !dbg !30
!30 = !DILocation(line: 7, column: 4, scope: !25)

我相信,通过检查LLVM IR,获取任何变量的行号详细信息与在指令末尾访问!dbg有关。但是我不知道如何访问这些信息。

另一个疑问是,如果使用指针存储变量的地址,我们如何知道它为哪个变量存储地址?

2 个答案:

答案 0 :(得分:0)

  

我相信,通过检查LLVM IR,可以获得行号详细信息   任何变量都与在末尾访问!dbg有关   指令。但是我不知道如何访问此信息。

我相信您的假设是正确的。据我所知,所有信息都为您提供:

第一条指令以!dbg !12store i32 0, i32* %i, align 4, !dbg !12)结尾。

然后,您应该找到以!12开头的行。提示,调试信息通常位于模块的LLVM IR的底部。

在您的情况下为:!12 = !DILocation(line: 2, column: 6, scope: !7) <-此处的解释是:标记为!12的指令来自生成此LLVM IR的源文件的第2行第6列。源文件的名称也应该可用(通常在LLVM IR的顶部)。

  

另一个疑问是,是否使用了指针来存储变量的地址,   我们如何知道它为哪个变量存储地址?

您需要自己推断信息,例如通过数据流分析。由于从LLVM IR is in SSA form开始,它在概念上相当简单。

答案 1 :(得分:0)

LLVM中的所有内容都是一个值,某些值会跟踪其用户。 42(常数int)不是,但是您感兴趣的值确实可以跟踪其用户。我有一些代码可以处理使用特殊值的phi节点;这是找到这些phi节点的三行:

for(auto u : someValue->users()) {
  PHINode * phi = dyn_cast<PHINode>(u);
  if(phi)
    …

请注意,这仅适用于模块内。如果您具有全局值(例如许多函数),则不会跟踪模块外部的使用(例如大多数函数调用)。

相关问题