2015-10-06 73 views

回答

0

我覺得這裏最有用的東西可能是理解代碼的狀態如何通行證運行,什麼是LTO期間。

首先,當編譯器運行優化通行證時,它們將作爲已添加到PassManager的集合完成。這意味着LLVM/Clang當通過類似-O3的東西時將創建一個PassManager的副本,並隨後爲其提供預期提供O3優化級別的通行證集。這與您在外部庫中所做的工作非常不同,後者必須手動提供,並且不能正常安裝到通道管道中。

然後我們在做LTO的時候就有了狀態。在鏈接時間優化期間,所有單個翻譯單元都已合併,現在只有一個Module。這意味着在每個函數上運行的優化將在代碼庫中的每個函數上運行。類似地,每個模塊優化將在完整的Module上運行,並因此提供程序間分析/優化。

如果您正在尋找使用模塊內通行證,那麼在LTO時間沒有理由這麼做,您可以簡單地製作一個ModulePass並在每個設備上運行該通行證。

+0

嗨,謝謝你的回覆!對不起,我錯誤地寫了'內部',但我的意思是'內部'。我確實需要一個完整的程序視圖,因爲我希望在不同的TU中一致地做一些事情,並且對代碼中聲明的內容而不是庫中的內容有明確的看法。 我真的認爲我需要一個LTO通道,我已經通過手動編譯IR並將模塊鏈接到1來測試我的代碼,但理想情況下我想提供一個編譯器插件。 (我編輯了我的問題以使用正確的術語。) – dzan

+0

完全有可能利用您的「外部」傳球來模擬LTO,但不是我認爲您希望的。您可以簡單地通過'-emit-llvm'來叮噹聲並輸出您現在可以手動操作的IR文件。這將允許您在合併代碼上使用'opt'運行您的傳球。 –

+0

我知道這是可能的,但它不是我想要的。我必須與現有的構建過程兼容。我進一步詢問,顯然這是不可能的,可能一旦新的PassManager被設定爲默認值。即使如此,它仍然不適用於較老的工具鏈。 – dzan