LLVM 後端開發 (1)

官方文件
https://llvm.org/docs/WritingAnLLVMBackend.html

簡單說明一下LLVM的架構
前端為不同的語言,如c, c++, ….
中間層為IR語言,以傳統compiler來說就是各個系統的組合語言(x86, ARM…等)
後端就是將IR語言再轉換成各個系統的組合語言,最後輸出成各平台可執行的執行檔

個人理解是這樣做有什麼好處呢?
第一,前端語言已經有人開發好,不用再自行開發,可以直接套用
第二,轉換成IR語言後,可一併處理最佳化的部份,以往最複雜的就是前端語言轉成組語後的最佳化處理
第三,維護時只需專心維護後端部份,熟悉建構流程後,加入新平台時,也很快速,大大縮短開發時間。

底下就當作自己的學習,從官網上一步步往下看
說明手冊一開始有說到,在開始前可能要先看過底下這些文件,對相關的東西先有個大致上的瞭解
1. LLVM Language Reference Manual
介紹LLVM的組合語言,也是蠻大一篇的
2. The LLVM Target-Independent Code Generator
介紹怎麼將LLVM的IR語言轉成對應的平台機械碼的元件(相關的class及轉code演算法)
其中比較需要注意的是指令集的選擇、最佳化、暫存器的配置、後期的最佳化及最後轉出code的部份。
3. TableGen
介紹特別檔案*.tb檔,裡面記錄要開發的平台所需要相關資訊,如暫存器的資訊、指令集的資訊…等。
4. Writing an LLVM Pass
最後是撰寫自己的Pass

基本的開發流程說明
1. 建立TargetMachine的子類別
此類別是用來描述你自己的機器平台

2-1. 用TableGen建立RegisterInfo.td
用來描述機器平台的暫存器,如對暫存器的定義、對齊方式及類別…等。
2-2. 也同時需要針對TargetRegisterInfo的子類別撰寫一些程式碼
主要是用於處理讀取td檔後,暫存器位址及相互關係的處理

3-1. 用TableGen建立TargetInstrFormats.td及TargetInstrInfo.td
用來描述機器平台的指令集
3-2. 針對TargetInstInfo的子類別撰寫相對應的程式碼

4. 用來說明怎麼從IR語言轉至目標平台語言
4-1. 用TableGen在TargetInstrInfo.td內建立一些符合條件的pattern及指令的選擇。
4-2. 撰寫XXXISelDAGToDAG.cpp檔案,其中XXX是自訂的平台名稱
主要是用來執行pattern的匹配和DAG-2-DAG指令的選擇
4-3 撰寫XXXISelLowering.cpp檔案
用來替換或移除SelectionDAG不支援的操作及資料型別

5. 撰寫assembly printer程式碼,用來轉換LLVM IR至目標平台的GAS format。
5-1. 同樣在TargetInstrInfo.td內建立組語字串
5-2. 在AsmPrinter及TargetAsmInfo的子類別撰寫相關程式碼

6. 可做可不做的部份,子平台的定義。
可在TargetSubtarget的子類別內做相關程式碼的撰寫,在compiler時,可用-mcpu=或-mattr=的參數來選擇要跑什麼平台。

7. 可做可不做的部份,加入支援JIT的部份。

先這樣,之後再來慢慢往下k….

發佈留言