天天看點

LLVM每日談之十二 LLVM的源碼分析之Pass相關

題記:在學習LLVM的過程中,要想學的更加深入,掌握更多的技能,LLVM的源碼是必須要讀的,但是在這麼多的源碼中,從哪裡下手?很容易讓人找不到頭腦,本文這裡就先拿出幾個Pass相關的源碼檔案進行分析。

1.Pass.h

源碼中的位置:llvm源碼/include/llvm/Pass.h

此頭檔案的内容:此頭檔案主要對和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

此檔案主要是對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的資訊。

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

此頭檔案被包含在Pass.h這個頭檔案的尾部,是以如果檔案已經包含了Pass.h,其實就也可以通路PassAnalysisSupport.h。這個頭檔案之中,主要是AnalysisUsage和AlysisResolver兩個類的聲明以及Pass類的部分函數的實作。

其中,AnalysisUsage主要負責表示分析出來的使用資訊。

AlysisResolver是一個Pass對象用來從Pass Manager擷取所有的分析資訊的簡單接口。

另外,Pass類的函數getAnalysisIfAvailable()、getAnalysis()、getAnalysisID()這三個常用的函數,也都是在這個頭檔案中使用的。Pass之間的互動,是會經常用到這樣的函數的。

--------------------------------------------------------------------------轉載請注明出處---------------------------------------------------------------------------------------------