在2018年编写LLVM遍——前言

TL;DR:官方教程仍然奏效,但过时久矣

原文地址:https://medium.com/@mshockwave/writing-llvm-pass-in-2018-preface-6b90fa67ae82

作者:Bekket McClane

遵循官方教程,你已经写过一个HelloWorld遍……

现在你希望学习更多、看得更多……

因此你深入神奇的LLVM源代码树,为了理解如何用遍实现那些著名而强大的优化……

但奇怪的遍构造语法让人困惑,它和你刚学的教程一点都不像,也没有记录在官方网站的任何地方——这正是我几年前遇到的,当时我仍然是一个LLVM新手,我之前仅仅听说过LLVM遍。

作为LLVM里最重要的核心组件之一,Pass与PassManager系统的改进始于2014,起因于许多优化机会缺失的情形以及编译速度退化。旧的遍实现与新的遍实现并存,整个代码也开始反映这些改变。通过提供特殊的命令行选项,使用者转向新的遍管理者,同时旧的遍管理者仍然是缺省使用的。

不过,正如前言部分指出的,目前没有官方文档谈及这个革新。虽然新的遍管理者以及其文档越来越接近它们的发布日期,我仍然希望为那些热切想知道代码树里现在发生了什么的热心者写一篇简单的教程。我将这个系列分为四部分:

  1. 部分I(链接):以新的遍管理者风格编写新的HelloWorld遍。
  2. 部分II(链接):如何使用新的AnalysisManager来替换旧的getAnalysis<…>()语法。
  3. 部分III(链接):遍如何整合进LLVM源代码树。剧透:LLVM源代码树里的(旧的)遍要求一些额外的语法,这将告诉你如何做。我知道在一篇文章里谈论旧的遍管理者有点奇怪。但考虑到LLVM项目巨大的体量以及在业界广泛的应用,迁移绝对是需要时间的。因此只需把这部分视作对那些对源代码树的演进(in-tree development)感兴趣的人迟来的教程(事实上接近10年)。
  4. 部分IV(链接):我怎样添加一个clang选项来使用我构建在LLVM里酷酷的特性?好吧,这部分将告诉你如何做。尽管这看起来与前面关于新遍管理者的话题无关(be orthogonal to),它总是我的“应该被官方归档的教程/提示”之一。就是这样。

我将不会讨论设计细节,像与旧遍管理者相比,新遍管理者如何改进编译速度以及优化质量。新遍管理者演进由LLVM社区最好的开发者领导,在相关材料(比如LLVM开发者大会里的演讲)里你肯定听过他们的解释(而不是我的)。我将从一个遍管理者使用者的角度来通读这个故事,关注在中端(middle-end)的优化以及分析开发。因此,不会涉及后端。

另外,你总是应该检查LLVM邮件列表以及源代码里的注释。这些地方的信息可能是零散的,但它们总是最新的。

上一篇:c – LLVM,获取内部结构的偏移量


下一篇:c – 一切都很不稳定