LLVM编译器架构
LLVM編譯器架構
LLVM概述
LLVM項目是模塊化和可重用的編譯器及工具鏈技術的集合。盡管名稱如此,LLVM與傳統虛擬機關系不大。名稱“ LLVM”本身不是縮寫。它是項目的全名。
LLVM最初是伊利諾伊大學的一個研究項目,目的是提供一種基于SSA的現代編譯策略,該策略能夠支持任意編程語言的靜態和動態編譯。從那時起,LLVM逐漸發展成為一個由多個子項目組成的總體項目,其中許多子項目已用于各種商業和開源項目的產品中,并廣泛用于學術研究。LLVM項目中的代碼已根據“具有LLVM例外的Apache 2.0許可”獲得許可
LLVM的主要子項目是:
- 該LLVM內核庫提供一個現代化的源代碼與目標無關的優化,隨著代碼生成支持許多流行的CPU(以及一些不太常見的!),這些包都是圍繞著建立以及指定被稱為LLVM中間表示的代碼表示(“ LLVM IR”)。LLVM核心庫有充分的文檔記錄,特別容易發明自己的語言(或移植現有的編譯器)以將LLVM用作優化器和代碼生成器。
- Clang是“ LLVM本機” C / C ++ / Objective-C編譯器,旨在提供驚人的快速編譯,極其有用的錯誤和警告消息,并為構建出色的源代碼級工具提供平臺。該 Clang靜態分析器和clang-tidy工具,代碼自動發現錯誤,而且是那種可以使用clang前端的庫來解析C / C ++代碼生成工具的很好的例子。
- 該LLDB項目建立在由LLVM和Clang提供了極大的機調試庫。它使用Clang AST和表達式解析器,LLVM JIT,LLVM反匯編程序等,從而提供了一種“可行”的體驗。在加載符號時,它還比GDB速度更快,存儲效率更高。
- 在libc中++和libc ++ ABI項目提供了一個標準的conformant和高性能執行的C ++標準庫,包括C ++ 11和C ++ 14的全力支持。
- 當目標沒有簡短的本機指令序列來實現核心IR操作時,compiler-rt項目將對底層代碼生成器支持示例(例如__fixunsdfdi)和其他調用進行高度優化的實現。它還為動態測試工具(例如AddressSanitizer,ThreadSanitizer,MemorySanitizer和DataFlowSanitizer)提供了運行時runtime庫的實現 。
- 該MLIR子項目是一種新的方法來構建可重用和可擴展的編譯架構。MLIR旨在解決軟件碎片,改善異構硬件的編譯,顯著降低構建特定于域的編譯器的成本以及幫助將現有編譯器連接在一起的問題。
- 該OpenMP的子項目提供的OpenMP與在clang的OpenMP實現使用運行時間。
- 該polly工程實施緩存局部性優化,使用多面體模型套件以及自動并行和矢量化。
- 該libclc項目旨在實現的OpenCL標準庫。
- 該klee項目實現了“象征性的虛擬機”,它采用一個定理證明,試圖評估在努力發現問題和證明的功能性,通過程序中的所有動態路徑。Klee的一個主要功能是,它在檢測到錯誤時可以生成一個測試用例。
- 該LLD項目是一個新的鏈接。這是系統鏈接程序的直接替代,并且運行速度更快。
除了LLVM的官方子項目之外,還有許多其他項目將LLVM的組件用于各種任務。通過這些外部項目,可以使用LLVM來編譯Ruby,Python,Haskell,Rust,D,PHP,Pure,Lua和許多其它語言。LLVM的主要優勢在于它的多功能性,靈活性和可重用性,這就是為什么它被用于各種各樣的任務:從輕量級JIT編譯嵌入式語言(如Lua)到為大型超級電腦編譯Fortran代碼的原因。
LLVM擁有廣泛而友好的社區,這些社區對構建出色的低級工具感興趣。如果有興趣參與其中,那么最好的方法是瀏覽LLVM博客并注冊LLVM Developer郵件列表。有關如何發送補丁程序,獲取提交訪問權限以及版權和許可主題的信息,請參閱《 LLVM開發人員政策》。
總結
- 上一篇: 扩展LLVM:添加指令、内部函数、类型等
- 下一篇: Clang:LLVM的C语言家族前端