docs(phase131): JoinIR → LLVM 個別修正ライン(指示書作成)

This commit is contained in:
nyash-codex
2025-12-04 10:57:13 +09:00
parent aad3a9bb9f
commit 67bb7e2834

View File

@ -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 の簡易実装を追加
- **推奨**: 候補APython ハーネス側での外部関数実装)
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-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 更新**:
```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 未対応命令の個別対応(必要に応じて)