LLVM 編譯器原理與實務

吳建明 吳一昊

  • 出版商: 機械工業
  • 出版日期: 2024-10-22
  • 定價: $834
  • 售價: 8.5$709
  • 語言: 簡體中文
  • 頁數: 472
  • 裝訂: 平裝
  • ISBN: 7111763548
  • ISBN-13: 9787111763543
  • 相關分類: Compiler
  • 下單後立即進貨 (約4週~6週)

買這商品的人也買了...

相關主題

商品描述

LLVM是伊利諾大學的一個研究項目,提供一個現代化的,
基於SSA的編譯策略,並且能夠同時支援靜態和動態的任意程式語言的編譯目標。 LLVM由不同的子專案組成,其中許多是正在生產中使用的商業和開源的專案。
它也被廣泛用於學術研究。
本書力求將LLVM基礎知識理論與案例實踐融合在一起進行詳細的介紹,幫助讀者理解LLVM工作原理,
同時依照應用與設備需要,使用 LLVM進行對應的最佳化與部署。
本書包含大量範例和程式碼片段,幫助讀者掌握LLVM的編譯器開發環境。
本書共11章,包括編譯與安裝LLVM、LLVM外部專案、LLVM編譯器、Clang前端基礎、Clang架構與實作範例、LLVM IR實作、
LLVM晶片編譯器實作範例、LLVM編譯器範例程式碼分析、LLVM最佳化範例、LLVM 後端實踐,以及MLIR編譯器。
本書適合演算法、軟體、編譯器、人工智慧、硬體等專業方向的企業工程技術人員、大學師生、研究工作人員和技術管理人員閱讀。

目錄大綱

前言
第1章 編譯和安裝LLVM/
1.1LLVM系統入門/
 1.1.1查看LLVM(包括Clang等子項目)/
 1.1.2配置和建置LLVM與Clang/
1.2獨立構建/
1.3軟硬體環境需求/
 1.3.1硬體環境/
 1.3.2軟體環境/
 1.3.3主機C 編譯器和標準函式庫/
 1.3.4取得流行主機C 工具鏈/
1.4LLVM入門/
 1.4.1術語和符號/
 1.4.2開啟LLVM存檔檔/
 1.4.3從Git中簽出LLVM原始碼/
 1.4.4本地LLVM配置/
 1.4.5編譯LLVM套件原始碼/
 1.4.6交叉編譯LLVM/
 1.4.7LLVM目標檔案的位置/
 1.4.8可選配置項目/
1.5目錄佈局/
1.6使用LLVM工具鏈的範例/
1.7LLVM常見問題/
1.8LLVM相關連結/
第2章 LLVM外部專案/
2.1LLDB調試器/
 2.1.1LLDB基礎知識/
 2.1.2LLDB控制台/
2.2C 標準庫libc /
 2.2.1libc 庫概述/
 2.2.2Ubuntu下安裝Clang和libc /
2.3compiler-rt運行時庫/
 2.3.1compiler-rt項目組成/
 2.3.2compiler-rt的作用/
 2.3.3平台支援/
 2.3.4compiler-rt原始碼結構/
 2.3.5建compiler-rt/
2.4DragonEgg /
 2.4.1DragonEgg將LLVM作為GCC後端/
 2.4.2DragonEgg實踐/
2.5建置RISC-V LLVM並編譯和運行test-suite/
 2.5.1建構RISC-V的前期準備/
 2.5.2開始建造/
 2.5.3編譯test-suite/
 2.5.4運行LLVM test-suite/
2.6Clang附加工具/
第3章 LLVM編譯器/
3.1LLVM與Clang原始碼的下載及編譯/
 3.1.1下載並編譯 LLVM/
 3.1.2Clang原始碼的下載與編譯/
3.2LLVM編譯器基礎架構/
 3.2.1LLVM工作原理/
 3.2.2LLVM的主要子項目/
 3.2.3LLVM與Clang語法/
3.3LLVM三段式編譯 /
 3.3.1傳統編譯器三段式設計及其實作/
 3.3.2LLVM的三段式設計的實現/
