LLVM每日谈之十二 LLVM的源码分析之Pass相关
生活随笔
收集整理的這篇文章主要介紹了
LLVM每日谈之十二 LLVM的源码分析之Pass相关
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:snsn1984
題記:在學習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
網絡上的位置:http://llvm.org/docs/doxygen/html/PassSupport_8h_source.html此頭文件被包含在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之間的交互,是會經常用到這樣的函數的。
--------------------------------------------------------------------------轉載請注明出處---------------------------------------------------------------------------------------------
轉載于:https://www.cnblogs.com/ainima/archive/2013/03/18/6331980.html
總結
以上是生活随笔為你收集整理的LLVM每日谈之十二 LLVM的源码分析之Pass相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个Demo让你掌握Android所有控
- 下一篇: StringUtil工具类之去除所有的空