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 |