Unify condition lowering logic across Pattern 2/4 with trait-based API. New infrastructure: - condition_lowering_box.rs: ConditionLoweringBox trait + ConditionContext (293 lines) - ExprLowerer implements ConditionLoweringBox trait (+51 lines) Pattern migrations: - Pattern 2 (loop_with_break_minimal.rs): Use trait API - Pattern 4 (loop_with_continue_minimal.rs): Use trait API Benefits: - Unified condition lowering interface - Extensible for future lowering strategies - Clean API boundary between patterns and lowering logic - Zero code duplication Test results: 911/911 PASS (+2 new tests) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
8.9 KiB
8.9 KiB
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 で検出された問題:
- LLVM backend 機能が無効化中 → 最小 re-enable で1本 green に
- ConsoleBox の LLVM ライン登録・出力経路 → LLVM runtime レイヤで統一
- 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 にする
やること:
-
LLVM backend 設定の確認:
# Cargo.toml で llvm feature の定義確認 rg "features.*llvm" Cargo.toml # 現在のビルド確認 ./target/release/nyash --version -
LLVM feature 付きビルド:
cargo build --release --features llvm- ビルドエラーがあれば記録(Phase 130 docs に追記)
- 成功すれば次へ
-
Python/llvmlite 環境確認:
# llvmlite ハーネス確認 ls -la src/llvm_py/venv/ # 無ければ再構築 cd src/llvm_py python3 -m venv venv ./venv/bin/pip install llvmlite cd ../.. -
代表1本を LLVM 実行:
# 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 へ
-
Phase 130 docs 更新:
phase130_joinir_llvm_baseline.mdの結果表を更新- LLVM backend の re-enable 手順を記録
Task 2: ConsoleBox の LLVM ライン整合
目標: ConsoleBox の println/log を LLVM runtime レイヤで統一
やること:
-
Rust VM での ConsoleBox 登録確認:
# TypeRegistry で ConsoleBox の println/log スロット確認 rg "ConsoleBox.*println" src/runtime/type_registry.rs # Phase 122 の変更内容確認 rg "Phase 122" docs/development/current/main/ -
LLVM runtime での ConsoleBox 対応:
- 候補A: LLVM ハーネス側で print/log 外部関数を追加
- 候補B: LLVM backend に println/log の簡易実装を追加
- 推奨: 候補A(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", ...) を処理 -
検証:
# 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
- 期待出力:
-
Phase 130 docs 更新:
- ConsoleBox の LLVM 対応状況を記録
Task 3: JoinIR→MIR→LLVM の成功パス確立
目標: JoinIR含みケース1本を LLVM で green にする
やること:
-
JoinIR含みケースの選定:
- 候補1:
local_tests/phase123_simple_if.hako(シンプルな if) - 候補2:
apps/tests/joinir_if_select_simple.hako(IfSelect) - 推奨:
phase123_simple_if.hako(軽量で検証しやすい)
- 候補1:
-
Rust VM での確認(比較用):
./target/release/nyash --backend vm local_tests/phase123_simple_if.hako # 出力: RC: 0 -
LLVM 実行:
LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) \ NYASH_LLVM_USE_HARNESS=1 \ ./target/release/nyash --backend llvm local_tests/phase123_simple_if.hako -
エラー対応:
- JoinIR → MIR 変換: ✅ Phase 130 で確認済み(問題なし)
- MIR → LLVM IR: ここでエラーが出る可能性
- 未対応命令(BoxCall/NewBox/PHI)があれば記録
- 軽微な修正(1-2箇所)なら対応
- 大規模修正が必要なら Phase 132 に回す
-
成功条件:
- ✅ JoinIR含みケース1本が LLVM で実行成功
- または
- ⚠️ 未対応命令を特定して docs に記録(修正は Phase 132)
Task 4: ドキュメント & CURRENT_TASK 更新
やること:
-
phase130_joinir_llvm_baseline.md 更新:
## 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 パス | -
CURRENT_TASK.md 更新:
### 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 未対応命令の個別対応(必要に応じて) -
30-Backlog.md 更新:
### 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 未対応命令の個別対応(必要に応じて) Status: Historical