我想找到一种方法来确定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
有什么想法吗?
答案 0 :(得分:0)
我的前端做到了(嗯,有点像它)。您可能无法很好地完成目标,但是如果这样做,这是一种方法:
将malloc()
的每个返回结果(或称为分配器的任何内容)视为堆变量,并将alloca()
的每个结果视为堆栈变量。对于每一个,通过查看for(auto x : y->users())
分类更多的值;一个malloc()
的getelementptr或强制类型转换也是一个堆变量。
但是,这不能对每个值进行分类。从堆上的结构/数组加载指针可能会在堆栈上返回某些内容,反之亦然。函数参数可以是任意一个。但是也许您不需要对每个值进行分类。