0

据我所知,当我需要获取局部变量的行号时,我必须寻找llvm.dbg.declare内在函数的调用并获取 dbg 元数据(因为AllocaInst它本身不包含任何 dbg 信息)。但是似乎不能保证这CallInst是 的下一条指令AllocaInst,我必须在指定的函数中遍历指令,这是低效的。所以我想知道是否有一种方法可以直接AllocaInst获取llvm.dbg.declare指令。

例如,在一个名为 src 中foo.c

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 !9call void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9.

顺便说一句,处理全局变量时似乎没有困难,因为llvm.dbg.gv它包含非常信息。

4

2 回答 2

1

我终于想通了,我们可以使用静态方法DbgDeclareInst* findDbgDeclare(const Value *V)DbgInfoPrinter.cpp可以在这里看到

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

于 2012-12-14T01:40:58.920 回答
-1

我的llvm的版本是3.3。没有这个功能DbgDeclareInst* findDbgDeclare(const Value *V)。你的llvm是什么版本的?

于 2013-11-15T02:16:01.387 回答