[分享] LLVM 專案結構指南 Part.II

看板CompilerDev作者 (夏克維夫)時間3年前 (2020/07/05 14:16), 編輯推噓5(503)
留言8則, 6人參與, 3年前最新討論串1/1
第二篇我們延續重要 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
之前用 OrcJIT 的時候發現 SectionMemoryManager 在處
07/05 14:54, 1F

07/05 14:54, 3年前 , 2F
理一堆小 Module 的時候會用蠻浪費的方式配置 Memory,
07/05 14:54, 2F

07/05 14:54, 3年前 , 3F
一直不太知道為什麼QQ
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
文章代碼(AID): #1V0N0xoL (CompilerDev)