LLVM思想與功能綜述

findumars發表於2013-09-07

llvm似乎還有一個奇怪的優化方法:llvm(low level virtual machine)本身就是一種抽象的、虛擬的計算機架構,其特性介於RISC和CISC之間,llvm會先將程式碼編譯為llvm架構的位元組碼(這裡還是說說資料吧,從其官方資料來看,生成的位元組碼略多於x86的目的碼而少於SPARC的目的碼),然後可以對位元組碼進行JIT優化然後再翻譯為目標架構的二進位制程式碼。另外,llvm實際上採用的是一種全生命週期(lifelong)的優化策略(雖然還是很偏重靜態優化),最直接的體現就是比起gcc能做到的 -O3,llvm可以做到 -O4,而且 -O4採用的是LLVMgold.so所提供的執行時庫。llvm本身的設計思想就是希望做到編譯時、連結時、執行時、空閒時的全方位優化。關於這些優化,在llvm官網可以找到,請移步http://llvm.org/pubs/2004-01-30-CGO-LLVM.html。

最後來說一下llvm和gcc的相容性,我前面只是說了llvm的後端相容gcc的前端生成的AST,其實llvm對gcc的相容性是很高的,我現在系統的環境變數CC設定的就是clang,我編譯了很多工程都不用改Makefile就可以成功編譯,不過很多工程裡只是採用的 -O2,讓我略不爽,所以我就手動將之改為 -O4,當然也就需要修改一下CFLAGS和LDFLAGS,為之加上llvm-config的輸出。llvm本身在指令碼上就設計為和gcc的相容,所以改換編譯鏈十分容易。

參考:
http://www.cnblogs.com/FreeBirdLjj/p/3270457.html
http://www.drdobbs.com/architecture-and-design/the-design-of-llvm/240001128
http://blog.csdn.net/michael_kang/article/details/6098839

編譯MIPS:
http://elinux.org/images/a/a8/Lopes-LLVM.pdf
http://docs.huihoo.com/llvm/WritingAnLLVMBackend.html

相關文章