mcpField
C
code-generation-and-backends

code-generation-and-backends

github.com/mohitmishra786開発269307 回インストール18 週間前に更新
リポジトリ

code-generation-and-backends について

LLVMやコンパイラバックエンドのコード生成を扱うエージェント向けガイドです。IRの合法化、命令選択、レジスター割り当て、アセンブリ出力を解説し、ターゲット固有の出力やバックエンドの問題、新ターゲット移植の概要を調べるのに役立ちます。

主な機能

  1. 01LLVMバックエンドの処理概要
  2. 02ターゲット出力向けのllcコマンド
  3. 03TableGen命令パターンの概念
  4. 04呼び出し規約の変換
  5. 05ターゲット追加の大まかな手順

活用シーン

  1. 01IRからターゲット命令への変換追跡
  2. 02合法化やアセンブリ層の問題調査
  3. 03ターゲットごとのllc出力比較
  4. 04新しいアーキテクチャへのコンパイラ移植計画

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill code-generation-and-backends

インストール後、Claude Code で/code-generation-and-backendsを入力して読み込まれたか確認します。

詳細

コード生成とバックエンド

目的

LLVM(および一般的なコンパイラー)のバックエンドにおけるコード生成を概説します。IR の合法化、SelectionDAG による命令選択、レジスター割り当て、アセンブリー出力、新しいターゲットを追加する際に必要なことを扱い、IR のスキルおよび skills/compiler-internals/llvm-passes を補完します。

使用する場面

  • 特定のターゲット向けの llc 出力を読むとき
  • IR の型合法化で余分な演算が挿入された理由を理解するとき
  • コンパイラーを新しいアーキテクチャへ移植することを(概要レベルで)評価するとき
  • アセンブリーレベルの誤ったコードをデバッグするとき(IR ではない)

ワークフロー

1. バックエンドのパイプライン(LLVM)
LLVM IR per function
├── IR legalizer (types/ops target supports)
├── SelectionDAGBuilder
├── LegalizeTypes / LegalizeOps
├── Instruction selection (pattern match TableGen)
├── Scheduling (pre-RA)
├── Register allocation
├── Prolog/epilog insertion
└── AsmPrinter → .s object
2. llc の使用方法
clang -c -emit-llvm -O2 -o foo.bc foo.c
llc -march=aarch64 -O2 foo.bc -o foo.s
llc -march=riscv64 -O2 foo.bc -o foo-rv.s
3. TableGen パターン(概念)
def ADD32rr : Pat<(add i32 GPR:$a, GPR:$b),
                  (ADD32rr GPR:$a, GPR:$b)>;

パターンは DAG ノードをマシン命令に対応付けます。.td ファイルではレジスター、呼び出し規約、命令形式を定義します。

4. 呼び出し規約のローワリング

ABI のルールは TableGen で CC_AArch64 / CC_X86_64 になります。これは skills/computer-architecture/abi-and-calling-conventions に関連します。

5. ターゲットトリプル
clang --target=arm-none-eabi -c -O2 foo.c
llc -mtriple=thumbv7em-none-eabi foo.bc

トリプルと CPU 機能(+neon、+crc)の不一致は、合法化の失敗や最適でないコードの原因になります。

6. ターゲットの追加(概要)
  1. TableGen でレジスタークラスと命令形式を定義する
  2. ローワリングフック(TargetLowering)を実装する
  3. リロケーション用の AsmPrinter と MC レイヤーを用意する
  4. 組み込みの呼び出し規約と ELF/COFF オブジェクトライターを用意する

完全な移植には多大な作業が必要です。対象アーキテクチャに最も近い既存のバックエンドを再利用してください。

7. エージェントでの使用方法
/code-generation-and-backends Trace how this IR add becomes AArch64 ADD instruction

よくある問題

症状原因対処法
Cannot select の致命的エラーターゲットで未対応の IR 演算演算を合法化するか展開する
ソフトフロートの結果が誤っているABI の不一致-mfloat-abi / トリプルを設定する
スタックフレームが非常に大きいRA 後のスピルが多いIR レベルでレジスター圧力を軽減する
llc と clang の結果が異なる渡されたターゲットが異なる同じ -mtriple を指定する
TableGen のビルドが失敗する.td 内の構文エラーllvm-tblgen のエラー行を確認する

関連スキル

  • skills/compiler-internals/llvm-ir-and-passes — コード生成前の IR
  • skills/compiler-internals/compiler-optimizations-deep — RA の勘所
  • skills/compilers/cross-gcc — 組み込み向けトリプル
  • skills/computer-architecture/abi-and-calling-conventions — 呼び出しのローワリング
  • skills/low-level-programming/assembly-arm — 出力されたアセンブリーを読む

コメント