作者mshockwave (夏克维夫)
看板CompilerDev
标题[分享] LLVM 专案结构指南 Part.II
时间Sun Jul 5 14:16:23 2020
第二篇我们延续重要 LLVM Libraries (e.g. llvm/lib/*) 元件介绍:
/Analysis: 这个大概是LLVM数一数二重要的元件之一。就如大家所知道的
compiler optimizations 往往需要大量的资讯:从最简单的 dominator tree 到复杂的
alias analysis。全部都放在这个资料夹里面。LLVM 的 Analysis 几乎跟一般 Pass
无异,最大的差别莫过於不能修改输入的 IR unit,同时也有着颇为复杂的invalidation
机制 (当某个 IR unit 被更动後,那些 analysis 不受影响,哪些又要重新计算)
/Support 与 llvm/include/llvm/ADT: 两者为一堆极为实用的 utilities
集合。ADT 就如他们名字(Abstract Data Structure)所示,放的大多是资料结构,
尤其是针对少量资料优化的资料结构,例如大家最耳熟能详的 SmallVector,或是一些
非常针对 compiler 所设计的资料结构,例如 IntervalMap (用在 register allocation
上)。Support 就比较通用一点,包含像是跨平台的 thread 函式库、跨平台的
FileSystem,或是Graphviz DOT的小工具。个人强料推荐以下两种情况之前,先看看看
这两个地方有没有你想要用的东西:
1. 想使用 standard library 的资料结构之前
2. 想写自己的 helper library,甚至用外部的 utility library(像是 Boost)之前
关於第一点,并不是说 standard library 不好,而是就如前面所解释的,ADT有很多
针对特殊情况优化的资料结构。至於什麽时候该用 standard library 什麽时候要用 ADT
,官方网站的 Programmer Manual (
http://llvm.org/docs/ProgrammersManual.html)
有非常详尽的解说与指引,我个人工作的时候基本上都把那个页面开在旁边。
/CodeGen: 这边放的就是所有真正 "backend" 做 code generation 的元件。
LLVM 将所有硬体特定实作全丢到 /Target,所以这边放的其实是 target-independent
、使用 /Target 传来的资讯来做 code generation。这边列出重要的子元件分别放在
哪儿:
1. Register Allocation:
RegAlloc*.cpp
2. Instruction Scheduling:
ScheduleDAG*.cpp, MachineScheduler.cpp
3. Instruction Selection 的故事就长了,因为这个部分也有新旧版本:旧的是基於
SelectionDAG 的实作(
/SelectionDAG 资料夹),新的则是叫做 GlobalISel
(
/GlobalISel 资料夹)。新的 GlobalISel 目标是更快的速度以及提供更好的测试
环境 (SelectionDAG 在测试的时候只能整个当黑箱一起测,GlobalISel 可以切成
好几个部分分别测试)
/Target: 每个硬体架构在这边都有专门的一个资料夹,描述的就是硬体专有的讯息。
除了大家大概都知道的指令集格式外,其实还有很多重要的讯息,
例如 Calling Convention, Stack Frame 长什麽样子, 或是 scheduling 的限制。
/MC: CodeGen 最後会生出目标架构的 assembly code。在古早以前,LLVM
接下来会呼叫外部的 assembler,例如 NASM 或者 GNU AS,将这些 assembly 组译成
object code,然後再呼叫外部的 linker,例如最经典的 BFD linker,把这些 object
files 组合成最终想要的档案 (i.e. executable or libraries)。LLVM 现在都有自己的
assembler 和 linker 了,其中 assembler 部分就是这个 MC layer (linker 就是 LLD)
。笔者对 MC layer 没有很透彻的研究,但基本上他有很多资讯也是来自於各别硬体
於 /Target 底下的实作。
/ExecutionEngine: 这个资料夹放的包括最为人所知的 JIT Engine。目前 LLVM
已经从旧的 MCJIT (/MCJIT) 转换成新版的 OrcJIT (/Orc)。OrcJIT 有非常多的优点,
包括更小的编译单位以及更为模组化的设计,让客制化 JIT Engine 变得更简单也
更有弹性。
====
以上就是所有我个人认为重要的 LLVM 元件的简介
当然也欢迎大家补充!:)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 169.234.228.195 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/CompilerDev/M.1593929787.A.C95.html
1F:→ Lipraxde: 之前用 OrcJIT 的时候发现 SectionMemoryManager 在处 07/05 14:54
2F:→ Lipraxde: 理一堆小 Module 的时候会用蛮浪费的方式配置 Memory, 07/05 14:54
3F:→ Lipraxde: 一直不太知道为什麽QQ 07/05 14:54
4F:推 JameC: 推推,受益无穷 07/10 20:56
5F:推 jerry0715no1: 推 感谢说明 07/11 06:46
6F:推 ChampYen: 推! 07/12 20:22
7F:推 NCTUcs: 推 07/13 13:13
8F:推 Dracarys: 推 07/21 17:49
9F:推 unimaybe: 推推,感谢分享!!((是说中间的"强料建议"打错了XD 06/26 04:00