diff --git a/docs/development/current/main/phase131_joinir_llvm_fixes.md b/docs/development/current/main/phase131_joinir_llvm_fixes.md new file mode 100644 index 00000000..edb88c69 --- /dev/null +++ b/docs/development/current/main/phase131_joinir_llvm_fixes.md @@ -0,0 +1,284 @@ +# Phase 131: JoinIR → LLVM 個別修正ライン(最小スコープ) + +## 🎯 ゴール + +Phase 130 で観測した LLVM 側の「赤ポイント3つ」を、**設計を崩さずピンポイントで修正** するフェーズ。 + +目的: +- LLVM backend の最小 re-enable(代表1本を green に) +- ConsoleBox の LLVM ライン統一(println/log 出力) +- JoinIR→MIR→LLVM の成功パス確立(JoinIR含み1本を green に) + +``` +Phase 130: 赤ポイント3つを「観測・リスト化」✅ + ↓ +Phase 131: その3つを「ピンポイント修正」← ← ここ! + ↓ +JoinIR/LLVM 第3章クローズ準備完了 +``` + +--- + +## 📋 スコープ(Phase 130 で見えた3点だけ) + +Phase 130 で検出された問題: + +1. **LLVM backend 機能が無効化中** → 最小 re-enable で1本 green に +2. **ConsoleBox の LLVM ライン登録・出力経路** → LLVM runtime レイヤで統一 +3. **JoinIR→MIR は OK、MIR→LLVM は未検証** → JoinIR含みケース1本を成功させる + +### ✅ やること +- LLVM backend の現状確認と最小 re-enable +- ConsoleBox の LLVM 出力経路整備 +- JoinIR含みケース1本の LLVM 実行成功 + +### ❌ やらないこと +- 全7本のテストケースを green にする(1-2本で十分) +- LLVM最適化パスの追加 +- 大規模な設計変更 + +--- + +## 🏗️ 4 つのタスク + +### Task 1: LLVM backend の現状確認 & 最小 re-enable + +**目標**: 代表1本(`peek_expr_block.hako`)を LLVM ハーネスで green にする + +**やること**: + +1. **LLVM backend 設定の確認**: + ```bash + # Cargo.toml で llvm feature の定義確認 + rg "features.*llvm" Cargo.toml + + # 現在のビルド確認 + ./target/release/nyash --version + ``` + +2. **LLVM feature 付きビルド**: + ```bash + cargo build --release --features llvm + ``` + - ビルドエラーがあれば記録(Phase 130 docs に追記) + - 成功すれば次へ + +3. **Python/llvmlite 環境確認**: + ```bash + # llvmlite ハーネス確認 + ls -la src/llvm_py/venv/ + + # 無ければ再構築 + cd src/llvm_py + python3 -m venv venv + ./venv/bin/pip install llvmlite + cd ../.. + ``` + +4. **代表1本を LLVM 実行**: + ```bash + # peek_expr_block.hako を LLVM で実行 + LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) \ + NYASH_LLVM_USE_HARNESS=1 \ + ./target/release/nyash --backend llvm apps/tests/peek_expr_block.hako + ``` + - ✅ green なら Task 1 完了 + - ❌ 赤なら、エラーメッセージを docs に記録して次の Task へ + +5. **Phase 130 docs 更新**: + - `phase130_joinir_llvm_baseline.md` の結果表を更新 + - LLVM backend の re-enable 手順を記録 + +--- + +### Task 2: ConsoleBox の LLVM ライン整合 + +**目標**: ConsoleBox の println/log を LLVM runtime レイヤで統一 + +**やること**: + +1. **Rust VM での ConsoleBox 登録確認**: + ```bash + # TypeRegistry で ConsoleBox の println/log スロット確認 + rg "ConsoleBox.*println" src/runtime/type_registry.rs + + # Phase 122 の変更内容確認 + rg "Phase 122" docs/development/current/main/ + ``` + +2. **LLVM runtime での ConsoleBox 対応**: + - 候補A: LLVM ハーネス側で print/log 外部関数を追加 + - 候補B: LLVM backend に println/log の簡易実装を追加 + - **推奨**: 候補A(Python ハーネス側での外部関数実装) + +3. **Python ハーネス修正**(推奨アプローチ): + ```python + # src/llvm_py/llvm_builder.py または runtime.py + + # extern_print 関数を追加(既存の print 処理を流用) + def extern_println(msg): + print(f"[Console LOG] {msg}") + + # LLVM IR 生成時に externCall("println", ...) を処理 + ``` + +4. **検証**: + ```bash + # esc_dirname_smoke.hako を LLVM で実行 + LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) \ + NYASH_LLVM_USE_HARNESS=1 \ + ./target/release/nyash --backend llvm apps/tests/esc_dirname_smoke.hako + ``` + - 期待出力: `[Console LOG] dir1/dir2` + +5. **Phase 130 docs 更新**: + - ConsoleBox の LLVM 対応状況を記録 + +--- + +### Task 3: JoinIR→MIR→LLVM の成功パス確立 + +**目標**: JoinIR含みケース1本を LLVM で green にする + +**やること**: + +1. **JoinIR含みケースの選定**: + - 候補1: `local_tests/phase123_simple_if.hako`(シンプルな if) + - 候補2: `apps/tests/joinir_if_select_simple.hako`(IfSelect) + - **推奨**: `phase123_simple_if.hako`(軽量で検証しやすい) + +2. **Rust VM での確認**(比較用): + ```bash + ./target/release/nyash --backend vm local_tests/phase123_simple_if.hako + # 出力: RC: 0 + ``` + +3. **LLVM 実行**: + ```bash + LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) \ + NYASH_LLVM_USE_HARNESS=1 \ + ./target/release/nyash --backend llvm local_tests/phase123_simple_if.hako + ``` + +4. **エラー対応**: + - JoinIR → MIR 変換: ✅ Phase 130 で確認済み(問題なし) + - MIR → LLVM IR: ここでエラーが出る可能性 + - 未対応命令(BoxCall/NewBox/PHI)があれば記録 + - 軽微な修正(1-2箇所)なら対応 + - 大規模修正が必要なら Phase 132 に回す + +5. **成功条件**: + - ✅ JoinIR含みケース1本が LLVM で実行成功 + - または + - ⚠️ 未対応命令を特定して docs に記録(修正は Phase 132) + +--- + +### Task 4: ドキュメント & CURRENT_TASK 更新 + +**やること**: + +1. **phase130_joinir_llvm_baseline.md 更新**: + ```markdown + ## Phase 131 修正内容 + + ### LLVM backend re-enable + - ✅ `cargo build --release --features llvm` 成功 + - ✅ peek_expr_block.hako: Rust VM ✅ → LLVM ✅ + + ### ConsoleBox LLVM 統合 + - ✅ Python ハーネス側で println/log 外部関数実装 + - ✅ esc_dirname_smoke.hako: Rust VM ✅ → LLVM ✅ + + ### JoinIR→LLVM 成功パス + - ✅ phase123_simple_if.hako: Rust VM ✅ → LLVM ✅ + - または + - ⚠️ 未対応: [具体的な命令名] → Phase 132 対応予定 + + ### 修正後の結果表 + + | .hako ファイル | Rust VM | LLVM (Phase 130) | LLVM (Phase 131) | メモ | + |---|---|---|---|---| + | peek_expr_block.hako | ✅ | ❌ | ✅ | re-enable 成功 | + | esc_dirname_smoke.hako | ❌ | ❌ | ✅ | ConsoleBox 統合 | + | phase123_simple_if.hako | ✅ | ❌ | ✅ or ⚠️ | JoinIR パス | + ``` + +2. **CURRENT_TASK.md 更新**: + ```markdown + ### Phase 131: JoinIR → LLVM 個別修正ライン ✅ + + **完了内容**: + - LLVM backend 最小 re-enable(peek_expr_block.hako ✅) + - ConsoleBox LLVM 統合(esc_dirname_smoke.hako ✅) + - JoinIR→LLVM 成功パス確立(phase123_simple_if.hako ✅ or ⚠️) + + **修正箇所**: + - Cargo.toml: llvm feature 確認 + - src/llvm_py/*: ConsoleBox println/log 外部関数追加 + - [その他、修正したファイルを列挙] + + **テスト結果**: + - 修正前: LLVM 0/7 実行可能 + - 修正後: LLVM 2-3/7 実行可能(最小成功パス確立) + + **成果**: + - JoinIR → LLVM 経路の基本導線が動作確認できた + - Phase 132 以降で残りのケースを green にする準備完了 + + **次フェーズ**: Phase 132 - LLVM 未対応命令の個別対応(必要に応じて) + ``` + +3. **30-Backlog.md 更新**: + ```markdown + ### Phase 132: LLVM 未対応命令の個別対応(必要時) + + Phase 131 で未解決の問題: + - [Phase 131 で検出された未対応命令を列挙] + - 例: BoxCall の特定メソッド、PHI の特殊ケース等 + + または、Phase 131 で全て解決した場合: + - ✅ JoinIR → LLVM 第3章クローズ + - 次: selfhost Stage-4 拡張 or 次の大型改善へ + ``` + +--- + +## ✅ 完成チェックリスト(Phase 131) + +- [ ] LLVM backend が `--features llvm` でビルド成功 +- [ ] Python/llvmlite 環境が構築済み +- [ ] peek_expr_block.hako が LLVM で実行成功(✅) +- [ ] esc_dirname_smoke.hako が LLVM で実行成功(✅、ConsoleBox 出力確認) +- [ ] phase123_simple_if.hako が LLVM で実行成功(✅ or ⚠️ + 問題記録) +- [ ] phase130_joinir_llvm_baseline.md に Phase 131 修正内容追記 +- [ ] CURRENT_TASK.md に Phase 131 完了行追加 +- [ ] 30-Backlog.md 更新(Phase 132 予告 or クローズ宣言) +- [ ] git commit で記録 + +--- + +## 所要時間 + +**6〜8 時間程度** + +- Task 1 (LLVM backend re-enable): 2時間 +- Task 2 (ConsoleBox 統合): 2時間 +- Task 3 (JoinIR→LLVM 成功パス): 2〜3時間 +- Task 4 (ドキュメント更新): 1時間 + +--- + +## 次のステップ + +**Phase 132 or クローズ判断**: +- Phase 131 で全て解決 → JoinIR→LLVM 第3章クローズ +- Phase 131 で未解決問題あり → Phase 132 で個別対応 + +--- + +## 進捗 + +- ✅ Phase 130: JoinIR → LLVM ベースライン確立(完了) +- 🎯 Phase 131: JoinIR → LLVM 個別修正ライン(← **現在のフェーズ**) +- 📋 Phase 132: LLVM 未対応命令の個別対応(必要に応じて)