2012-02-05 60 views
0

我希望我的語言後端能夠增量構建函數和類型,但在函數和類型無法成功構建時(由於用戶輸入問題)不會污染主模塊和上下文。llvm:增量式構建JIT內容的策略

請問an earlier question這個問題。 我可以看到的一個策略是建立臨時模塊中的所有內容,並且只在成功後遷移到主要上下文,但我不確定當前API是否可以實現。例如,我不知道在不同的上下文之間遷移該內容,因爲它們應該代表孤立的LLVM功能島,但是也許總會有替代方法將所有內容保存到.bc並加載到其他地方?

你會提出什麼樣的策略來達到這個目的?

回答

1

假設您有兩個模塊 - 源和目標,可以將一個函數從源複製到目標。您可以使用LLVM中的代碼作爲LLVM鏈接程序的主體,位於lib/linker/LinkModules.cpp中。

特別是,請查看該文件中的linkFunctionProtolinkFunctionBody方法。 linkFunctionBody複製功能定義,並使用llvm::CloneFunctionInto實用程序進行繁重工作。


至於LLVMContext,除非您特別需要在不同的線程同時運行幾個LLVM的情況下,不要擔心太多,只是使用getGlobalContext()處處需要上下文。請閱讀this doc page瞭解更多信息。

+0

我特別需要保留多個LLVMContexts,因爲它們是從長時間運行的服務進程中調用的,並且保留全局LLVMContext可能會使其增長無限。單獨的LLVMContexts將會改善內存管理和垃圾收集(即使在單線程進程中運行) – lurscher 2012-02-07 12:50:51

+0

@lurscher:我認真地懷疑它「可能會使它無限增長」。我建議你使用單個上下文和基準/執行分析來實現它。最有可能的內存使用將是微不足道的。正如我鏈接到的頁面所說,您無法在上下文之間傳遞內存數據結構。我想你可以將它們序列化爲位代碼,並在另一側(在不同的上下文中)對它們進行反序列化,儘管 – 2012-02-07 13:00:31

+0

是的,我也這麼認爲。謝謝! – lurscher 2012-02-07 14:31:52