目次
はしがき
第1章 はじめに
1.1 本書の構成
1.2 この本で何ができるようになるの?
1.3 本書の目的とターゲット層
1.4 本書を読むにあたって必要となるもの
1.4.1 必須なもの
1.4.2 あった方がよいもの
1.5 本書内の記載について
1.6 お断り
第2章 コンパイラとLLVM
2.1 一般的なコンパイラのお話
2.2 LLVMプロジェクト
2.2.1 LLVMのサブプロジェクト
2.2.2 LLVM Core
2.2.3 Clang
2.2.4 LLDB
2.2.5 libc++
2.2.6 compiler-rt
第3章 環境構築
3.1 本章の概要と構成
3.2 環境
3.3 インストール
3.3.1 ビルドに必要なパッケージのインストール
3.3.2 LLVMのビルド/インストール
3.3.3 パスの設定
3.4 ツールの種類と確認
3.4.1 Clang
3.4.2 lli
3.4.3 llvm-as
3.4.4 llc
3.4.5 opt
3.4.6 llvm-link
3.4.7 llvm-objdump
3.4.8 llvm-config
第4章 LLVM IR
4.1 本章の概要と目的
4.2 LLVM IRの特徴
4.3 LLVM IRの構成
4.4 LLVMの型とLLVMアセンブリの主な命令
4.4.1 型分類
4.4.2 終端命令
4.4.3 二項演算子
4.4.4 ビット演算子
4.4.5 合成演算子
4.4.6 メモリアクセス演算子
4.4.7 型変換演算子
4.4.8 その他の命令
4.5 基本的なLLVMの中間表現
4.6 条件文
4.7 ループ文
4.8 合成型へのアクセス
4.9 Metadata
第5章 フロントエンドの作成
5.1 本章の概要
5.2 構文規則の定義
5.3 目標の設定
5.4 字句解析
5.4.1 共通マクロの定義
5.4.2 Tokenクラスの実装
5.4.3 TokenStreamクラスの実装
5.4.4 字句解析の実装
5.5 構文解析
5.5.1 ASTを考える
5.5.2 構文解析クラスの実装方針
5.5.3 メソッドの実装
5.6 意味解析
5.6.1 意味解析の実装方法
5.6.2 Parserクラスの修正
5.6.3 解析メソッドの修正
5.7 コード生成
5.7.1 LLVM IRの生成手順
5.7.2 コード生成クラスの実装方針
5.7.3 メソッドの実装
5.8 mainの作成
5.8.1 入力ソースコード名と出力ソースコード名の受け取り
5.8.2 各種初期化と作成した各クラスの呼び出し
5.9 コンパイルと動作確認
5.9.1 コンパイル
5.9.2 動作確認
5.10 mem2regの適用と組込み関数の導入
5.10.1 mem2regの適用
5.10.2 組込み関数
5.11 JITをやってみる
5.11.1 LLVMでのJIT
5.11.2 組み込み関数のリンクをプログラム中で行う
5.12 Metadataを埋め込みたい場合
5.12.1 Metadataの生成
5.12.2 setMetadataによるMetadataの付与
5.12.3 IRBuilderのメソッドによるMetadataの付与
5.13 CommandLineライブラリ
5.13.1 基本的な使い方
5.13.2 複数のパラメータからの選択
5.13.3 一つのオプションで複数の値を受ける
5.13.4 オプションに指定可能な属性のまとめ
第6章 Passの概要と実装方法
6.1 Passの概念
6.2 Passの種類
6.2.1 ImmutablePass
6.2.2 ModulePass
6.2.3 FunctionPass
6.2.4 LoopPass
6.2.5 RegionPass
6.2.6 BasicBlockPass
6.3 その他のPassに実装すべきもの
6.3.1 Pass::getAnalysisUsageメソッド
6.3.2 Pass::getAnalysis<>
6.3.3 PassのIDとRegisterPassテンプレート
6.4 簡単なPassを実装してみる
6.4.1 どのPassを継承するか
6.4.2 Passクラスの宣言
6.4.3 Passクラスの定義
6.4.4 Passのコンパイル/実行
6.5 無用命令の削除を実装してみる
6.5.1 前提条件を考える
6.5.2 実装方針を考える
6.5.3 実装
6.5.4 コンパイルと実行
6.5.5 DCEクラスを使用する
6.6 ループの繰り返し回数のカウント
6.6.1 前提条件を考える
6.6.2 実装方針を考える
6.6.3 実装
6.6.4 コンパイルと実行
6.6.5 ScalarEvolutionクラスを使用する場合
6.7 適用されるPassを確認する
第7章 バックエンドを作る
7.1 LLVMのバックエンドを学ぶ前に
7.2 LLVMのバックエンドって何するの?
7.3 バックエンドの流れ
7.3.1 SelectionDAG
7.3.2 MI Layer
7.3.3 MC Layer
7.4 目標を決める
7.5 ターゲットの仕様を決める
7.5.1 命令
7.5.2 呼び出し規約
7.6 TableGen
7.6.1 TableGenの目的
7.6.2 TableGenの記述方法
7.6.3 TableGenの記述形式
7.7 ターゲットのクラス構成
7.7.1 ファイル一覧
7.7.2 クラス一覧
7.8 TableGenの記述(Sample.td)
7.8.1 レジスタ
7.8.2 機能ユニット
7.8.3 呼び出し規約
7.8.4 ターゲット
7.8.5 命令
7.8.6 includeファイルの生成
7.9 共通クラスの実装
7.9.1 SampleTargetMachineクラス
7.9.2 SamplePassConfigクラス
7.9.3 SampleSubtargetクラス
7.9.4 SampleInstrInfoクラス
7.9.5 SampleRegisterInfoクラス
7.9.6 SampleMachineFunctionInfoクラス
7.10 SelectionDAGISelパスの実装
7.10.1 SampleDAGToDAGISelクラス
7.10.2 SampleTargetLoweringクラス
7.10.3 SampleSelectionDAGInfoクラス
7.11 フレーム処理(PEIパス)の実装
7.11.1 SampleFrameLoweringクラス
7.12 AsmPrinterの実装
7.12.1 SampleAsmPrinterクラス
7.12.2 SampleMCInstLowerクラス
7.12.3 SampleInstPrinterクラス
7.12.4 SampleAsmBackendクラス
7.12.5 SampleMCCodeEmitterクラス
7.12.6 SampleMCAsmInfoクラス
7.13 Disassemblerの実装
7.13.1 SampleDisassemblerクラス
7.14 その他の実装
7.14.1 ターゲット初期化関数
7.14.2 TargetのTripleを追加
7.14.3 TargetのMakefileを設置
7.15 コンパイルしよう!
7.15.1 LLVMの準備
7.15.2 あせんぶる!
7.15.3 こんぱいる!
7.16 バックエンドを作ってみて
あとがき
参考文献
著者/関係者一覧