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只是更改太多:-)