買這商品的人也買了...
-
$1,600$1,568 -
$550$523 -
$1,200$1,176 -
$5,900$5,605 -
$1,800The Garbage Collection Handbook: The Art of Automatic Memory Management (Hardcover)
-
$700$665 -
$650$553 -
$650$553 -
$950$751 -
$680$537 -
$414$393 -
$480$379 -
$490$417 -
$3,300$3,135 -
$690$538 -
$199有趣的二進制 (軟件安全與逆向分析)
-
$620$484 -
$594$564 -
$352自己動手構造編譯系統:編譯、彙編與鏈接
-
$500$395 -
$834$792
相關主題
商品描述
全書分為3篇。
第1篇介紹編譯器基礎知識,包括中間表示,重點介紹SSA、
數據流分析、支配、循環等知識,此外還介紹了LLVM的後端描述語言TableGen。
第二篇剖析分LLVM代碼生成,其中對代碼生成的每一步驟都有提及,著重介紹指令選擇、指令調度、寄存器分配和編譯優化。
同時還以BPF後端為例總結了如何基於LLVM開發一款新後端的編譯器。
第三篇附錄主要總結了LLVM代碼生成過程中使用的IR、
BPF指令集以及如何在Linux運行BPF應用,Pass和PassManager的運行機制等知識。
通過閱讀本書,讀者理解和掌握LLVM代碼生成過程,可以根據本書指導為基於LLVM開發一款新後端的編譯器。
同時本書還介紹了各種編譯過程中使用到的算法,讀者可以根據場景對算法進行增強從而達到性能優化目的。
目錄大綱
前言
第一部分 基礎知識
第1章 緒論2
1.1 LLVM設計思路分析3
1.2 LLVM主要子項目4
1.3 LLVM構建與調試5
1.4 LLVM在線工具7
1.5 本章小結9
第2章 IR基礎知識10
2.1 IR分類11
2.1.1 樹IR11
2.1.2 線性IR11
2.1.3 圖IR12
2.2 CFG的基本塊與構建14
2.2.1 基本塊14
2.2.2 構建CFG15
2.3 靜態單賦值15
2.3.1 基本概念16
2.3.2 SSA構造19
2.3.3 SSA析構19
2.3.4 SSA分類28
2.3.5 基本塊參數和Phi節點29
2.4 本章小結30
第3章 數據流分析基礎知識31
3.1 半格、格與不動點31
3.1.1 半格和偏序集31
3.1.2 格33
3.1.3 不動點34
3.2 數據流分析原理及描述35
3.2.1 數據流方程形式化描述36
3.2.2 數據流分析的理論描述40
3.3 數據流方程示例43
3.3.1 活躍變量43
3.3.2 到達定值45
3.3.3 常量傳播46
3.4 擴展閱讀:數據流的遍歷性能分析49
3.5 本章小結50
第4章 支配分析51
4.1 支配和逆支配51
4.1.1 支配和逆支配相關定義51
4.1.2 支配和逆支配含義解析53
4.2 支配樹和支配邊界的實現55
4.2.1 半支配節點及相關概念56
4.2.2 LT算法和Semi-NCA的差異57
4.2.3 支配邊界的實現58
4.3 擴展閱讀:支配樹相關小課堂58
4.3.1 支配樹構造算法及比較59
4.3.2 如何快速判斷任意兩個節點的支配關係60
4.4 本章小結62
第5章 循環基本知識63
5.1 自然循環64
5.2 LLVM的循環實現65
5.2.1 循環識別66
5.2.2 循環規範化67
5.3 本章小結71
第6章 TableGen介紹72
6.1 目標描述語言72
6.1.1 詞法72
6.1.2 語法74
6.2 TableGen工具鏈77
6.2.1 從TD定義到記錄78
6.2.2 從記錄到C 代碼81
6.3 擴展閱讀:如何在TD文件中定義匹配83
6.3.1 隱式定義匹配模板83
6.3.2 複雜匹配模板84
6.3.3 匹配規則支撐類86
6.4 本章小結86
第二部分 代碼生成
第7章 指令選擇91
7.1 指令選擇的處理流程92
7.2 SelectionDAGISel算法分析94
7.2.1 SDNode分類96
7.2.2 LLVM IR到SDNode的轉換98
7.2.3 SDNode合法化108
7.2.4 機器指令選擇117
7.2.5 從DAG輸出MIR123
7.3 快速指令選擇算法分析126
7.4 全域指令選擇算法原理與實現128
7.4.1 全域指令選擇的階段128
7.4.2 GMIR生成129
7.4.3 指令合法化133
7.4.4 寄存器類型選擇137
7.4.5 機器指令選擇141
7.4.6 合併優化143
7.5 本章小結146
第8章 指令調度147
8.1 LLVM指令調度149
8.1.1 指令調度算法150
8.1.2 拓撲排序算法151
8.2 Linearize調度器152
8.2.1 構造依賴圖153
8.2.2 對依賴圖進行調度153
8.3 Fast調度器156
8.3.1 Fast調度器實現157
8.3.2 物理寄存器依賴場景的處理158
8.3.3 示例分析162
8.4 BURR List調度器166
8.4.1 影響指令調度的關鍵因素166
8.4.2 指令優先級計算方法168
8.4.3 示例分析170
8.5 Source List調度器173
8.6 Hybrid List調度器174
8.7 Pre-RA-MISched調度器174
8.7.1 Pre-RA-MISched調度器實現174
8.7.2 調度區域的劃分175
8.7.3 影響Pre-RA-MISched調度器的關鍵因素175
8.7.4 MIR指令時延的計算175
8.7.5 寄存器壓力的計算177
8.7.6 示例分析181
8.8 Post-RA-TDList調度器186
8.8.1 Post-RA-TDList調度器實現186
8.8.2 示例分析186
8.9 Post-RA-MISched調度器189
8.10 循環調度190
8.10.1 循環調度算法實現190
8.10.2 示例分析194
8.11 擴展閱讀:調度算法的影響因素200
8.12 本章小結203
第9章 基於SSA形式的編譯優化204
9.1 前期尾代碼重複205
9.1.1 尾代碼重複原理205
9.1.2 尾代碼收益判斷207
9.1.3 執行尾代碼重複優化209
9.2 Phi優化212
9.3 棧著色213
9.4 棧槽分配217
9.5 死指令消除218
9.6 IPL優化之If-Conversion219
9.7 循環不變量外提224
9.8 公共子表達式消除224
9.9 代碼下沉227
9.10 窺孔優化228
9.11 本章小結231
第10章 寄存器分配232
10.1 寄存器分配流程解析233
10.1.1 Fast算法執行流程233
10.1.2 Basic算法執行流程233
10.2 寄存器分配涉及的Pass241
10.2.1 死亡和未定義子寄存器檢測241
10.2.2 隱式定義指令處理243
10.2.3 不可達MBB消除243
10.2.4 活躍變量分析244
10.2.5 Phi消除246
10.2.6 二地址指令變換249
10.2.7 指令編號255
10.2.8 變量活躍區間分析256
10.2.9 寄存器合併256
10.2.10 MBB的頻率分析259
10.2.11 寄存器分配:直接分配與間接分配265
10.2.12 將虛擬寄存器映射到物理寄存器266
10.2.13 棧槽著色266
10.2.14 複製傳播267
10.2.15 循環不變量外提269
10.3 Fast算法實現269
10.3.1 Fast算法實現思路269
10.3.2 示例分析270
10.4 Basic算法實現276
10.4.1 算法實現思路276
10.4.2 示例分析277
10.5 Greedy算法實現289
10.5.1 Greedy算法實現思路290
10.5.2 算法實現的核心:拆分291
10.5.3 區域拆分之Hopfield網絡詳解293
10.5.4 使用Hopfield網絡求解拆分296
10.5.5 示例分析300
10.6 PBQP算法實現313
10.6.1 PBQP介紹313
10.6.2 寄存器分配和PBQP的關係314
10.6.3 PBQP問題求解314
10.6.4 寄存器分配問題建模示例317
10.6.5 PBQP實現原理以及示例分析318
10.7 擴展閱讀:圖著色分配324
10.8 4種算法對比326
10.9 本章小結329
第11章 函數棧幀生成和非SSA形式的編譯優化330
11.1 函數棧幀生成以及相關優化331
11.1.1 棧幀生成331
11.1.2 代碼下沉332
11.1.3 棧幀範圍收縮335
11.2 MIR優化337
11.2.1 分支折疊337
11.2.2 尾代碼重複347
11.2.3 複製傳播347
11.3 MIR指令變換和調度347
11.4 MIR信息收集及佈局優化348
11.4.1 基本塊佈局優化349
11.4.2 公共代碼提取355
11.4.3 函數冷熱代碼分離359
11.4.4 代碼佈局優化比較363
11.5 擴展閱讀:後綴樹構造和應用365
11.5.1 後綴樹的構造365
11.5.2 後綴樹的應用372
11.6 本章小結372
第12章 生成機器碼373
12.1 MC374
12.2 機器碼生成過程375
12.2.1 彙編代碼生成376
12.2.2 二進制代碼生成378
12.3 本章小結381
第13章 添加一個新後端382
13.1 適配新後端的各個階段382
13.1.1 指令選擇階段的適配383
13.1.2 寄存器分配相關的適配383
13.1.3 插入前言/後序384
13.1.4 機器碼生成相關的適配384
13.2 添加新後端所需要的適配385
13.2.1 定義TD文件386
13.2.2 指令選擇處理386
13.2.3 棧幀處理387
13.2.4 機器碼生成處理388
13.2.5 添加新後端到LLVM框架中388
13.3 本章小結389
附錄
附錄A LLVM的中間表示392
附錄B BPF介紹407
附錄C Pass的分類與管理413