llvm每日談之四 Pass初探

做者: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的文檔,英文的,英文不錯的同窗推薦直接看這個文檔。

相關文章
相關標籤/搜索