3.4LLVM與Clang架構/
 3.4.1LLVM與Clang架構簡介/
 3.4.2編譯架構特點分析/
3.5LLVM與GCC的差別/
3.6LLVM IR/
 3.6.1什麼是LLVM IR/
 3.6.2LLVM IR編譯流程/
 3.6.3如何得到IR/
 3.6.4IR文件連結/
 3.6.5IR檔編譯流程/
 3.6.6IR語法中的關鍵字/
3.7詞法分析與文法分析/
 3.7.1詞法分析/
 3.7.2AST結構分析/
3.8交叉編譯器/
 3.8.1主機與目標機/
 3.8.2為什麼要交叉編譯/
 3.8.3交叉編譯難點/
3.9後端開發/
 3.9.1XLA後端分析/
 3.9.2SSA問題分析/
 3.9.3目標資訊代碼分析/
3.10LLVM範例實踐/
 3.10.1如何在ARM上編譯LLVM/Clang/
 3.10.2如何寫LLVM Pass/
 3.10.3基於LLVM的依賴分析方案/
3.11LLVM資料並行、時間並行和多核心並行/
第4章 Clang前端基礎/
4.1編譯器Clang會代替GCC嗎/
 4.1.1GCC概述/
 4.1.2Clang概述/
 4.1.3GCC基本設計與範例/
 4.1.4GCC與Clang的差別/
4.2使用 Clang 靜態分析器進行分析除錯/
 4.2.1靜態分析器概述/
 4.2.2靜態分析器庫的結構/
 4.2.3靜態分析器工作原理/
 4.2.4內部檢查器/
 4.2.5關於 Clang 靜態分析器/
4.3如何進行編譯時間混編最佳化/
4.4Clang模組實現原理探究/
 4.4.1ModuleMap 與 Umbrella/
 4.4.2模組的建置/
 4.4.3Clang模組複用機制/
 4.4.4PCH與PCM檔/
4.5使用Clang校驗AST/
 4.5.1製作Clang命令列工具的初衷/
 4.5.2製作Clang命令列工具主要步驟/
 4.5.3環境搭建/
 4.5.4開發框架選擇/
 4.5.5程式碼開發/
4.6LLVM與Clang的底層原理/
 4.6.1傳統編譯器設計/
 4.6.2Clang前端/
 4.6.3IR的最佳化/
 4.6.4bitcode/
 4.6.5編譯流程總結範例/
4.7自訂Clang指令,利用LLVM Pass實現對Objective-C函數的靜態插樁/
 4.7.1Objective-C中的常見的函數hook實作思路/
 4.7.2什麼是LLVM Pass/
 4.7.3編譯過程/
4.8指令系統/
 4.8.1指令系統概述/
 4.8.2指令格式/
 4.8.3指令的尋址方式/
 4.8.4指令的類型與功能/
 4.8.5CISC和RISC的比較/
第5章 Clang架構與實踐範例/
5.1C語言編譯器Clang/
 5.1.1Clang和GCC編譯器架構/
 5.1.2Clang起源/
5.2Clang模組內部實作原理及原始碼分析/
 5.2.1編譯參數分析/
 5.2.2預處理/
5.3好用的程式碼檢查工具/
5.4Clang在Objective-C的使用/
 5.4.1終端使用特點/
 5.4.2Clang的簡單使用/
5.5Clang重排物件類別結構分析/
 5.5.1概述/
 5.5.2根類別、超類別、子類別/
5.6使用Clang編譯C程式並在安卓設備中執行/
5.7分析Swift高效的原因/
 5.7.1Swift的函數派發機制/
 5.7.2結構體定義的記憶體分配/
 5.7.3編譯SIL/
 5.7.4Clang編譯流程的缺點/
 5.7.5Swift的特點及其編譯器的使用流程/
5.8LLVM中矩陣的實現分析/
 5.8.1背景說明/
 5.8.2功能實現/
 5.8.3舉例說明/
第6章 LLVM IR實踐/
6.1LLVM架構簡介/
 6.1.1LLVM IR的演變/
 6.1.2LLVM IR是什麼/
 6.1.3LLVM架構/
 6.1.4前端產生中間代碼/
 6.1.5LLVM後端最佳化IR/
 6.1.6LLVM後端產生彙編程式碼/
