在 LLVM 中,通常您会使用 CreateRet
退出生成的函数,但是,我想为函数中实例化的本地对象添加清理析构函数。
我的问题是:我假设我必须在 插入 CreateRet
之前插入清理函数调用,但是,我想知道返回值是否是locals(假设我们按值返回)那么我们不能在返回之前销毁这个值,但是 local 也不会在返回后被销毁,所以我想说我对 locals 的生命周期和去哪里有点困惑正确插入清理
最佳答案
您可以将您的源语言 return
语句/表达式编码为返回存储中的拷贝,然后分支到指定的返回基本 block ,这将破坏局部变量。如果您生成的 LLVM 函数返回值本身,而不是遵循它自己的协议(protocol)(通过第一个参数返回值,或类似的),您可以先将返回值保存到 alloca
,然后然后加载那个 alloca
并用 ret
返回它。当您通过第一个参数返回时的示例,%valuetype
表示在您的语言运行时中存储值的结构
define void @myfn(%valuetype *%ret) {
; use and create whatever locals you need
; source-language: return somelocal
store %valuetype %local1, %valuetype *%ret
br label %retlabel
retlabel:
; emit code to destruct locals ..., then return
ret void
}
关于c++ - llvm:在函数返回之前生成清理析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5999449/