据我所知,当我需要获取局部变量的行号时,我必须寻找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}
如果我需要知道int a;
中定义的foo.c
的行号,我必须遍历ir并从!dbg !9
获取call void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9
。
llvm.dbg.gv
包含了非常信息。
答案 0 :(得分:1)
我终于发现我们可以在DbgDeclareInst* findDbgDeclare(const Value *V)
中使用静态方法DbgInfoPrinter.cpp
,可以看到here
破解这段代码也不是很困难^ _ ^
答案 1 :(得分:-1)
我的llvm的版本是3.3。没有函数DbgDeclareInst* findDbgDeclare(const Value *V)
。
你的llvm版本是什么?