code-generation-and-backends について
LLVMやコンパイラバックエンドのコード生成を扱うエージェント向けガイドです。IRの合法化、命令選択、レジスター割り当て、アセンブリ出力を解説し、ターゲット固有の出力やバックエンドの問題、新ターゲット移植の概要を調べるのに役立ちます。
主な機能
- 01LLVMバックエンドの処理概要
- 02ターゲット出力向けのllcコマンド
- 03TableGen命令パターンの概念
- 04呼び出し規約の変換
- 05ターゲット追加の大まかな手順
活用シーン
- 01IRからターゲット命令への変換追跡
- 02合法化やアセンブリ層の問題調査
- 03ターゲットごとのllc出力比較
- 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. ターゲットの追加(概要)
- TableGen でレジスタークラスと命令形式を定義する
- ローワリングフック(
TargetLowering)を実装する - リロケーション用の AsmPrinter と MC レイヤーを用意する
- 組み込みの呼び出し規約と 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— コード生成前の IRskills/compiler-internals/compiler-optimizations-deep— RA の勘所skills/compilers/cross-gcc— 組み込み向けトリプルskills/computer-architecture/abi-and-calling-conventions— 呼び出しのローワリングskills/low-level-programming/assembly-arm— 出力されたアセンブリーを読む
コメント
Markdown 対応