做者:snsn1984 html
LLVM 的Pass框架是LLVM系統的一個很重要的部分。每一個Pass都是作優化或者轉變的工做,LLVM的優化和轉換工做就是由不少個Pass來一塊兒完成的。 架構
所 以按照個人理解,Pass就是LLVM系統轉化和優化的工做的一個節點,每一個節點作一些工做,這些工做加起來就構成了LLVM整個系統的優化和轉化。 Pass架構這麼作的話,可重用性很是好,你能夠選擇已有的一些Pass,本身去構建出本身想要的優化和轉化效果。而且本身也能夠從新寫Pass去作本身 想要的優化和轉變,由於每一個Pass均可以獨立存在,因此新建Pass並不用考慮LLVM以前的優化和轉化是怎麼作的,本身能夠只運行本身新建的 Pass,這樣能夠方便的實現本身想要的效果。 框架
Pass最初的例子就在:llvm源碼/lib/Transform/Hello/Hello.cpp。 函數
能夠採用命令 oop
$ opt -load ../../../Debug+Asserts/lib/Hello.so -hello < hello.bc > /dev/null 優化
去運行這個Pass,而且查看效果。 ui
../../../Debug+Asserts/lib/Hello.so 是so的目錄,在llvm3.1中,這個例子的名稱已經變成了LLVMHello.so. 存放在build目錄/Release+Asserts/lib目錄之下。若是編譯的時候是Debug模式,則是在build目錄/Debug+Asserts/lib目錄之下。 spa
-hello 是註冊的使用Pass的時候的參數。能夠在llvm源碼/lib/Transform/Hello/Hello.cpp中看到。 .net
hello.bc 是給Pass輸入的二進制文件,也就是Pass要處理的二進制文件。至於如何生成該文件(使用命令:clang -emit-llvm -c hello.c -o hello.bc, hello.c就是個輸出helloworld的簡單C語言程序),在llvm每日談之二 LLVM IR中有介紹,後續介紹clang的時候還會繼續介紹。
orm
全部的Pass都是繼承自Pass類的。 Pass類的API文檔地址:
http://llvm.org/docs/doxygen/html/classllvm_1_1Pass.html若是想仔細瞭解這個類的同窗能夠去這裏看下。這裏的函數都是能夠經過點擊跳轉到源碼中去的。
幾個經常使用的Pass類的子類:
The ImmutablePass class
The ModulePass class
The CallGraphSCCPass class
The FunctionPass class
The LoopPass class
The RegionPass class
The BasicBlockPass class
The MachineFunctionPass class
推薦文檔: http://llvm.org/docs/WritingAnLLVMPass.html該文檔是LLVM官方介紹Pass的文檔,英文的,英文不錯的同窗推薦直接看這個文檔。