如何区分llvm IR代码中的堆栈/堆地址?

时间:2018-11-19 17:48:14

标签: c++ llvm llvm-ir llvm-c++-api

我想找到一种方法来确定LLVM IR中的加载/存储操作数是LLVM传递(用C ++编码的传递),即

中的堆栈地址还是堆地址。
if (inst is a store) {
  if (inst->getOperand(1) is a heap address) {
    // do something with the heap address
  }
}

对于负载也类似地操作。在IR代码中,它们的引用相同:

store i32 5, i32* %c, align 4 // storing value to a local variable
store i32 1, i32* %4, align 4 // storing value to something on the heap, do something with the heap address

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我的前端做到了(嗯,有点像它)。您可能无法很好地完成目标,但是如果这样做,这是一种方法:

malloc()的每个返回结果(或称为分配器的任何内容)视为堆变量,并将alloca()的每个结果视为堆栈变量。对于每一个,通过查看for(auto x : y->users())分类更多的值;一个malloc()的getelementptr或强制类型转换也是一个堆变量。

但是,这不能对每个值进行分类。从堆上的结构/数组加载指针可能会在堆栈上返回某些内容,反之亦然。函数参数可以是任意一个。但是也许您不需要对每个值进行分类。