zoukankan      html  css  js  c++  java
  • 从OLLVM4.0.0升级到LLVM8.0.1,并且给LLVM增加Pass 插件系统

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

    上周日决定把手头的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的哪一个版本编译,插件同之。

  • 相关阅读:
    天网管理系统
    NSCTF web200
    程序逻辑问题
    Once More
    Guess Next Session
    上传绕过
    加了料的报错注入
    C++ GET UTF-8网页编码转换
    Android学习笔记函数
    C++ 模拟虚拟键盘按键表
  • 原文地址:https://www.cnblogs.com/suanguade/p/11415993.html
Copyright © 2011-2022 走看看