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