LLVM每日談之四 Pass初探
LLVM 的Pass框架是LLVM系統的一個很重要的部分。每個Pass都是做優化或者轉變的工作,LLVM的優化和轉換工作就是由很多個Pass來一起完成的。
所以按照我的理解,Pass就是LLVM系統轉化和優化的工作的一個節點,每個節點做一些工作,這些工作加起來就構成了LLVM整個系統的優化和轉化。Pass架構這麼做的話,可重用性非常好,你可以選擇已有的一些Pass,自己去構建出自己想要的優化和轉化效果。並且自己也可以重新寫Pass去做自己想要的優化和轉變,因為每個Pass都可以獨立存在,所以新建Pass並不用考慮LLVM之前的優化和轉化是怎麼做的,自己可以只運行自己新建的Pass,這樣可以方便的實現自己想要的效果。
Pass最初的例子就在:llvm源碼/lib/Transform/Hello/Hello.cpp。
可以採用命令
$ opt -load ../../../Debug+Asserts/lib/Hello.so -hello < hello.bc > /dev/null
去運行這個Pass,並且查看效果。
../../../Debug+Asserts/lib/Hello.so是so的目錄,在llvm3.1中,這個例子的名稱已經變成了LLVMHello.so. 存放在build目錄/Release+Asserts/lib目錄之下。如果編譯的時候是Debug模式,則是在build目錄/Debug+Asserts/lib目錄之下。
-hello 是註冊的使用Pass的時候的參數。可以在llvm源碼/lib/Transform/Hello/Hello.cpp中看到。
hello.bc 是給Pass輸入的二進位文件,也就是Pass要處理的二進位文件。至於如何生成該文件(使用命令:clang -emit-llvm -c hello.c -o hello.bc, hello.c就是個輸出helloworld的簡單C語言程序),在llvm每日談之二 LLVM IR中有介紹,後續介紹clang的時候還會繼續介紹。
所有的Pass都是繼承自Pass類的。Pass類的API文檔地址:
llvm::Pass Class Reference如果想仔細了解這個類的同學可以去這裡看下。這裡的函數都是可以通過點擊跳轉到源碼中去的。
幾個常用的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的文檔,英文的,英文不錯的同學推薦直接看這個文檔。n
2012年11月8日
推薦閱讀:
※LLVM每日談之十五 LLVM自帶的examples
※誰說不能與龍一起跳舞:Clang / LLVM (3)
※LLVM中如何獲取程序的控制流圖CFG?
※llvm memcpy的本質?
TAG:LLVM | Clang | ChrisLattner |