2014-03-05 88 views
1

我很好奇:在進程間數據流分析期間,IR的內存管理現狀是什麼。我想知道在分析過程中完整代碼的IR駐留在內存中,或者在任何時刻應用一些內存管理技術來加載和卸載IR。 在llvm/gcc基礎架構的情況下,如何將任何分析擴展爲數百行代碼。靜態分析中的中間表示(IR)內存管理

回答

0

對於整個程序來說,保留IR是有問題的。目前的技術水平是gold linker,它負責在GCC和LLVM中實現整個程序優化。 Its early whole-program optimization design draft是我發現它是如何工作的最好的說明,但當然有很多已經自2007年以來

一般的改變,但有三個階段:

  1. 每個編譯單元編譯和優化分開成一個目標文件*。這裏的優化可以包括進程間優化,但是這些優化不會跨越編譯單元邊界。

  2. 鏈接器分析所有的目標文件併爲整個程序建立一個控制流圖。這是內存密集型的,但易於管理 - 在這裏不需要全功能代碼。然後決定鏈接器應該執行哪些轉換。

  3. 鏈接器執行步驟(2)中決定的轉換。其中每一個都是本地化的,因此只需要加載整個程序代碼的有限子集。

步驟(1)和(3)由許多可以並行執行的任務組成。

*在編譯器IR上使用常規對象文件時,可以實現更好的優化。在GCC中,它通過在目標文件中嵌入IR來工作;在LLVM中,它僅通過將LLVM IR文件作爲目標文件提供給鏈接器來工作。在這兩種情況下,這都是通過使用插件連接器來實​​現的。

+0

謝謝你的回答。根據我所研究的關於該主題的最新技術狀態,通過聚類和分區可創建至少一百萬行代碼的調用圖。問題仍然沒有得到解決,那麼是否仍然需要一個框架,可以通過IR的prpoer管理算法執行更復雜的過程間數據流分析,或者在文獻中存在這樣的信息。 – user3382041