Files
hakorune/docs/development/current/main/phase131_joinir_llvm_fixes.md

8.8 KiB
Raw Blame History

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 設定の確認:

    # Cargo.toml で llvm feature の定義確認
    rg "features.*llvm" Cargo.toml
    
    # 現在のビルド確認
    ./target/release/nyash --version
    
  2. LLVM feature 付きビルド:

    cargo build --release --features llvm
    
    • ビルドエラーがあれば記録Phase 130 docs に追記)
    • 成功すれば次へ
  3. Python/llvmlite 環境確認:

    # llvmlite ハーネス確認
    ls -la src/llvm_py/venv/
    
    # 無ければ再構築
    cd src/llvm_py
    python3 -m venv venv
    ./venv/bin/pip install llvmlite
    cd ../..
    
  4. 代表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 へ
  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 登録確認:

    # 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 の簡易実装を追加
    • 推奨: 候補APython ハーネス側での外部関数実装)
  3. 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. 検証:

    # 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.hakoIfSelect
    • 推奨: phase123_simple_if.hako(軽量で検証しやすい)
  2. Rust VM での確認(比較用):

    ./target/release/nyash --backend vm local_tests/phase123_simple_if.hako
    # 出力: RC: 0
    
  3. 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
    
  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 更新:

    ## 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 更新:

    ### Phase 131: JoinIR → LLVM 個別修正ライン ✅
    
    **完了内容**:
    - LLVM backend 最小 re-enablepeek_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 更新:

    ### 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 未対応命令の個別対応(必要に応じて)