自己动手写LLVM pass(零)

您已经跟随着LLVM的官方教程完成了HelloWorld pass…..

现在,您想学的更多,看更多的代码,例子……

因此,您可以深入到无比优秀的LLVM源代码树,了解这些着名且功能强大的优化如何通过pass实现的…

但结果却是被异乎寻常的传递构造语法所迷惑,这种语法既不类似于你刚刚遵循的教程,也没有在官方网站的任何地方记录

这正是我几年前碰到的,当时,我还是一个LLVM新手和LLVM pass是我之前听到的唯一的事情。

作为LLVM中最重要的核心组件之一,Pass和PassManager系统的开发时间可以追溯到2014年,其原因是许多缺少优化机会的案例和编译速度回归。

整个代码库也开始通过并排放置旧的pass和new pass实现来反映这些变化。

用户可以通过提供特定的命令行选项切换到新的传递管理器,而旧的传递管理器仍然是默认值。

然而,正如前言部分所指出的那样,目前还没有关于这项创新的官方文件。

虽然作为新的传递管理器及其文档页面,他们的发货日期已经非常接近,但我仍然想为那些渴望了解源代码树中现在发生的事情的那些爱好者写一个简单的教程。

我把这个系列分为四个部分:

  1. 以新的传递管理器方式编写一个新的HelloWorld Pass;

  2. 如何使用新的AnalysisManager替换旧getAnalysis<...>()语法;

  3. 如何在LLVM源代码树中集成传递;

    LLVM源代码树内部的传递需要一些额外的语法,这篇文章将告诉你如何做。

    我知道在一篇名为new pass manager的有点奇怪的文章中谈论遗留传递管理器。但考虑到LLVM的庞大项目规模及其在行业中的广泛采用,移植肯定需要一些时间。因此,对于那些对树内开发感兴趣的人来说,只考虑这部分作为延迟(实际上近十年)的教程。

  4. “如何添加一个clang选项来使用我在LLVM中构建的酷炫功能?”。好吧,这部分会告诉你如何。虽然它似乎与之前文章中的新传递管理器主题正交,但它始终是我的“教程/提示应该正式记录”
    开始吧!

我不会谈论设计细节,比如新的Pass管理器与旧的Pass管理器相比如何提高编译速度和优化质量。新的Pass管理器革命由LLVM社区中的一些最好的开发人员领导,您应该在相关材料中听到他们的解释(而不是我的)(例如LLVM开发者会议中的会谈)。我将从一位专注于中端优化和分析开发的pass manager用户的角度来讲述这个故事。所以后端没有覆盖。

此外,您应该始终检查LLVM邮件列表和源代码中的注释。这些地方的信息可能分散,但它们总是最新的。