版本太低了,用得我这个揪心。

上周日决定把手头的ollvm从4.0.0升级到LLVM8.0.1。

里面的Pass的话,决定移植到8.0.1里面。

我习惯从代码上来动手

1:下载LLVM  https://github.com/llvm/llvm-project/releases/download/llvmorg-8.0.1/llvm-8.0.1.src.tar.xz

2:下载CLang  https://github.com/llvm/llvm-project/releases/download/llvmorg-8.0.1/cfe-8.0.1.src.tar.xz

之后两个都解压,

然后把clang解压后的目录放到llvm目录中tools目录下,之后可以用cmake直接创建vs2017的项目。

全程没有错误,创建好了项目之后,直接可以完整编译。

前面都简单,后面是移植pass 的问题。

我准备加点戏,由于Pass集成在 clang里面,这会导致出现一个问题,

即,clang太大,编译速度太慢,改一笔pass要折腾20分钟编译,费事。

所以我准备写一个插件系统,把所有pass都写成插件,

clang里面直接支持插件接口。

这样以后编译的时候只编译插件就好了。clang不需要编译了。

* 我也不知道我这编译器怎么回事,明明我没选rebuild,文件也没改,但是它就是要把所有project 都check一遍。

* 懒得管它。

写插件的问题是,clang里面的插件写到哪里。

实际上可以在LLVMipo 工程的同级目录创建插件接口工程,

ipo 工程实际上是 Pass 的总入口工程,内部包含了 PassManagerBuilder 文件,即 PassManagerBuilder.cpp,

所有Pass 都是在这里注册的,细节看我之前的文章。

插件接口工程创建完之后,把它加到ipo工程的依赖项里面,

然后定义好插件接口即可。我是这样定义的,

目前比较简单。

每个模块内部导出一个函数,

这个函数返回一个结构体数组的指针,结构体定义如下

很简单,里面就一个元素,是个函数指针来定义的一个pass 创建函数,超级简单。

接口这里解决了,但是启动参数怎么解决呢,好解决,我自己写了个简单的模板来解决这个问题

该怎么用还怎么用,反正也就这样了,呵呵呵呵呵。

使用方法也很简单

几乎不改变使用习惯,这就差不多了。

但是还有最后一个问题,就是,LLVM原生要求参数必须提前注册,否则会提示错误,如下

解决它俩,其实也好办,其实它俩不重要,重要的是,它俩的后面直接把进程exit(1)了,所以只要找到它俩的位置,然后把结束进程给退出了就可以了。

进程会继续执行,如果看这个错误不爽,也可以把它俩删除了。

这些都解决了之后,还有一个小问题,就是插件工程放到什么地方。

这个问题好解决,

可以在libclong 工程的同级目录创建工程,然后在这里写插件,即可。

至此,问题全部解决。

升级LLVM框架完成,之前老的ollvm 就不要了。

感觉算是一个简单的解决方案,问题也都完美地解决了。

好吧,其实解决方式也不是很完美,凌晨写的,现在来补全问题。

首先,第一个问题,就是,clang 自带参数检测系统已经被我们pass掉了,即便参数出错,也无法通过clang 来检测到了。

解决方案,其实说简单也简单,说难也很难,clang在全局变量构造里面,创建参数检测系统,那么也就是说,我们可以做一个独立的函数或者结构体,

然后创建一个全局变量,然后给它初始化,在初始化函数里面,读取本地配置文件,在配置文件中记录全局参数,然后动态生成、注册cl::opt,

这样实际上就已经解决了问题,如果可以这样的话,那么实际上clang自带的参数检测系统也可以不用修改了。

第二个问题,就是标准库的问题,由于clang里面大量使用了stl标准库,而且我们又启用了插件功能,

导致exe创建的标准库对象可能要给dll来用,这里隐含性地可能会导致标准库变量导致程序崩溃。

实际上,这样的问题,也好解决,就是只要保证clang和插件处在同一个编译环境下就可以了,

即clang使用VS的哪一个版本编译,插件同之。

