【问题标题】:How to get variable definition line number etc. using dbg metadata?如何使用 dbg 元数据获取变量定义行号等?
【发布时间】:2012-12-13 02:51:33
【问题描述】:

据我所知,当我需要获取局部变量的行号时,我必须寻找 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}

如果我需要知道foo.c 中定义的int a; 的行号,我必须遍历ir 并从call void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9 获取!dbg !9。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 干得好。但是你怎么能得到同样的全局变量呢?对我来说 findDbgGlobalDeclare 无法正常工作...因为我的字节码中没有 llvm.dbg.gv
    【解决方案2】:

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

    【讨论】:

    • AFAIK, llvm2.9 还有DbgDeclareInst; llvm 只是变化太大了:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多