Llvm 如何使用dbg元数据获取变量定义行号等?
据我所知,当我需要获取局部变量的行号时,我必须查找Llvm 如何使用dbg元数据获取变量定义行号等?,llvm,llvm-gcc,llvm-c++-api,llvm-ir,Llvm,Llvm Gcc,Llvm C++ Api,Llvm Ir,据我所知,当我需要获取局部变量的行号时,我必须查找llvm.dbg.declareintrinsic的调用并获取dbg元数据(因为AllocaInst本身不包含任何dbg信息)。然而,似乎无法保证此CallInst是AllocaInst的下一条指令,我必须在指定的函数中遍历该指令,这是低效的。所以我想知道是否有一种方法可以让AllocaInst直接获取llvm.dbg.declare指令 例如,在名为foo.c的src中: int foo(){ int a; } 以及相应的llvm
llvm.dbg.declare
intrinsic的调用并获取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}
如果我需要知道inta的行号代码>在foo.c
中定义,我必须遍历ir并获取!dbg!9
from调用void@llvm.dbg.declare(元数据!{i32*%a},元数据!7)!dbg!9
顺便说一句,在处理全局变量时似乎没有什么困难,因为llvm.dbg.gv
包含了非常多的信息。我最终发现,我们可以在DbgInfoPrinter.cpp
中使用静态方法DbgDeclareInst*finddbgdegdeclare(const Value*V)
,可以看到
破解这段代码也不是很难^ ^我的llvm版本是3.3。没有函数DbgDeclareInst*finddbgdecare(const Value*V)
。
您的llvm版本是什么?干得好。但是,如何才能让全球选手获得同样的成绩呢?对我来说,FindDBGLOBALDECLARE工作不正常…因为我的字节码AFAIK中没有llvm.dbg.gv,llvm2.9仍然有DbgDeclareInst
;llvm只是更改太多:-)