Completed SSOT unification for FunctionLowerContext by removing the manual dict ctx creation and assignment in function_lower.py. Changes: - Removed builder.ctx = dict(...) creation (18 lines, lines 313-330) - Removed builder.resolver.ctx assignment (no longer needed) - Confirmed instruction_lower.py uses context=owner.context throughout - Added phase132_multifunc_isolation_min.hako test for multi-function isolation - Extended phase132_exit_phi_parity.sh with Case C (Rust VM context test) Testing: - Phase 132 smoke test: All 3 cases PASS - Phase 87 LLVM exe test: PASS (Result: 42) - STRICT mode: PASS - No regressions: Behavior identical before/after (RC:6 maintained) Impact: - Reduced manual context management complexity - FunctionLowerContext now sole source of truth (SSOT) - Per-function state properly isolated, no cross-function collisions - Cleaner architecture: context parameter passed explicitly vs manual dict 🤖 Generated with Claude Code Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
LLVM Python Backend (Experimental)
📝 概要
Rust/inkwellの複雑性を回避し、llvmliteを使ってシンプルに実装する実験的バックエンド。
ChatGPTが設計したdocs/development/design/legacy/LLVM_LAYER_OVERVIEW.mdの設計原則に従う。
🎯 目的
- 検証ハーネス - PHI/SSA構造の高速検証
- プロトタイプ - 新機能の迅速な試作
- 教育的価値 - シンプルで理解しやすい実装
- バックアップ - Rustが詰まった時の代替案
📂 構造
llvm_py/
├── README.md # このファイル
├── llvm_builder.py # メインのLLVM IR生成(パスのオーケストレーション)
├── mir_reader.py # MIR(JSON) ローダ
├── resolver.py # 値解決(SSA/PHIの局所化とキャッシュ)
├── utils/
│ └── values.py # 同一ブロック優先の解決などの共通ポリシー
├── cfg/
│ └── utils.py # CFG ビルド(pred/succ)
├── prepass/
│ ├── loops.py # ループ検出(while 形)
│ └── if_merge.py # if-merge(ret-merge)前処理(PHI前宣言プラン)
├── instructions/
│ ├── controlflow/
│ │ ├── branch.py # 条件分岐
│ │ ├── jump.py # 無条件ジャンプ
│ │ └── while_.py # 通常の while 降下(LoopForm 失敗時のフォールバック)
│ ├── binop.py # 2項演算
│ ├── compare.py # 比較演算(i1生成)
│ ├── const.py # 定数
│ ├── copy.py # Copy(MIR13 PHI-off の合流表現)
│ ├── call.py # Ny 関数呼び出し
│ ├── boxcall.py # Box メソッド呼び出し
│ ├── externcall.py # 外部呼び出し
│ ├── newbox.py # Box 生成
│ ├── ret.py # return 降下(if-merge の前宣言PHIを優先)
│ ├── typeop.py # 型変換
│ ├── safepoint.py # safepoint
│ └── barrier.py # メモリバリア
└── test_simple.py # 基本テスト
🚀 使い方
# MIR JSONからオブジェクトファイル生成
python src/llvm_py/llvm_builder.py input.mir.json -o output.o
# 環境変数で切り替え(将来)
NYASH_LLVM_USE_HARNESS=1 ./target/release/hakorune program.hako
🔧 開発用フラグ(プリパス/トレース)
NYASH_LLVM_USE_HARNESS=1… Rust 実行から llvmlite ハーネスへ委譲NYASH_LLVM_PREPASS_LOOP=1… ループ検出プリパスON(while 形を構造化)NYASH_LLVM_PREPASS_IFMERGE=1… if-merge(ret-merge)プリパスON(ret値 PHI を前宣言)NYASH_LLVM_TRACE_PHI=1… PHI 配線と end-of-block 解決の詳細トレースNYASH_CLI_VERBOSE=1… 降下やスナップショットの詳細ログNYASH_MIR_NO_PHI=1… MIR13(PHI-off)を明示(既定1)NYASH_VERIFY_ALLOW_NO_PHI=1… PHI-less を検証で許容(既定1)
📋 設計原則(LLVM_LAYER_OVERVIEWに準拠)
- Resolver-only reads(原則): 直接の cross-block vmap 参照は避け、resolver 経由で取得
- Localize at block start: ブロック先頭で PHI を作る(if-merge は prepass で前宣言)
- Sealed SSA: ブロック末 snapshot を用いた finalize_phis 配線
- Builder cursor discipline: 生成位置の厳格化(terminator 後に emit しない)
🎨 実装状況
- 基本構造(MIR読み込み)
- ControlFlow 分離(branch/jump/while_regular)
- CFG/Prepass 分離(cfg/utils.py, prepass/loops.py, prepass/if_merge.py)
- if-merge(ret-merge)の PHI 前宣言(ゲート: NYASH_LLVM_PREPASS_IFMERGE=1)
- ループプリパス(ゲート: NYASH_LLVM_PREPASS_LOOP=1)
- 追加命令/Stage-3 の持続的整備
✅ テスト・検証
- パリティ(llvmlite vs PyVM。既定は終了コードのみ比較)
./tools/pyvm_vs_llvmlite.sh apps/tests/ternary_nested.hako- 代表例(プリパス有効):
NYASH_LLVM_PREPASS_IFMERGE=1 ./tools/pyvm_vs_llvmlite.sh apps/tests/ternary_nested.hakoNYASH_LLVM_PREPASS_LOOP=1 ./tools/pyvm_vs_llvmlite.sh apps/tests/loop_if_phi.hako
- 厳密比較(標準出力+終了コード)
CMP_STRICT=1 ./tools/pyvm_vs_llvmlite.sh <file.hako>
- まとまったスモーク(PHI-off 既定)
tools/smokes/curated_llvm.sh- PHI-on 検証(実験的):
tools/smokes/curated_llvm.sh --phi-on
📊 予想行数
- 全体: 800-1000行
- コア実装: 300-400行
「簡単最高」の精神を体現!