6.2獲取LLVM IR/
 6.2.1LLVM IR的三種形式/
 6.2.2LLVM IR結構/
 6.2.3標識符與變數/
6.3LLVM IR實踐-Hello world/
 6.3.1LLVM IR程式設計方法概述/
 6.3.2最基本的程序/
 6.3.3基本概念解釋/
 6.3.4主程式/
6.4LLVM IR資料表示/
 6.4.1彙編層次的資料表示/
 6.4.2LLVM IR中的資料表示/
 6.4.3連結類型/
 6.4.4可見性/
 6.4.5寄存器/
6.5LLVM IR類型系統/
 6.5.1類型系統/
 6.5.2元資料型態/
 6.5.3屬性/
6.6LLVM IR控制語句/
 6.6.1彙編語言層面的控制語句/
 6.6.2LLVM IR層面的控制語句/
6.7LLVM IR語法連結類型/
6.8LLVM IR函數/
 6.8.1定義與聲明/
 6.8.2傳遞參數與獲得返回值/
 6.8.3內建函數、屬性和元資料/
6.9LLVM IR異常處理/
 6.9.1異常處理的要求/
 6.9.2LLVM IR的異常處理/
 6.9.3怎麼拋/
 6.9.4怎麼接/
第7章 LLVM晶片編譯器實作範例/
7.1編譯器基本概念/
 7.1.1LLVM的模組化編譯器框架/
 7.1.2前端在幹嘛/
 7.1.3後端在幹嘛/
 7.1.4DAG下譯/
 7.1.5DAG合法化/
 7.1.6小結/
7.2從無到有開發/
 7.2.1不必從頭開始開發/
 7.2.2需要新增的文件類型/
 7.2.3從文件角度看整體框架/
 7.2.4從類別繼承與派生角度看整體框架/
7.3晶片的整體架構部分/
 7.3.1×××.h類檔/
 7.3.2×××.td類檔/
 7.3.3×××TargetMachine.cpp和×××TargetMachine.h類別檔/
 7.3.4×××MCTargetDesc類檔案/
 7.3.5×××baseInfo類別檔/
 7.3.6×××TargetInfo類別檔案/
 7.3.7×××Subtarget類別檔案/
 7.3.8幾個容易混淆的概念/
 7.3.9小結/
7.4寄存器資訊/
 7.4.1×××Registerinfo.td類別檔案/
 7.4.2×××RegisterInfo類別檔/
 7.4.3×××SERegisterinfo類別文件/
7.5指令描述的.td檔/
 7.5.1×××InstrFormats.td類別檔案/
 7.5.2×××InstrInfo.td類別檔案/
 7.5.3依序定義指令/
 7.5.4定義指令的自動轉換/
 7.5.5小結/
7.6指令描述的.cpp檔/
 7.6.1×××InstrInfo.cpp(.h)類別檔/
 7.6.2×××SEInstrInfo.cpp(.h)類別檔/
 7.6.3×××AnalyzeImmediate.cpp(.h)類別檔案/
第8章 LLVM編譯器範例程式碼分析/
8.1建立編譯器的基礎架構/
8.2使用 LLVM 實作一個簡單編譯器/
 8.2.1目標/
 8.2.2詞法分析/
 8.2.3語法分析/
 8.2.4LLVM IR的程式碼產生/
 8.2.5優化器/
 8.2.6新增JIT編譯器/
 8.2.7靜態單一賦值/
 8.2.8控制流/
 8.2.9用戶自訂操作符/
 8.2.10可變變數/
第9章 LLVM最佳化範例/
9.1LLVM最佳化範例介紹/
 9.1.1編譯器最佳化目標/
 9.1.2LLVM優化Pass如何運作/
 9.1.3聚集物件的標量替換/
 9.1.4公共子表達式消除/
 9.1.5全域變數最佳化器 /
 9.1.6指令合併器/
