作者mshockwave (夏克维夫)
看板CompilerDev
标题[分享] LLVM 专案结构指南 Part.I
时间Mon Jun 29 03:05:29 2020
LLVM大概是现在最受产业界以及学术界欢迎的编译器框架之一了
很可惜的由於贡献与参与的人数以接近指数倍的速度增长 专案本身结构的复杂度
也逐年增高,这边就来提供一个简单的专案结构导览。
你主要可以学到两个重点:
- 常见的元件(e.g.优化演算法、register allocator)可以在哪边找到?
- LLVM命名以及安排资料夹的习惯是什麽
(这边只涵盖LLVM,其他子专案例如Clang,碍於篇幅以及笔者也不怎麽熟悉,就留到
未来再说吧)
Top Level Strucutre (llvm-project/llvm)
有几个资料夹是一定要知道的
/lib: LLVM 最大的优点之一就是模组化:所有的功能与演算法都被包成个别
的函式库,使用者只需挑选他们需要的函式库就可以了。而这个资料夹底下放的就是所有
LLVM的演算法。从非常专门的编译器演算法(e.g. instruction selection),到非常通用
、可以给其他子专案用的的功能(e.g. FileSystem API)。等一下会就个别的子资料夹
进行介绍
/include: 所有的标头档都放在这儿。这底下还有两个资料夹、llvm和llvm-c
,分别是 C++ 和 C API。LLVM 的API介面稳定性以及相容性(compability)一直都是个
有点大的问题,主要是因为核心成员希望整个计画在开发上能够越灵活越好、必然的结果
就是API interface会变化的非常快,导致其他使用者(downstream user)苦不堪言。目前
一个暂时的解决办法就是不保证 C++ API 的稳定性、只维护 C API 的相容性,所以才会
有两套 API 系统。(其实LLVM不只API,ABI介面的稳定性也是个长年困扰大家的问题
,但那又是另外一个故事了)
/test 与 /unittests: 前者是 regression test,後者是 unit tests 的资
料夹。Regression test 又昵称 IR test,因为里面大部分的测试输入档都是
textual IR。仍会叫 regression test 是因为那些 test case 大多源自於 bug。
Regression test是用一套叫做 llvm-lit 的 test runner 来跑的(以及一些附注工具
像是 FileCheck)。llvm-lit 还有 FileCheck 个人认为神好用,而且非常容易用在一般
的专案里面,有机会可以写一篇专门的文章。笔者认为这两个资料夹很重要的原因在於
很多时候如果不知道某个元件的行为或用法(e.g. 不知道对应Pass的CLI option 怎麽下)
可以直接去查阅这些 test,还蛮实用的。
/tools: 只要是使用 LLVM libraries 的 command line tools 基本上都放
这边。例如大家所熟知的 opt 和 llc,虽然这些 tools 原始码量都不多、毕竟主要功能
都放在 library 里面,但有些时候特定的功能,例如某个 CLI option,其实是放在这里
。Clang 以前也是放在 tools 资料夹底下,但现在已经移到llvm-project最上层了
LLVM Libraries (llvm-project/llvm/lib)
这边也是挑几个重要的资料夹来讲。大部分元件的标头档都会放在 include/llvm 里
对应的资料夹、因此除非有特例要不然就不多赘述:
/IR: 顾名思义这个资料夹放的就是所有的 IR 实作。但其实还不止那些,
其他重要的元件包括新的 PassManager(如大家所知,LLVM 目前已经快要完成迁移
到新的 PassManager,因此旧的 PassManager 现在已经改名为
IR/LegacyPassManager.cpp,而且将在不久之後完全移除),还有一些 "builder",例如
比较多人所熟知的 IRBuilder 以及 debug info builder (DIBuilder)
/Passes: 承接上方关於新的PassManager的话题,这个资料夹放的是其他
有关(新版)Pass的元件,例如 PassBuilder 以及 PassRegistry.def。前者很重要是因为
很多时候你会想知道、例如 -O3 到底跑了哪些 Pass,这里就可以给你一些指引。後者
则是新 PassManager 特有的东西,基本上就是新版的Pass注册表。
/Transforms: 所有IR层级(也就是 target-independent)的优化演算法。
底下的资料夹简介如下:
-
/InstCombine: 就是LLVM的 peephole optimization。老实讲我还真的
不知到为啥最初不要命名成 peephole。
-
/Vectorize: 顾名思义就是放所有关於 vectorize 的演算法。小弟在这
方面没有研究得很透彻,但基本上目前 LLVM 使用两大 vectorize 演算法:SLP 和
VPlan。SLP算是蛮经典的,没记错的话GCC也有,VPlan 则是比较新。
-
/IPO: 所有的 inter-procedure 优化演算法。
-
/Scalar: 基本上所有非前述类别的演算法都丢在这边XDD (包括loop相关)
所以要找某个演算法就先从这个资料夹开始找吧。
其他蛮重要的还有 /Utils,放了很多超级实用的小功能、像是切割 basic block、还有
把特定一群的 basic block 抓出来变成独立的函式。
=============
本篇就先到这边吧,下一篇会涵盖剩下的 /lib 重要子资料夹(e.g. CodeGen, Analysis)
。还有其他实用的 utilities (e.g. include/llvm/ADT)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 169.234.228.195 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/CompilerDev/M.1593371133.A.EA4.html
1F:推 sonicyang: 好文推 06/29 18:36
2F:推 frank030310: 感谢分享 让我更了解llvm的架构 06/30 19:55
3F:推 jerry0715no1: 感谢大神分享好文 07/01 12:51
4F:推 Dracarys: 感谢分享 07/01 21:14
5F:推 kishow01: 推推分享 07/02 04:40
6F:推 SMMIT: 推分享 07/03 21:49
7F:推 poolongkong: 感谢分享 顺便勘误一下,InstCombine的不知"到" 07/09 21:31
8F:推 JameC: 推,受益良多 07/10 20:51
9F:推 unimaybe: 用心,推推!! 06/26 03:56
10F:推 eopXD: 推好文~~ 07/11 19:39