【发布时间】:2012-12-13 02:51:33
【问题描述】:
据我所知,当我需要获取局部变量的行号时,我必须寻找 llvm.dbg.declare 内在函数的调用并获取 dbg 元数据(因为 AllocaInst 本身不包含任何 dbg信息)。但是似乎不能保证这个CallInst 是AllocaInst 的下一条指令,我必须在指定的函数中遍历指令,这是低效的。所以想知道AllocaInst有没有办法直接获取llvm.dbg.declare指令。
例如,在一个名为foo.c的src中:
int foo(){
int a;
}
以及对应的llvm ir:
define i32 @foo() nounwind {
entry:
%retval = alloca i32
%a = alloca i32
%"alloca point" = bitcast i32 0 to i32
call void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9
br label %return, !dbg !10
return: ; preds = %entry
%retval1 = load i32* %retval, !dbg !10
ret i32 %retval1, !dbg !10
}
......
!9 = metadata !{i32 3, i32 0, metadata !8, null}
如果我需要知道foo.c 中定义的int a; 的行号,我必须遍历ir 并从call void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9 获取!dbg !9。
顺便说一句,处理全局变量似乎没有困难,因为llvm.dbg.gv 包含非常信息。
【问题讨论】:
标签: llvm llvm-gcc llvm-c++-api llvm-ir