从OLLVM4.0.0升级到LLVM8.0.1,并且给LLVM增加Pass 插件系统的更多相关文章

  1. Nuget包CommonServiceLocator从1.0.3升级到2.0.4时MvvmLight的ViewModelLocator初始化SimpleIoc.Default格式不匹配问题

    原文:Nuget包CommonServiceLocator从1.0.3升级到2.0.4时MvvmLight的ViewModelLocator初始化SimpleIoc.Default格式不匹配问题 把旧 ...

  2. 从mysql8.0.15升级到8.0.16

    从mysql8.0.15升级到8.0.16 环境简介 操作系统:Centos 6.10 64位 目前版本:8.0.15 MySQL Community Server 二进制 目的:升级为8.0.16 ...

  3. 【Oracle】RAC 10.2.0.1升级10.2.0.5

    环境: OS:OEL5.6 RAC:10.2.0.1.0 相关环境变量: CRS_HOME /u01/app/oracle/product/10.2.0/db_1 ORACLE_HOME   /u01 ...

  4. 安装zabbix3.0以及升级到5.0过程

    关闭防火墙: systemctl stop firewalld.service systemctl disable firewalld.service 需要关闭 selinux,一定要关闭这个,开启s ...

  5. WangSql 3.0源码共享(WangSql 1.0重大升级到3.0)

    WangSql 1.0博文阅读: http://www.cnblogs.com/deeround/p/6204610.html 基于1.0做了以下重大改动: 1.多数据实现方式调整 2.使用EmitM ...

  6. MVC3.0 项目升级到 MVC4.0

    按照 http://www.asp.net/whitepapers/mvc4-release-notes#_Toc303253806 的步骤 第一步:修改web.config 注意,默认的MVC3网站 ...

  7. Windows平台下面Oracle11.2.0.1 升级Oracle11.2.0.4 的简单步骤

    1. 首先查看数据库的版本: 2. ESXi 上面的虚拟机挂在 oracle11.2.0.4的 iso磁盘 3. 执行set 进行升级 4. 安装选项进行选择 升级现有的数据库 5. 注意安装位置必须 ...

  8. Windows 版本下 Oracle12.1.0.2 升级Oracle12.2.0.1的步骤

    oracle12.1.0.1 2013年发布的产品 2014年左右发布12.1.0.2 2016年底发布了 oracle12.2.0.1 经常有人会安装了最早的oracle版本,然后需要升级到最新的o ...

  9. [python]pip 版本9.0.1升级到10.0.1故障解决办法

    问题背景: 在做android自动化时使用到第三方库uiautomator时,提示要安装,但安装该uiautomator库时提示当前的pip版本偏低,需要安装10.0.1版本方可.但在升级到升级到该版 ...

随机推荐

  1. 关于微信小程序的一些总结

    mpvue? {{}} 在vue和小程序中的区别? 01 小程序中{{}}和vue中的{{}}用法基本一致,可以显示data中的数据,可以写表达式 不一样的地方? 01 小程序的{{}}可以写在属性中 ...

  2. vue,一路走来(7)--响应路由参数的变化

    今天描述的问题估计会有很多人也遇到过. vue-router多个路由地址绑定一个组件造成created不执行 也就是文档描述的,如下图 我的解决方案: created () { console.log ...

  3. linux篇之Nginx web服务器简单部署

    一.安装部署nginx 1. 部署前先对nginx介绍下别嫌BB: 如果你听说或使用过Apache软件,那么很快就会熟悉Nginx软件,与Apache软件类似, Nginx(“engine x”)是一 ...

  4. 初学Java 彩票

    import java.util.Scanner; public class Lottery { public static void main(String[] agrs) { ); Scanner ...

  5. 牛客小白月赛16 F 小石的妹子 (线段树)

    链接:https://ac.nowcoder.com/acm/contest/949/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  6. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  7. ZYNQ跑系统 系列(二) petalinux方式移植linux

    三.搭建petalinux工程 0.定位目录    先在shell中找一个准备存放工程的地方,(我的是home/hlf/PRO),命令行cd home/hlf/PRO 1.定位编译链    根据安装p ...

  8. springmvc中拦截器配置格式

    对于springmvc,有两种方式配置拦截器. 一是实现HandlerInterceptor接口,如 public class MyInterceptor1 implements HandlerInt ...

  9. Python3 使用HTMLTestRunner.py 报错ImportError: No module named 'StringIO'处理方法

    HTMLTestRunner.py文件是基于Python2的语法,python3使用需要修改语法: 1.>>> 94行 import io # import StringIO 2.& ...

  10. CSS基础知识复习

    1. CSS优先级 标签内部属性 style定义的CSS > 文档内定义的css > 引用外部CSS文件 2. CSS选择器类型 . 标签选择器 . 类选择器(使用.做标识) . ID选择 ...