llvm:增量构建JIT内容的策略

llvm:增量构建JIT内容的策略,llvm,llvm-3.0,incremental-compiler,Llvm,Llvm 3.0,Incremental Compiler,我希望我的语言后端以增量方式构建函数和类型,但在函数和类型无法成功构建时(由于用户输入问题),不要污染主模块和上下文 我想问一下。 我可以看到的一个策略是在temp模块和LLVMContext中构建所有内容,只有在成功后才迁移到主上下文,但我不确定在当前API中这是否可行。例如,我不知道如何在不同的上下文之间迁移这些内容,因为它们应该表示LLVM功能的孤岛,但也许总有其他方法可以将所有内容保存到.bc并加载到其他地方 为实现这一点,您还建议了哪些其他策略?假设您有两个模块—源和目标,那么就可以将

我希望我的语言后端以增量方式构建函数和类型,但在函数和类型无法成功构建时(由于用户输入问题),不要污染主模块和上下文

我想问一下。 我可以看到的一个策略是在temp模块和
LLVMContext
中构建所有内容,只有在成功后才迁移到主上下文,但我不确定在当前API中这是否可行。例如,我不知道如何在不同的上下文之间迁移这些内容,因为它们应该表示LLVM功能的孤岛,但也许总有其他方法可以将所有内容保存到.bc并加载到其他地方


为实现这一点,您还建议了哪些其他策略?

假设您有两个模块—源和目标,那么就可以将函数从源复制到目标。可以用作示例的LLVM中的代码是LLVM链接器的主体,位于
lib/linker/LinkModules.cpp

特别是,请查看该文件中的
linkFunctionProto
linkFunctionBody
方法
linkFunctionBody
复制函数定义,并使用
llvm::CloneFunctionInto
实用程序进行重载



至于
LLVMContext
,除非您特别需要在不同的线程中同时运行多个LLVM实例,否则不要太担心,只要在需要上下文的任何地方使用
getGlobalContext()
。阅读了解更多信息。

我特别需要保留多个LLVMContext,因为它们是从长期运行的服务进程调用的,而保留全局LLVMContext可能会使其变得无限。单个LLVMContexts将有助于更好的内存管理和垃圾收集(即使在单线程进程中运行)@lurscher:我严重怀疑它“可能会使它无限增长”。我建议您使用单个上下文和基准/执行评测来实现它。最有可能的内存使用情况是微不足道的。正如我链接到的页面所说,您不能在上下文之间传递内存中的数据结构。我想你可以将它们序列化为比特码,然后在另一端(在不同的上下文中)反序列化它们,但无论如何,我想在邮件列表中向你推荐这篇关于长时间运行的进程和内存管理的文章。我似乎忘了粘贴url: