我希望我的语言后端以增量方式构建函数和类型,但当函数和类型未能成功构建(由于用户输入问题)时,不要污染主模块和上下文。
关于这个,我问了一个较早的问题。我可以看到的一种策略是在 temp 模块中构建所有内容,并且LLVMContext
仅在成功后迁移到主上下文,但我不确定当前 API 是否可行。例如,我不知道要在不同的上下文之间迁移该内容,因为它们应该代表 LLVM 功能的孤立岛屿,但也许总有另一种方法可以将所有内容保存到 .bc 并加载到其他地方?
你会建议什么其他策略来实现这一目标?
我希望我的语言后端以增量方式构建函数和类型,但当函数和类型未能成功构建(由于用户输入问题)时,不要污染主模块和上下文。
关于这个,我问了一个较早的问题。我可以看到的一种策略是在 temp 模块中构建所有内容,并且LLVMContext
仅在成功后迁移到主上下文,但我不确定当前 API 是否可行。例如,我不知道要在不同的上下文之间迁移该内容,因为它们应该代表 LLVM 功能的孤立岛屿,但也许总有另一种方法可以将所有内容保存到 .bc 并加载到其他地方?
你会建议什么其他策略来实现这一目标?
假设您有两个模块 - 源和目标,可以将函数从源复制到目标。您可以用作示例的 LLVM 中的代码是 LLVM 链接器的主体,位于lib/linker/LinkModules.cpp
.
特别是,查看该文件中的linkFunctionProto
和linkFunctionBody
方法。linkFunctionBody
复制函数定义,并使用该llvm::CloneFunctionInto
实用程序进行繁重的工作。
至于LLVMContext
,除非您特别需要在不同的线程中同时运行多个 LLVM 实例,否则不要太担心它,只需getGlobalContext()
在需要上下文的任何地方使用即可。阅读此文档页面以获取更多信息。