Files
hakorune/src/mir/builder
..

MIR Builder (src/mir/builder/)

このディレクトリは Rust 側の MIR 生成AST → MIRを担う。
JoinIR の merge もここ(control_flow/joinir/merge/)が入口。

原則SSOT / Box-First

  • 状態は Context が SSOT: MirBuilder の状態は Contextに分割され、二重管理をしない。
  • ValueId 発行は SSOT: 関数内の ValueId は MirBuilder::next_value_id() を唯一入口にする。
  • 境界は Fail-Fast: JoinIR merge は contract_checks.rs で契約違反を早期検出するdebug-only

Context 構成(責務マップ)

  • core_context.rs
    • ID 生成器ValueId/BlockId/BindingId 等)と最小の共通コア状態。
  • type_context.rs
    • ValueId → 型/種別/起源NewBox 由来など)の追跡。
  • scope_context.rs
    • lexical scope / loop/if/try のスタックと、current_function / current_block の実行文脈。
  • binding_context.rs
    • 変数名 ↔ BindingId の対応shadowing の復元を含む)。
  • variable_context.rs
    • 変数解決variable_map 等)。
  • metadata_context.rs
    • span/source_hint/region観測などのメタ情報。
  • compilation_context.rs
    • コンパイル全体のレジストリBox/型レジストリ、reserved ids 等)。
  • context.rs
    • 上記 Context を束ねる入れ物(MirBuilder はここを介して状態へアクセスする)。

主要エントリポイント

  • ValueId/BlockId
    • src/mir/builder/utils.rsMirBuilder::next_value_id() など)
  • AST → MIR の基本道
    • src/mir/builder/stmts.rs
    • src/mir/builder/exprs.rs
  • JoinIR merge契約検証を含む
    • src/mir/builder/control_flow/joinir/merge/mod.rs
    • src/mir/builder/control_flow/joinir/merge/contract_checks.rs

追加ルール(将来の変更者向け)

  • 新しい状態を追加する場合は、まず「どの Context の責務か」を決めてから追加する(MirBuilder 直下に増やさない)。
  • 変更後に最低限確認する:
    • tools/smokes/v2/profiles/integration/apps/phase135_trim_mir_verify.shMIR verify の回帰防止)