Files
hakorune/src/llvm_py
nyash-codex aad01a1079 feat(llvm): Phase 132-P2 - Dict ctx removal (FunctionLowerContext SSOT completion)
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>
2025-12-15 12:12:54 +09:00
..

LLVM Python Backend (Experimental)

📝 概要

Rust/inkwellの複雑性を回避し、llvmliteを使ってシンプルに実装する実験的バックエンド。 ChatGPTが設計したdocs/development/design/legacy/LLVM_LAYER_OVERVIEW.mdの設計原則に従う。

🎯 目的

  1. 検証ハーネス - PHI/SSA構造の高速検証
  2. プロトタイプ - 新機能の迅速な試作
  3. 教育的価値 - シンプルで理解しやすい実装
  4. バックアップ - 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-mergeret-merge前処理PHI前宣言プラン
├── instructions/
│   ├── controlflow/
│   │   ├── branch.py          # 条件分岐
│   │   ├── jump.py            # 無条件ジャンプ
│   │   └── while_.py          # 通常の while 降下LoopForm 失敗時のフォールバック)
│   ├── binop.py               # 2項演算
│   ├── compare.py             # 比較演算i1生成
│   ├── const.py               # 定数
│   ├── copy.py                # CopyMIR13 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 … ループ検出プリパスONwhile 形を構造化)
  • NYASH_LLVM_PREPASS_IFMERGE=1 … if-mergeret-mergeプリパスONret値 PHI を前宣言)
  • NYASH_LLVM_TRACE_PHI=1 … PHI 配線と end-of-block 解決の詳細トレース
  • NYASH_CLI_VERBOSE=1 … 降下やスナップショットの詳細ログ
  • NYASH_MIR_NO_PHI=1 … MIR13PHI-offを明示既定1
  • NYASH_VERIFY_ALLOW_NO_PHI=1 … PHI-less を検証で許容既定1

📋 設計原則LLVM_LAYER_OVERVIEWに準拠

  1. Resolver-only reads原則: 直接の cross-block vmap 参照は避け、resolver 経由で取得
  2. Localize at block start: ブロック先頭で PHI を作るif-merge は prepass で前宣言)
  3. Sealed SSA: ブロック末 snapshot を用いた finalize_phis 配線
  4. Builder cursor discipline: 生成位置の厳格化terminator 後に emit しない)

🎨 実装状況

  • 基本構造MIR読み込み
  • ControlFlow 分離branch/jump/while_regular
  • CFG/Prepass 分離cfg/utils.py, prepass/loops.py, prepass/if_merge.py
  • if-mergeret-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.hako
      • NYASH_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行

「簡単最高」の精神を体現!