c++ - llvm:在函数返回之前生成清理析构函数

标签 c++ code-generation return-value llvm local-variables

在 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/

相关文章:

c# - 我可以在 Visual Studio 2010 中自动生成按钮、复选框等的方法吗?

c# - xsd.exe 生成类的可空值

android - C++ 运算符 new 和 new[] 会在 Android 上抛出 std::bad_alloc 吗?

c++ - 如何重构 C++ 中的类以使某个函数成为常量?

compilation - 是否有宏或类似的解决方法在编译时包含源文件夹 (src) 路径?

return-value - 从命令行应用程序将字符串值传递给 Inno Setup

bash - 有没有一种优雅的方式来存储和评估 bash 脚本中的返回值?

mySQL存储过程where子句问题

c++ - 什么应该是一个随机变量总是生成 5

c++ - c++ 中的函数位置重要吗?