文档章节

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

snsn1984
 snsn1984
发布于 2013/06/03 09:52
字数 1144
阅读 325
收藏 1

作者: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
此头文件被包含在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之间的交互,是会经常用到这样的函数的。

-------------------------------------------------------------------------- 转载请注明出处 ---------------------------------------------------------------------------------------------

© 著作权归作者所有

snsn1984
粉丝 94
博文 32
码字总数 45245
作品 0
长春
项目经理
私信 提问
LLVM每日谈之十三 使用LLVM自带的PASS

作者:snsn1984 PS:最近一段时间,投入在LLVM上的时间有些减少。差点把对它的研究断掉,今天开始继续。对LLVM的研究需要很长一段时间的坚持不懈才可以彻底搞明白。 前面已经介绍过如何写自己...

snsn1984
2013/06/13
216
0
llvm每日谈之四 Pass初探

作者:snsn1984 LLVM 的Pass框架是LLVM系统的一个很重要的部分。每个Pass都是做优化或者转变的工作,LLVM的优化和转换工作就是由很多个Pass来一起完成的。 所 以按照我的理解,Pass就是LLVM系...

snsn1984
2012/11/08
954
0
LLVM每日谈之九 谈LLVM的学习

作者:snsn1984 从接触LLVM编译器到现在,也有多半年时间了,在这多半年的时间里,也花了不少精力在上面。现在回过头来总结一下在LLVM的学习过程中的一些感悟。(注:这里对LLVM的学习,不是...

snsn1984
2013/02/28
523
1
LLVM每日谈之六 LLVM的源码结构

作者:snsn1984 这里简单介绍下LLVM的源码结构,让大家知道LLVM的每个文件夹都放的是什么内容。 参考文档: http://llvm.org/docs/GettingStarted.html#getting-started llvm/examples 这个目...

snsn1984
2012/11/11
854
2
七天LLVM零基础入门(Linux版本)------第七天

作者:snsn1984 这是这一次零基础入门的最后一天,这次的主要任务是实战一个Pass。 任务描述: 实现一个Pass,该Pass可以读取一个程序中所有的for循环的循环头的名字并输出。...

snsn1984
2013/02/28
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

Flink Graph生成及Hash生成分析

222

MrPei
5分钟前
1
0
[译]Android Activity 和 Fragment 状态保存与恢复的最佳实践

https://blog.csdn.net/growing_tree/article/details/53759564 https://blog.csdn.net/u013588712/article/details/54691791...

shzwork
5分钟前
1
0
调用第三方快递鸟物流单号查询接口API代码示例

最近进行网站后台开发,需要实现物流的即时查询,发现之前集成的 快递100物流查询 API ——【PHP 快递查询源码资源】 已经不能正常使用了; 为了方便以后的业务需求,经过比较,最后选择使用...

程序的小猿
12分钟前
2
0
java Poi 操作执行excel 文件中函数问题

poi 读取excel 文件,当excel 有函数时,poi直接读取返回的是excel 函数,并不能返回函数计算结果: 解决步骤: sheet.setForceFormulaRecalculation(true); 判断该列格式是否为...

早a
20分钟前
3
0
js模拟实现输入框input事件

直接修改value值是无法触发对应元素的事件的。 通过发送输入框input事件了, 可以触发。 这里简单封装了一个方法. window.inputValue = function (dom, st) { var evt = new InputEvent('i...

開援带碼
21分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部