LLVM 編譯器實戰教程

(巴西)布魯諾·卡多索·洛佩斯(Bruno Cardoso Lopes),(巴西)拉斐爾·奧勒(Rafael Auler)著

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

商品描述

LLVM是一個正在發展中的前沿編譯器技術框架,它易於擴展並設計成多個庫,可以為編譯器入門者提供流暢的體驗,並能使編譯器開發所涉及的學習過程變得非常順暢。本書首先介紹如何配置、構建和安裝LLVM庫、工具和外部項目,隨後介紹LLVM設計以及它在每個LLVM編譯器階段的實際工作方式,這些階段包括:前端、IR、後端、JIT引擎、交叉編譯功能和插件接口。本書還提供了多個實際操作的範例和源代碼片段,可以幫助讀者堅實而順利地掌握LLVM編譯器開發環境的入門知識。

作者簡介

[巴西]布魯諾·卡多索·洛佩斯(Bruno Cardoso Lopes)拉斐爾·奧勒(Rafael Auler)著:布魯諾·卡多索·洛佩斯(Bruno Cardoso Lopes)在巴西坎皮納斯大學獲得計算機科學博士學位。自2007年以來,他一直是LLVM的貢獻者,從頭開始實現MIPS後端,並且已經維護了幾年。另外,他還編寫了x86 AVX支持方案,並改進了ARM彙編器。他的研究興趣包括代碼壓縮技術和對ISA進行位寬壓縮。之前他還開發了Linux和FreeBSD操作系統的驅動程序。

拉斐爾·奧勒(Rafael Auler)是巴西坎皮納斯大學的博士生,並擁有該大學計算機科學碩士學位和計算機工程學士學位。在作為碩士生期間,他編寫了一個可以根據體系結構描述文件自動生成LLVM後端的概念驗證工具。目前,他的博士研究課題包括動態二進制翻譯、即時編譯器和計算機體系結構。Rafael還是微軟研究院2013年研究生研究獎學金獲得者。

目錄大綱

