编写自定义的LLVM Pass

今晚反思了一下,自己最近看的东西太发散了,只有一个模糊的主题——LLVM,然后看了很多作者的一系列文章,但是这些文章比较多而杂,大多数都是一个系列,且较为发散,近来又喜欢发现一个作者便将该作者的一系列文章进行阅读,然后其中引用了另一个作者的文章,又要读一大箩筐,这样铺的太开而没有线,今后还是以一个较为固定且细致的主题发布博文,这样也方便读者查找和掌握重点,用到的资料以链接的形式附在文中,如果某天的资料没有看完,仍可以将链接附在文中,以飨读者。
本文主要是阅读LLVM的文档,LLVM的UserGuide里面有两篇Writing an LLVM Pass,二者的区别是前者是LLVM旧的PassManager,后者是NewPassManager,这一点从链接也可以看出,本文研读的是后者。

Unlike passes under the legacy pass manager where the pass interface is defined via inheritance, passes under the new pass manager rely on concept-based polymorphism, meaning there is no explicit interface (see comments in PassManager.h for more details)
新的PassManager不是基于继承体系的,而是依赖基于概念的多态。
All LLVM passes inherit from the CRTP mix-in PassInfoMixin. The pass should have a run() method which returns a PreservedAnalyses and takes in some unit of IR along with an analysis manager. For example, a function pass would have a PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); method.
新的PassManager的run函数,返回值统一为PreservedAnalyses,两个参数分别为IR单元(例如Instruction, BasicBlock, Function)和一个AnalysisManager。

还是遇到了这个问题,即没有使用源码编译的Debug方法配置环境,很多文件不存在源码,如果仅仅是想测试一下自己编写的Pass,并不需要注册到LLVM中成为一个pass,仍然可以使用之前提及的方式使用Pass。

编译LLVM

之前曾尝试过通过镜像(例如清华的镜像源)安装LLVM,当时的考虑是直接拉取LLVM的代码库速度太慢,且不方便更新,于是在网络上查找,找到了此方法。但这种方法并不方便代码的更新,毕竟是通过镜像源的方法,所以存在更新延迟的问题。
这次通过LLVM的官方教程重新尝试编译LLVM,主要动机就是上文提到的LLVM官方教程里的很多内容都是通过编译安装的方式才有的。官方教程的链接在此,可以跟着尝试,除了第一部分和第二部分的内容,其他的部分基本和安装无关。

  1. 首先可以使用以下命令下载LLVM源码,笔者亲自尝试后发现这种方法下载速度非常快。
git clone --depth 1 https://github.com/llvm/llvm-project.git

也可以配置只下载main分支。

  1. 构建LLVM。
cd llvm-project
cmake -S llvm -B build -G  [options]

上面的Generator,官方提供了很多选择,如果是在Ubuntu下面,可以安装Ninja,在apt中的名字是ninja-build。这种生成器也是很多LLVM开发人员使用的。options里面注意设成Debug。把相关原文附在下面。
-DCMAKE_BUILD_TYPE=type — Controls optimization level and debug information of the build. Valid options for type are Debug, Release, RelWithDebInfo, and MinSizeRel. For more detailed information see CMAKE_BUILD_TYPE.

提供一个可用的编译命令

cmake -S llvm -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
ninja -C build -j 8

-j后面的参数可以根据CPU的核数设置。
时间会比较长,要耐心等待一下。
找到一篇相类似的文章,但是check-all部分大可不必了。

这次给我的一个感受就是有官方文档的情况下要尽量阅读官方文档,并不是说所有博客都是错误的,主要是官方文档可以及时更新而其他文章不能及时有效的更新。

编译LLVM失败了,我的电脑是16GB内存,疑似是内存容量不足。只能切换机器再尝试了。

你可能感兴趣的:(编程语言,学习,LLVM,编译器)