関連サイト
著者らによるサークル公式ページがあります。
※本書を元にインプレスジャパン社から紙の書籍が発売になりました。こちらもぜひお買い求めください。
インプレスジャパン
売り上げランキング: 1,207
内容紹介
本書は趣味でLLVMを触っている著者二人のLLVMをもっと普及させていきたいと思いから生まれたLLVM解説本です。
LLVMは今非常に注目されていますが、度重なるAPI仕様の変更や公式ドキュメントの充実さなどが理由で、まとまった解説がなされたものはありませんでした。本書によりまとまった情報が日本語で手に入るようになり、多くの方にLLVMを知って頂けると幸いです。
本書ではLLVMを使用したコンパイラの作り方を順を追って説明しLLVMへの理解を深めてもらおうというのがコンセプトになっています。フロントエンド(中間表現出力まで)、ミドルエンド(最適化)、バックエンド(オブジェクト生成)と幅広く解説していますので多くの方に有用な内容を含んでいるのではないでしょうか。
LLVMの用途は多岐にわたり,本書では解説できていない部分もありますが,初心者向けの情報としてLLVMを利用するための基礎的な情報を纏めました。これらを参考に改めてLLVMについて学習し,共に果てなきLLVMの世界へと踏み出しましょう。
書誌情報
- 著者: 柏木餅子, 風薬
- 表紙: 矢上諒一
- 発行日: 2013-02-08
- 最終更新日: 2014-02-12
- バージョン: 1.0.0
- ページ数: 313ページ(A4PDF版換算)
- 対応フォーマット: EPUB, PDF
- 出版社: 達人出版会
対象読者
LLVM、コンパイラ基盤に興味のあるひと、コンパイラを自作したいひと
著者について
柏木餅子
某インフラ関係企業の開発部隊で働くエンジニア見習い。
一人前のエンジニアを目指して日々勉強中。
なぜか最近スクリプト言語を触ることが多いがうまく使いこなせないのが悩みの種。
本書ではフロントエンドと最適化を担当。ネットワーク周りにもう少し強くなりたいと思い奮闘中。
風薬
Web系企業で働くエンジニア。
運用から開発までなんでもやります。
システムを最適化するのが好きで今日も人の仕事を無くします。
JavaScriptやPHPのような上位レイヤから分散システム、OS、コンパイラ、コンピュータアーキテクチャのような低レイヤまでを行ったり来たりしているがどれも得意ではない。
今年の目標はx86で会話すること。
目次
はじめに
はしがき
第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.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 TokenSetクラスの実装
- 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 適用されるPassを確認する
第7章 バックエンドを作る
- 7.1 LLVMのバックエンドを学ぶ前に
- 7.2 LLVMのバックエンドって何するの?
- 7.3 バックエンドの流れ
- 7.3.1 SelectionDAG
- 7.3.2 MachineCode
- 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 SampleInsrInfoクラス
- 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 AsmPrinterの実装
- 7.11.1 SampleAsmPrinterクラス
- 7.11.2 SampleMCInstLowerクラス
- 7.11.3 SampleInstPrinterクラス
- 7.11.4 SampleAsmBackendクラス
- 7.11.5 SampleMCCodeEmitterクラス
- 7.11.6 SampleMCAsmInfoクラス
- 7.12 フレーム処理の実装
- 7.12.1 SampleFrameLoweringクラス
- 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 バックエンドを作ってみて