出版者的話
譯者序
前言
關於作者
關於審稿人
第1章構建和安裝LLVM 1 
1.1了解LLVM版本1 
1.2獲取預構建包2 
1.2.1獲取官方預構建二進製文件2 
1.2.2使用軟件包管理器3 
1.3從源代碼構建4 
1.3.1系統要求4 
1.3.2獲取源代碼4 
1.3.3構建和安裝LLVM 5 
1.3.4 Windows和Microsoft Visual Studio 10 
1.3.5 Mac OS X和Xcode 12 
1.4總結14 
第2章外部項目15 
2.1 Clang外部項目介紹15 
2.1.1構建和安裝Clang外部工具16
2.1.2理解Compiler-RT 17 
2.1.3實驗Compiler-RT 17 
2.2使用DragonEgg插件18 
2.2.1構建DragonEgg 19 
2.2.2使用DragonEgg和LLVM工具了解編譯流程19 
2.2.3理解LLVM測試套件20 
2.2.4使用LLDB 21 
2.2.5 libc++標準庫介紹23 
2.3總結25 
第3章工具和設計26 
3.1 LLVM的基本設計原理及其歷史26 
3.2理解目前的LLVM 27 
3.3與編譯器驅動程序交互29 
3.4使用獨立工具30 
3.5深入LLVM內部設計33 
3.5.1了解LLVM的基本庫33 
3.5.2介紹LLVM的C++慣例34 
3.5.3演示可插拔的流程接口37 
3.6編寫你的第一個LLVM項目38 
3.6.1編寫Makefile 38 
3.6.2編寫代碼40 
3.7關於LLVM源代碼的一般建議41 
3.7.1將代碼理解為文檔42 
3.7.2請求社區的幫助42
3.7.3應對更新:使用SVN日誌作為文檔42 
3.7.4結束語44 
3.8總結44 
第4章前端45 
4.1 Clang簡介45 
4.1.1前端操作46 
4.1.2庫47 
4.1.3理解Clang診斷49 
4.2 Clang前端階段介紹52 
4.2.1詞法分析52 
4.2.2語法分析58 
4.2.3語義分析63 
4.2.4生成LLVM IR代碼65 
4.3完整的例子65 
4.4總結68 
第5章LLVM中間表示69 
5.1概述69 
5.2操作IR格式的基本工具示例71 
5.3 LLVM IR語法介紹71 
5.4編寫自定義的LLVM IR生成器76 
5.4.1構建和運行IR生成器79 
5.4.2使用C++後端編寫代碼來生成IR構造80 
5.5在IR層執行優化80 
5.5.1編譯時優化和鏈接時優化80 
5.5.2發現最佳編譯器流程82 
5.5.3流程間的依賴關係83 
5.5.4了解流程API 85
5.5.5自定義流程85 
5.6總結89 
第6章後端90 
6.1概述90 
6.2後端代碼結構介紹92 
6.3後端庫介紹93 
6.4如何使用TableGen實現LLVM後端94 
6.4.1 TableGen語言95 
6.4.2代碼生成器.td文件介紹96 
6.5指令選擇階段介紹100 
6.5.1 SelectionDAG類100 
6.5.2降級102 
6.5.3 DAG合併以及合法化103 
6.5.4 DAG到DAG指令選擇104 
6.5.5指令選擇過程可視化107 
6.5.6快速指令選擇107 
6.6調度器107 
6.6.1指令執行進程表108 
6.6.2競爭檢測109 
6.6.3調度單元109 
6.7機器指令109 
6.8寄存器分配110 
6.8.1寄存器合併器111 
6.8.2虛擬寄存器重寫114 
6.8.3編譯目標的信息115 
6.9前序代碼和結束代碼116 
6.10機器代碼框架介紹116
6.10.1 MC指令116 
6.10.2代碼輸出117 
6.11自定義機器流程119 
6.12總結121 
第7章即時編譯器122 
7.1 LLVM JIT引擎的基礎知識介紹122 
7.1.1介紹執行引擎123 
7.1.2內存管理124 
7.2 llvm::JIT框架介紹124 
7.2.1將二進制大對象寫入內存125 
7.2.2使用JITMemoryManager 125 
7.2.3目標代碼輸出器125 
7.2.4目標信息127 
7.2.5學習如何使用JIT類127 
7.3 llvm ::MCJIT框架介紹131 
7.3.1 MCJIT引擎131 
7.3.2 MCJIT中模塊編譯過程132 
7.3.3使用MCJIT引擎135 
7.4使用LLVM JIT編譯工具137 
7.4.1使用lli工具137 
7.4.2使用llvm-rtdyld工具138 
7.5其他資源139 
7.6總結139 
第8章跨平台編譯140 
8.1 GCC和LLVM對比140
8.2目標三元組介紹141 
8.3準備自己的工具鏈142 
8.3.1標準C/C++庫143 
8.3.2運行時庫143 
8.3.3彙編器和鏈接器144 
8.3.4 Clang前端144 
8.4用Clang命令行參數進行交叉編譯145 
8.4.1針對目標的驅動程序選項145 
8.4.2依賴包145 
8.4.3交叉編譯146 
8.4.4更改系統根目錄148 
8.5生成Clang交叉編譯器149 
8.5.1配置選項149 
8.5. 2構建和安裝基於Clang的交叉編譯器149 
8.5.3其他構建方法150 
8.6測試151 
8.6.1開發板151 
8.6.2模擬器151 
8.7其他資源152 
8.8總結152 
第9章Clang靜態分析器153 
9.1靜態分析器的作用153 
9.1.1傳統警告信息和Clang靜態分析器比較153 
9.1.2符號執行引擎的高效性156 
9.2測試靜態分析器158 
9.2.1使用驅動程序與使用編譯器158
9.2.2了解可用的檢查器158 
9.2.3在Xcode IDE中使用靜態分析器160 
9.2.4生成HTML格式的圖形
9.2.5處理大型項目161 
9.3使用自定義的檢查器擴展靜態分析器164 
9.3. 1熟悉項目架構164 
9.3.2自定義檢查器165 
9.4其他資源173 
9.5總結174 
第10章基於LibTooling的Clang工具175 
10.1生成編譯命令數據庫175 
10.2 clang-tidy工具176 
10.3代碼重構工具178 
10.3.1 Clang Modernizer(代碼轉換器) 178 
10.3.2 Clang Apply Replacements(替換執行器) 178 
10.3.3 ClangFormat (格式化工具) 180 
10.3.4 Modularize(模塊化工具) 181 
10.3.5 Module Map Checker(模塊映射檢查器) 187 
10.3.6 PPTrace(追踪工具) 187 
10.3.7 Clang Query(查詢工具) 189 
10.3.8 Clang Check(檢查工具) 190
10.3.9 remove-cstr-calls(調用移除工具) 190 
10.4編寫自己的工具190 
10.4.1問題定義:編寫一個C++代碼重構工具191 
10.4.2配置源代碼位置191 
10.4.3剖析工具的模板代碼192 
10.4.4使用AST匹配器195 
10.4.5編寫回調函數199 
10.4.6測試編寫的重構工具200 
10.5其他資源201 
10.6總結201 
索引202