作者: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相关相关推荐

  1. LLVM每日谈之四十五 LLVM IR TUTORIAL

    今年的LLVM欧洲开发者会议上,在Tutorials环节,Vince Bridgers (Intel Corporation), Felipe de Azevedo Piovezan (Intel C ...

  2. LLVM每日谈之三十四 LLVM IR生成和转换的几条指令

    本文将罗列几条关于LLVM IR生成和转换的几条指令,并没有技术含量可言,只是让刚接触LLVM IR的同学,有一个检索和参考作用.文中min.c作为输入. min.c int min(int a , ...

  3. Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树

    Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 文章目录 Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 0x00 摘要 0x01 背景概念 1.1 词向量 ...

  4. C#调用obs studio 二次开发 源码分析 编译

    C#二次开发obs studio obs studio二次开发视频教程,录制.推流.调整分辨率.调整位置.画面回调.推流回调等功能 obs二次开发还是比较繁琐的,我在学习的时候也是很痛苦,有需要的朋友 ...

  5. Linux驱动学习--HDMI开发(二)HDMI驱动源码分析(RK平台)

    目录 一.引言 二.驱动框架 ------> dts节点 ------> HDMI DDC 驱动 ------> HDMI HDCP驱动 ------> HDMI CEC驱动 ...

  6. Java源码详解二:HashMap源码分析--openjdk java 11源码

    文章目录 HashMap.java介绍 1.HashMap的get和put操作平均时间复杂度和最坏时间复杂度 2.为什么链表长度超过8才转换为红黑树 3.红黑树中的节点如何排序 本系列是Java详解, ...

  7. 聊聊高并发(四十)解析java.util.concurrent各个组件(十六) ThreadPoolExecutor源码分析

    ThreadPoolExecutor是Executor执行框架最重要的一个实现类,提供了线程池管理和任务管理是两个最基本的能力.这篇通过分析ThreadPoolExecutor的源码来看看如何设计和实 ...

  8. 人脸检测(十)--强分类器源码分析

    原文: http://blog.csdn.net/beerbuddys/article/details/40712957 下面的内容很长,倒杯水(有茶或者咖啡更好),带上耳机,准备就绪再往下看.下面我 ...

  9. 流量回放repeater的原理分析二:repeater源码分析

    前言 在上文中我们分析了sandbox-jvm(以下简称sandbox)的核心源码,了解了sandbox实现类增强的原理.并且了解了sandbox的模块化加载能力,repeater作为一个独立的模块, ...

最新文章

  1. 休斯顿大学研究人员构建具有神经功能的软体机器人
  2. 10行代码实现目标检测
  3. 退出系统并跳转到登录界面 JS代码
  4. 警告:攻击者利用 SonarQube 漏洞盗取国内多个机构的大量源码!
  5. 前端进阶之 let、const、var
  6. tensorflow 风格迁移
  7. JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症
  8. 124. Binary Tree Maximum Path Sum 二叉树中的最大路径和
  9. HTML网页使用CDN的jquery.qrcode.min.js生成页面二维码(直接可以复制使用)
  10. python 哪些项目_哪些Python开源项目比较好
  11. 自然语言处理与中文分词的难点总结--学习笔记
  12. 不同系统可以用一个数据库服务器吗,同一个数据库 不同服务器吗
  13. anaconda+python3.7安装keras_win10 python3.7 Anaconda3 安装tensorflow+Keras
  14. poj 1269 题解
  15. STM32与FPGA Cyclone IV芯片fsmc通信
  16. Mysql 之 缓存更新策略
  17. Udp数据接收和发送代码
  18. 仿京东淘宝商品详情页中视频和图片的轮播功能
  19. 京东智臻链首推电子营业执照区块链应用场景落地!
  20. 协整检验——进出口与经济增长

热门文章

  1. json转成类对象转成xml全过程
  2. Redis 3.0.1 安装和配置
  3. html5 的百度地图连接
  4. 九度 1209:最小邮票数(多重背包)
  5. ReadDirectoryChangesW 函数
  6. Firefox 5 公开测试下载
  7. PAZU 是4Fang 为配合“四方在线”软件于2004年开发的WEB打印控件,适用于各种WEB软件项目的打印。...
  8. Cisco路由器故障诊断技术(3)
  9. python对象引用计数器_在Python中借助计数器对象对项目进行计数
  10. 在Python中有效使用JSON的4个技巧