我能够获得从加载指令回溯到 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