如何在优化的 IR 中从 dbg 获取原始变量名称

时间:2021-05-12 01:09:21

标签: llvm llvm-ir

我能够获得从加载指令回溯到 alloca 指令的原始变量名称。然而,在这种情况下,生成的 IR 代码得到优化,SSA 寄存器只有数字,在任何 IR 输出中都没有使用原始变量。有没有办法从 !dbg !10 中获取变量信息。我可以使用:DebugLoc Loc = LoadInst->getDebugLoc() 并获取源位置。但在这种情况下我需要变量名。

我遇到的问题是我只想要所有条件变量名称(switch 或 icmp 中的那些),因此我从基本块中的那些指令回溯它。否则,即使在优化的代码中,也可以直接使用 dyn_cast<DbgVariableIntrinsic> 获取函数内部声明的变量。我希望使用附加到加载指令的 !dbg 信息或附加到定义的 !dbg 来解析变量名称,如果调试信息可以获取这些信息。请提供一些解决此设计的指针。


int foo (bar_t *b, int len)
{
    if (b == (bar_t *)NULL) {
        return 0;
    }
    return -1;
}

; Function Attrs: noinline nounwind optnone uwtable
define i32 @foo(%struct.bar_t*, i32) #0 !dbg !10 {
  %3 = load i64, i64* getelementptr inbounds ([1 x i64], [1 x i64]
  %4 = add i64 %3, 1
  %5 = alloca i32, align 4
  %6 = alloca % struct.bar_t*, align 8
  %7 = alloca i32, align 4
  store % struct.bar_t* %0, % struct.bar_t** %6, align 8
  call void @llvm.dbg.declare(metadata % struct.bar_t** %6, metadata !11, metadata !DIExpression()), !dbg !12
  store i32 %1, i32* %7, align 4
  call void @llvm.dbg.declare(metadata i32* %7, metadata !12, metadata !DIExpression()), !dbg !14
  %8 = load % struct.bar_t*, % struct.bar_t** %6, align 8, !dbg !15
  %9 = icmp eq % struct.bar_t* %8, null, !dbg !16
  br i1 %9, label %10, label %11, !dbg !17

我参考了 llvm.dbg.declare 和 llvm.dbg.value 的文档 https://llvm.org/docs/SourceLevelDebugging.html#llvm-dbg-declare

0 个答案:

没有答案