[分享] LLVM 專案結構指南 Part.II
第二篇我們延續重要 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://www.ptt.cc/bbs/CompilerDev/M.1593929787.A.C95.html
→
07/05 14:54,
3年前
, 1F
07/05 14:54, 1F
→
07/05 14:54,
3年前
, 2F
07/05 14:54, 2F
→
07/05 14:54,
3年前
, 3F
07/05 14:54, 3F
推
07/10 20:56,
3年前
, 4F
07/10 20:56, 4F
推
07/11 06:46,
3年前
, 5F
07/11 06:46, 5F
推
07/12 20:22,
3年前
, 6F
07/12 20:22, 6F
推
07/13 13:13,
3年前
, 7F
07/13 13:13, 7F
推
07/21 17:49,
3年前
, 8F
07/21 17:49, 8F