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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[机器学习笔记]Note12--降维

继续是机器学习课程的笔记,本节介绍的是降维方法,这也是非监督学习中的一个问题,主要介绍主要成分分析(Principal Component Analysis,PCA)算法。 降维 动机一:数据压缩 使用降维的一个原因是…

jetty java 实例_Maven+Jetty+Servlet 简单示例

一个朋友让我帮他写一个基于 Servlet JettyDerby 实现的项目。本文先介绍 MavenJettyServlet 的整合例子。1、添加依赖pom.xml 里添加依赖javax.servletjavax.servlet-api3.1.0org.eclipse.jetty9.4.14.v20181114jetty-webapp2、准备两个 Servlet 例子HelloServletpackage com.…

节后的人才市场开始活跃了?

今天居然接到一个印度打来的电话,一印度MM操着纯正的印度英语居然说是从Linkedin上找到我的,希望我能参加他们杭州公司的面试,费了很大的劲也没让她弄明白我不愿意relocate。 只能说节后的人才市场就像快烧开的水,分子们开始活跃了…

mysql 静态表 是不是 myisam_mysql的静态表和动态表的区别,MyISAM和InnoDB的区别

静态表字段长度固定,自动填充,读写速度很快,便于缓存和修复,但比较占硬盘,动态表是字段长度不固定,节省硬盘,但更复杂,容易产生碎片,速度慢,出问题后不容易重…

[机器学习笔记]Note13--异常检测

继续是机器学习课程的笔记,本节课内容是异常检测,它是一个非监督学习算法,用于发现可能不应该属于一个已定义的组中的数据。 密度估计 首先是给出一个例子,如下图所示,是一个测试飞机引擎的例子,给定数据…

html5新增元素

一、HTML5新增结构元素 之前,我们只能用万能的div标签,并为其设置不同的id如header, footer, sidebar等来分别表达头部,底部或者侧栏等。而现在代码编写者不再需要为id的命名费尽心思,对于手机、阅读器等设备更有语义的好处。 HTM…

python 代码转程序_精悍的Python代码段-转

1 文件处理readlines() 和 writelines()方法可以讲列表元素依次写到文件中;file类本身没有提供复制方法,可以使用read()和write()方法模拟实现文件的拷贝,也可以使用shutil模块:shutil.copyfile(hello.txt,hello2.txt)shutil.move…

[机器学习笔记]Note14--推荐系统

继续是机器学习课程的笔记,本节课将介绍推荐系统的内容。 问题形式化 推荐系统是机器学习的一个非常重要的应用,在很多音乐、购物等网站都有推荐系统,如豆瓣,淘宝,网易云音乐等都是有使用到推荐系统的,因…

手机应用开发的方式不能完全套用到iPad上

对于一些复杂的游戏,许多人已经不能满足于手机小巧的屏幕,大屏的画面感就成为许多人选择平板电脑的重要因素。当越来越多的80后开始为人父母,孩子们从大人手中得到的礼物,也不再局限于零食、玩具和游乐场入场券。随着智能手机的普…

java面向对象编程思想_Java面向对象编程思想

面向对象三个特征:封装、继承、多态封装:语法:属性私有化(private)、提供相对应的get/set 的方法进行访问(public)、在set/get的方法中对属性的数据 做相对应的业务逻辑的判断思想:封装外面的程序不能直接访问本类的属性&#xff…

[机器学习笔记]Note15--大规模机器学习

继续是机器学习课程的笔记,本节内容主要是介绍大规模机器学习的内容。 大型数据集的学习 对于一个过拟合的模型,增加数据集的规模可以帮助避免过拟合,并获得一个更好的结果。 但是对于一个大规模的数据,比如有100万个数据量的训…

Linux管道和重定向 ---多命令协作

管道及重定向就是Linux多命令协作的基础机制Linux的Shell对数据流进行以下分类定义:   stdin 标准输入 编号为:0 默认:键盘  stdout 标准输出 编号为:1 默认:终端  stderr 标准错误 编号为&…

java 骰子_基本随机滚动骰子Java

5 个答案:答案 0 :(得分:12)Random.nextInt()具有不可预测的行为 - 它可以为整数生成所有可能的值,包括负数。改为使用Random.nextInt(numSides) - 它将从[0,numSides]返回一个整数,即包括0并排除numSides。要获得所需的功能[1&am…

[机器学习笔记]Note16--应用示例:图像文字识别

继续是机器学习课程的笔记,本节课是最后一节内容了,主要是介绍一个应该–图中文字的识别。 问题描述和流程图 图像文字识别应用就是从给定的图片中识别文字。这比从一份扫描文档中识别文字要复杂得多。一个例子图片如下所示: 为了完成这样的…

java中文处理_Java的中文乱码处理

1,设置编译器的编码(Eclipse)、Window >preferences>Workspace> Text file encoding下的Other设置为UTF-8设置jsp页面的编码(Eclipse)Window >preferences>Web> JSPFile>Encoding设置为UTF-82.从前端获取的数据乱码(1)request.setCharacterEnc…