首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DBG元数据获取变量定义、行号等?

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

Stack Overflow用户
提问于 2012-12-13 10:51:34
回答 2查看 1.1K关注 0票数 0

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

例如,在名为foo.c的src中

代码语言:javascript
复制
int foo(){
     int a;
}

以及相应的llvm ir:

代码语言:javascript
复制
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包含了非常详细的信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-14 09:40:59

最后,我想我们可以在DbgInfoPrinter.cpp中使用静态方法DbgDeclareInst* findDbgDeclare(const Value *V),它可以看到是here

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-15 10:16:01

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13852180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档