如何使用dbg元数据获取变量定义行号等?

时间:2012-12-13 02:51:34

标签: llvm llvm-gcc llvm-c++-api llvm-ir

据我所知,当我需要获取局部变量的行号时,我必须寻找llvm.dbg.declare内在函数的调用并获取dbg元数据(因为AllocaInst本身不包含任何dbg信息)。但是,似乎无法保证此CallInstAllocaInst的下一条指令,并且我必须遍历指定函数中的指令,这是低效的。所以我想知道是否有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包含了非常信息。

2 个答案:

答案 0 :(得分:1)

我终于发现我们可以在DbgDeclareInst* findDbgDeclare(const Value *V)中使用静态方法DbgInfoPrinter.cpp,可以看到here

破解这段代码也不是很困难^ _ ^

答案 1 :(得分:-1)

我的llvm的版本是3.3。没有函数DbgDeclareInst* findDbgDeclare(const Value *V)。 你的llvm版本是什么?