= 自作ISAのためのLLVMバックエンドを書く薄い本(予定) 艮 鮟鱇 :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] == 参考文献