根据定义,顶级变量是那些不能通过指针间接引用的变量,即那些地址永远不会通过运算符地址公开或通过动态内存分配返回的变量; 地址获取变量是那些已公开地址的变量,因此可以通过指针间接引用。
例如,a是顶级变量,b,c是取地址变量。
a = alloca i8**
b = alloca i8*
c = alloca i8
store b a
store c b
store 0 c
如何在 LLVM IR 程序中找到所有取地址变量和顶级变量?
LLVM IR 是一种 SSA 语言,也就是说,它有值而不是变量。
当编译器将程序从带有变量的语言翻译为 SSA 语言时,并且存在一些更改变量的代码,它可以选择使用外部存储器来完成相同工作的方式来表达代码。这在 IR 中很容易,但在其他一些 SSA 语言中则更困难。它可以做到这一点,但不必这样做。
它还可以使用一组值,包括至少一个 phi 节点。这种方法通常更接近最终汇编代码如何使用 CPU 寄存器来完成工作(“经常”并不意味着“必然”)。如果编译器这样做,那么就很难区分原始源中的变量和未命名的子表达式之间的区别。
那么,对于你的问题。您正在寻找源语言中的变量。共有三种方式:
这一切都不是完美的。不可能——从源代码到可运行代码的转换是有损的。