如何在LLVM IR中查找取地址变量和顶级变量

问题描述 投票:0回答:1

根据定义,顶级变量是那些不能通过指针间接引用的变量,即那些地址永远不会通过运算符地址公开或通过动态内存分配返回的变量; 地址获取变量是那些已公开地址的变量,因此可以通过指针间接引用。

例如,a是顶级变量,b,c是取地址变量。

a = alloca i8**
b = alloca i8*
c = alloca i8

store b a
store c b
store 0 c

如何在 LLVM IR 程序中找到所有取地址变量和顶级变量?

llvm llvm-ir
1个回答
0
投票

LLVM IR 是一种 SSA 语言,也就是说,它有值而不是变量。

当编译器将程序从带有变量的语言翻译为 SSA 语言时,并且存在一些更改变量的代码,它可以选择使用外部存储器来完成相同工作的方式来表达代码。这在 IR 中很容易,但在其他一些 SSA 语言中则更困难。它可以做到这一点,但不必这样做。

它还可以使用一组值,包括至少一个 phi 节点。这种方法通常更接近最终汇编代码如何使用 CPU 寄存器来完成工作(“经常”并不意味着“必然”)。如果编译器这样做,那么就很难区分原始源中的变量和未命名的子表达式之间的区别。

那么,对于你的问题。您正在寻找源语言中的变量。共有三种方式:

  1. 您可以连接到从变量生成 LLVM IR 的前端,并检测那里的变量。这将为您提供完美的保真度,您将始终知道某物是变量还是表达式,因为您同时拥有 IR 和源语言。
  2. 可以读取IR调试信息。如果存在,它会告诉您有关源代码行、变量名称等的信息。如果有变量名称,则您正在查看一个变量。可以使用另外两种方法之一来查看其地址是否被占用。
  3. 您可以决定如何失败(例如“如果将某些常见子表达式视为变量也没关系”)并分析 LLVM IR 语句。 Mem2Reg.cpp 源文件 就是做这种事情的。其目的是检测尽可能多的变量,区分两个类并将尽可能多的变量转换为值组。注意“尽可能多”,这是它选择的故障模式。

这一切都不是完美的。不可能——从源代码到可运行代码的转换是有损的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.