做者:snsn1984 html
題記:在學習LLVM的過程當中,要想學的更加深刻,掌握更多的技能,LLVM的源碼是必需要讀的,可是在這麼多的源碼中,從哪裏下手?很容易讓人找不到頭腦,本文這裏就先拿出幾個Pass相關的源碼文件進行分析。 數據庫
1.Pass.h
源碼中的位置:llvm源碼/include/llvm/Pass.h
網絡上位置:
http://llvm.org/docs/doxygen/html/Pass_8h_source.html
此頭文件的內容:此頭文件主要對和Pass相關的幾個類進行了聲明。主要有Pass、ModulePass、ImmutablePass、 FunctionPass、BasicBlockPass這幾個類。以前在關於Pass的博文裏也介紹過一些和Pass相關的知識,而這幾個類正是 LLVM的Pass框架所最經常使用的幾個類,在Pass的編寫或者修改的工做中,基本上都是在和這幾個類打交道,因此對於這幾個類要想有一個深的瞭解,這個 頭文件是必須讀的。
ModulePass、ImmutablePass、FunctionPass、BasicBlockPass這幾個類都是Pass的子類,也 是在寫Pass的時候最容易直接用到的類。本身編寫LLVM的Pass的時候,使用的最可能是FunctionPass和ModulePass這兩個。而這 兩個之中,FunctionPass要使用的比ModulePass更爲多一點,由於若是不刪除函數,通常都是處理函數內部的信息,那麼使用 FunctionPass就能夠了。其實根據本人的經驗,還有一種狀況是須要使用ModulePass的,那就是在須要處理MetaData的時候,這種 狀況之下也會用到ModulePass的,由於Metadata是在函數以外的。
2.Pass.cpp
源碼中的位置:llvm源碼/lib/VMCore/Pass.cpp
網絡上的位置:
http://llvm.org/docs/doxygen/html/Pass_8cpp_source.html
此文件主要是對Pass.h中聲明的幾個類的實現。除此以外,還有對RegisterAGBase、PassRegistrationListener、 AnalysisUsage這三個類的實現。而這三個類的生命並不在剛纔介紹的Pass.h之中,而是另有別的頭文件,此處先不作介紹。
3.PassSupport.h
源碼中的位置:llvm源碼/include/llvm/PassSupport.h
此頭文件被包含在Pass.h這個頭文件之中,因此若是文件已經包含了Pass.h,其實就也能夠訪問PassSupport.h。這個文件中主要是 PassInfo、RegisterPass、RegisterAGBase、RegisterAnalysisGroup、 PassRegistrationListener這幾個類的聲明。
PassInfo類的每個對象都對應着一個實際存在的Pass,而且保存着這個Pass的信息。
RegisterPass這個類是一個模板類,這個模板類的類型就是Pass的名字。它是PassInfo的子類,主要用來註冊Pass。完成註冊以後, 在PassManager管理的內部數據庫裏才能找到這個Pass。須要注意的是,這個模板類的使用必須是在全局範圍以內的。能夠從最簡單的Pass例子 --Hello(
http://llvm.org/docs/doxygen/html/Hello_8cpp_source.html)中去看這個模板類的使用方法。
RegisterAGBase是RegisterAnalysisGroup類的基類,而RegisterAGBase類又是PassInfo類的子類。 其中RegisterAGBase類名字中的AG就是AnalysisGroup的縮寫,這種命名方式在LLVM的源碼中被大量的應用,好比 MetaData在一些類的名字裏就被縮寫爲MD。RegisterAnalysisGroup這個類的做用主要是將一個Pass註冊成爲一個分析組的成 員,固然在進行此操做以前,這個Pass必須被首先註冊Pass成功。一個Pass能夠被註冊到多個分析組中。同一個Pass在多個分析組中,依然是根據 這個Pass的名字進行標識的。
PassRegistrationListener這個類主要負責在運行時時候Pass的註冊與否,而且會在Pass被load和remove的時候,去調用回調函數。
4. PassAnalysisSupport.h
源碼中的位置:llvm源碼/include/llvm/PassAnalysisSupport.h
網絡上的位置:
http://llvm.org/docs/doxygen/html/PassAnalysisSupport_8h_source.html
此頭文件被包含在Pass.h這個頭文件的尾部,因此若是文件已經包含了Pass.h,其實就也能夠訪問PassAnalysisSupport.h。這 個頭文件之中,主要是AnalysisUsage和AlysisResolver兩個類的聲明以及Pass類的部分函數的實現。
其中,AnalysisUsage主要負責表示分析出來的使用信息。
AlysisResolver是一個Pass對象用來從Pass Manager獲取全部的分析信息的簡單接口。
另外,Pass類的函數getAnalysisIfAvailable()、getAnalysis()、getAnalysisID()這三個經常使用的函數,也都是在這個頭文件中使用的。Pass之間的交互,是會常常用到這樣的函數的。 網絡
-------------------------------------------------------------------------- 轉載請註明出處 ---------------------------------------------------------------------------------------------