LLVM Pass之間的依賴關(guān)系是由PassManager進行管理控制的。由它來控制并管理pass之間的交互與操作阱飘。如果pass之間存在依賴關(guān)系流礁,例如在執(zhí)行本pass之前必須先執(zhí)行哪些pass,這個是必須要先在本pass中聲明的。要聲明pass的依賴妹蔽,需要實現(xiàn)getAnalusisUsage
方法椎眯。
getAnalysisUsage
方法
virtual void getAnalysisUsage(AnalysisUsage &Info) const;
在此方法中,要聲明依賴的pass是填充在AnalysisUsage這個對象中的胳岂,具體方法如下:
AnalysisUsage::addRequired<>
AnalysisUsage::addRequiredTransitive<>
如果本pass執(zhí)行之前需要依賴其它pass的執(zhí)行编整,那么可以使用這兩種方法中的一種來添加需要執(zhí)行的pass。對于單個pass使用AnalysisUsage::addRequired<>
添加。
若所需要先執(zhí)行的pass過多形成Analysis鏈步悠,則使用第二種方法:addRequiredTransitive<>
添加所有的pass旅择。
考慮另外一種情況,當某一個pass經(jīng)常會被用到時汞斧,我們希望它的結(jié)果可以暫時保存避免經(jīng)常重復進行計算,那么就需要使用下面的方法:
AnalysisUsage::addPreserved<>
它用來暫時保存某個pass的結(jié)果什燕。
getAnalysisUsage
代碼示例
//保留了CFG粘勒,但是改變了程序代碼,即必須等LoopInfoWrapperPass執(zhí)行后才會執(zhí)行本pass
void LICM::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesCFG();
AU.addRequired<LoopInfoWrapperPass>();
}
getAnalysis<> and getAnalysisIfAvailable<>
方法
Pass::getAnalysis<>
方法提供了一種訪問依賴pass的方式,它使用一些簡單的模板參數(shù)來標志對應的pass里的class屎即,它返回了訪問這些class的接口:
bool LICM::runOnFunction(Function &F) {
LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
//...
}
這個方法返回的是LoopInfoWrapperPass
對應的getLoopInfo
方法的接口庙睡,不過在這之前事富,你需要將LoopInfoWrapperPass
聲明為一個addRequired Pass。
module級的pass可以返回一個函數(shù)級的接口:
bool ModuleLevelPass::runOnModule(Module &M) {
//...
DominatorTree &DT = getAnalysis<DominatorTree>(Func);
//...
}
在上面的例子中乘陪,runOnFunction
和DominatorTree
由passmanager調(diào)用并返回接口給當前的pass统台。
詳細參考