write-your-llvm-backend/main.asciidoc

86 lines
2.5 KiB
Plaintext
Raw Normal View History

2020-01-07 16:15:31 +07:00
= 自作ISAのためのLLVMバックエンドを書く薄い本予定
艮 鮟鱇 <ushitora@anqou.net>
:toc: left
== LLVMバックエンド概略
FIXME: 人がLLVMバックエンドを書きたくなるような文章をここに書く。
== 参考にすべき文献
== ISAの仕様を決める
=== CAHPv3アーキテクチャ仕様
== アセンブラを作る
=== LLVMをビルドする
=== スケルトンバックエンドを追加する
=== 簡易的なアセンブラを実装する
=== `CAHPInstPrinter` を実装する
=== テストを書く
=== メモリ演算を追加する
=== 属性を指定する
=== ディスアセンブラを実装する
=== relocationとfixupに対応する
=== `%hi` と `%lo` に対応する
=== `li a0, foo` をエラーにする
=== llvm-objdump の調査
=== `hlt` 疑似命令を追加する
== コード生成部を作る
=== コンパイラのスケルトンを作成する
=== 基本的な演算に対応する
=== 定数の実体化に対応する
=== メモリ演算に対応する
=== relocationに対応する
=== 条件分岐に対応する
=== 関数呼び出しに対応する
=== 関数プロローグ・エピローグを実装する
=== frame pointer eliminationを実装する
=== `select` に対応する
=== `FrameIndex` をlowerする。
=== 大きなスタックフレームに対応する
=== `SETCC` に対応する
=== `ExternalSymbol` に対応する
=== jump tableを無効化する
=== インラインアセンブリに対応する
=== fastccに対応する
== Cコンパイラに仕立てる
=== LLDにCAHPバックエンドを追加する
=== ClangをCAHPに対応させる
=== `crt0.o` と `cahp.lds` の導入
=== `--nmagic` の有効化
=== libcの有効化
== まともなコードを生成する
=== 分岐解析に対応する
=== branch relaxationに対応する
=== 16bit命令を活用する
=== `jal` を活用する
=== 命令スケジューリングを設定する
=== 末尾再帰に対応する
== 落ち穂拾い
=== スタックを利用した引数渡し
=== `byval` の対応
=== 動的なスタック領域確保に対応する
=== emergency spillに対応する
=== 可変長引数関数に対応する
=== 単体の `sext/zext/trunc` に対応する
=== 乗算に対応する
=== 除算・剰余に対応する
=== `frameaddr/returnaddr` に対応する
=== `ROTL/ROTR/BSWAP/CTTZ/CTLZ/CTPOP` に対応する
=== 32bitのシフトに対応する
=== 間接ジャンプに対応する
=== `BlockAddress` のlowerに対応する
[bibliography]
== 参考文献