我想知道目前是否有可能在LTO時間安排「外部」(.so/.dylib)LLVM插件(模塊)傳遞?想要這個的原因是我想添加的模塊間優化。LLVM LTO Pass插件的可能性?
我也發現了這個話題; How to write a custom intermodular pass in LLVM? 但單獨的工具不適合我。
感謝
我想知道目前是否有可能在LTO時間安排「外部」(.so/.dylib)LLVM插件(模塊)傳遞?想要這個的原因是我想添加的模塊間優化。LLVM LTO Pass插件的可能性?
我也發現了這個話題; How to write a custom intermodular pass in LLVM? 但單獨的工具不適合我。
感謝
我覺得這裏最有用的東西可能是理解代碼的狀態如何通行證運行,什麼是LTO期間。
首先,當編譯器運行優化通行證時,它們將作爲已添加到PassManager
的集合完成。這意味着LLVM/Clang
當通過類似-O3
的東西時將創建一個PassManager
的副本,並隨後爲其提供預期提供O3
優化級別的通行證集。這與您在外部庫中所做的工作非常不同,後者必須手動提供,並且不能正常安裝到通道管道中。
然後我們在做LTO的時候就有了狀態。在鏈接時間優化期間,所有單個翻譯單元都已合併,現在只有一個Module
。這意味着在每個函數上運行的優化將在代碼庫中的每個函數上運行。類似地,每個模塊優化將在完整的Module
上運行,並因此提供程序間分析/優化。
如果您正在尋找使用模塊內通行證,那麼在LTO時間沒有理由這麼做,您可以簡單地製作一個ModulePass
並在每個設備上運行該通行證。
嗨,謝謝你的回覆!對不起,我錯誤地寫了'內部',但我的意思是'內部'。我確實需要一個完整的程序視圖,因爲我希望在不同的TU中一致地做一些事情,並且對代碼中聲明的內容而不是庫中的內容有明確的看法。 我真的認爲我需要一個LTO通道,我已經通過手動編譯IR並將模塊鏈接到1來測試我的代碼,但理想情況下我想提供一個編譯器插件。 (我編輯了我的問題以使用正確的術語。) – dzan
完全有可能利用您的「外部」傳球來模擬LTO,但不是我認爲您希望的。您可以簡單地通過'-emit-llvm'來叮噹聲並輸出您現在可以手動操作的IR文件。這將允許您在合併代碼上使用'opt'運行您的傳球。 –
我知道這是可能的,但它不是我想要的。我必須與現有的構建過程兼容。我進一步詢問,顯然這是不可能的,可能一旦新的PassManager被設定爲默認值。即使如此,它仍然不適用於較老的工具鏈。 – dzan