【问题标题】:Find local variables in certain function llvm在某些函数 llvm 中查找局部变量
【发布时间】:2020-05-25 03:25:59
【问题描述】:

给定 LLVM 位代码中的某个函数,我如何识别它的局部变量? 比如下面这个来自 GNU coreutils echo 实用程序的 sn -p,我不知道如何在主 IR 代码的范围内找到变量 do_v9

int main (int argc, char **argv)
{
  bool display_return = true;
  bool posixly_correct = getenv ("POSIXLY_CORRECT");
  ....
  bool do_v9 = false;
}

我注意到 LLVM 为局部变量创建了一个元数据,称为 DILocalVariable,其中该变量将替换为以字母 i 开头的数字。

!686 = !DILocalVariable(name: "posixly_correct", scope: !678, file: !10, line: 114, type: !64)
!688 = !DILocalVariable(name: "do_v9", scope: !678, file: !10, line: 122, type: !64)

所以主 IR 代码既不包含变量do_v9,也不包含其对应的元数据!688,除了主函数定义之外的值。我的分析循环遍历主函数中的指令,但我不知道如何在我的迭代中找到这个局部变量。我在哪里使用 LLVM 6.0。

; Function Attrs: nounwind uwtable
define i32 @main(i32, i8**) #9 !dbg !678 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i8**, align 8
  %6 = alloca i8, align 1
  %7 = alloca i8, align 1
  %8 = alloca i8, align 1
  %9 = alloca i8, align 1
  %10 = alloca i32
  %11 = alloca i8*, align 8
  %12 = alloca i64, align 8
  %13 = alloca i8*, align 8
  %14 = alloca i8, align 1
  %15 = alloca i8, align 1

【问题讨论】:

  • 你引用的元数据是dwarf调试信息的一部分。您是否在启用调试符号的情况下进行编译?
  • 我使用本网站的说明编译 coretuils klee.github.io/tutorials/testing-coreutils。我认为它使用obj-llvm$ CC=wllvm ../configure --disable-nls CFLAGS="-g -O1 -Xclang -disable-llvm-passes -D__NO_STRING_INLINES -D_FORTIFY_SOURCE=0 -U__OPTIMIZE__" 使用-g 来启用调试
  • 您的 IR 是否包含对 llvm.dbg.declare 或 llvm.dbg.addr 内部函数的任何调用?
  • 我在 IR 中只有 llvm.dbg.declare 的电话。顺便说一句,我重新编译了没有标志 -g 的 coretuils 并且仍然具有相同的调试信息。

标签: llvm local-variables


【解决方案1】:

如果您想使用编译器发出的调试信息从 llvm IR 中的源代码中识别局部变量,您可以通过查看源代码中对 @llvm.dbg.declare@llvm.dbg.addr 内在函数的调用来做到这一点.对于函数中的每个局部变量,您将有一个或另一个(但不是两者;llvm.dbg.addr 函数替换较新版本的 llvm 中的 llvm.dbg.declare)一次。例如,如果您有以下情况:

%1 = alloca i32, align 4
call void @llvm.dbg.addr(metadata i32* %1, metadata !2, metadata ...), !dbg ...
!2 = !DILocalVariable(name: "i", ...)

这告诉我们局部变量 i 对应于地址为 %1 的 alloca 分配的堆栈位置。

请注意,上面的 ... 仅代表我们在此上下文中不关心的内容。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多