9.2改進最佳化條件/
 9.2.1偏轉循環移動代碼/
 9.2.2運行規範化自然循環/
 9.2.3歸納變數簡化/
 9.2.4進行比特追蹤死代碼消除/
9.3連結時優化/
 9.3.1LTO基本概念/
 9.3.2LTO優化處理/
 9.3.3linkmap分析/
9.4Nutshell LLVM LTO/
 9.4.1ThinLTO/
 9.4.2高度並行的前端處理與初始最佳化/
9.5LLVM完全LTO/
 9.5.1LLVM完全LTO的目標/
 9.5.2LLD的整個執行流程/
9.6LLVM核心類別簡明範例/
第10章 LLVM後端實踐/
10.1LLVM後端概述/
 10.1.1LLVM後端基本概念/
 10.1.2使用Cpu0作為硬體的範例/
10.2LLVM新後端初始化和軟體編譯/
 10.2.1新後端初始化和軟體編譯/
 10.2.2LLVM 程式碼結構/
 10.2.3Cpu0後端初始化/
 10.2.4LLVM後端結構/
 10.2.5增加 AsmPrinter/
 10.2.6增加 DAGToDAGISel/
 10.2.7增加 Prologue和Epilogue 部分程式碼/
 10.2.8操作數模式/
 10.2.9小結/
10.3算術和邏輯運算指令/
 10.3.1算術運算指令/
 10.3.2邏輯運算指令/
10.4產生目標檔/
 10.4.1簡要說明/
 10.4.2檔新增/
 10.4.3文件修改/
 10.4.4檢驗成果/
10.5全域變數/
 10.5.1全域變數編譯選項/
 10.5.2代碼修改/
 10.5.3檢驗成果/
 10.5.4小結/
10.6更多資料類型/
 10.6.1實現類型/
 10.6.2代碼修改/
 10.6.3檢驗成果/
10.7控制流/
 10.7.1控制流語句/
 10.7.2消除無用的JMP指令/
 10.7.3填充跳轉延遲槽/
 10.7.4條件MOV指令/
10.8函數呼叫/
 10.8.1棧幀結構/
 10.8.2傳入參數/
 10.8.3函數呼叫最佳化/
10.9ELF文件支援/
 10.9.1ELF文件/
 10.9.2支持反彙編/
10.10彙編/
 10.10.1堆疊幀管理/
 10.10.2彙編器/
 10.10.3內聯彙編/
10.11使用仿真器驗證編譯器/
 10.11.1運行仿真器/
 10.11.2小結/
第11章 MLIR編譯器/
11.1MLIR語言參考/
 11.1.1高層結構/
 11.1.2MLIR符號/
 11.1.3MLIR作用域/
 11.1.4控制流和SSACFG作用域/
 11.1.5類型系統/
 11.1.6方言類型/
11.2MLIR方言及運行分析/
 11.2.1MLIR簡介/
 11.2.2常見的IR表示系統/
 11.2.3MLIR的提出/
11.3方言及運作詳解/
 11.3.1方言/
 11.3.2運行結構拆分/
 11.3.3創造新的方言操作/
 11.3.4將方言載入到 MLIRContext 中/
 11.3.5定義操作/
 11.3.6建立方言流程總結(使用ODS)/
11.4MLIR 運算與算子/
 11.4.1MLIR 運算與算子概論/
 11.4.2運算類(Operation)/
 11.4.3算子類(Op)/
 11.4.4MLIR OpBase.td算子類別的作用/
 11.4.5MLIR 運算的建置過程/
 11.4.6MLIR TableGen後端產生算子代碼/
11.5MLIR的緣起/
11.6MLIR部署/
 11.6.1MLIR部署流程/
 11.6.2MLIR應用程式/
11.7MLIR介紹/
11.8MLIR基本資料結構/
 11.8.1MLIR原始碼目錄/
 11.8.2MLIR簡易UML類別圖/
 11.8.3開發中用到的具體資料結構/
11.9MLIR的出現背景與提供的解決方案/
 11.9.1概述/
 11.9.2解決方案/
11.10機器學習編譯器:MLIR方言體系/
 11.10.1基礎組件/
 11.10.2方言體系/
參考文獻/