gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:52 24 4
gpt4 key购买 nike

我想找到一种方法来确定 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

有什么想法吗?

最佳答案

我的前端就是这样做的(嗯,有点像)。您可能无法做得足够好以达到您的目标,但如果您做到了,这是一种方法:

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

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

关于c++ - 如何区分 llvm IR 代码中的堆栈/堆地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53380105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com