日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LLVM每日谈之十二 LLVM的源码分析之Pass相关

發布時間:2023/12/9 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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相关的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。