How to get variable definition line number etc. using dbg metadata?

纵然是瞬间 提交于 2019-12-11 14:36:48

问题


As far as I know, when I need to get the line number of a local variable I had to look for the invocation of the llvm.dbg.declare intrinsics and get the dbg metadata(since AllocaInst itself does not contain any dbg info). However there seems no guarantee that this CallInst is the next instruction of the the AllocaInst, and I have to traverse the instruction in a specified function, which is inefficient. So I'm wondering whether there is a method for AllocaInst to get the llvm.dbg.declare instruction directly.

For example,in a src called foo.c:

int foo(){
     int a;
}

and the corresponding 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}

If I need to know the line number of int a; defined in foo.c I have to traverse the ir and get !dbg !9 from call void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9.

BTW, there seems no difficulty when dealing with global variable since llvm.dbg.gv contains the very info.


回答1:


I finally figured out that we could use the static method DbgDeclareInst* findDbgDeclare(const Value *V) in DbgInfoPrinter.cpp,which can be seen here

It's also not very difficult to hack this piece of code^_^




回答2:


The version of my llvm is 3.3. There are not the function DbgDeclareInst* findDbgDeclare(const Value *V). What's your llvm's version?



来源:https://stackoverflow.com/questions/13852180/how-to-get-variable-definition-line-number-etc-using-dbg-metadata

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!