use crate::mir::MirModule; /// JoinIR ブリッジの実行範囲を表す enum /// /// - `Exec`: JoinIR→VM 実行まで対応。意味論を A/B 実証済みのものに限定。 /// - `LowerOnly`: JoinIR lowering / Bridge 構造検証専用。実行は VM Route A にフォールバック。 #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum JoinIrBridgeKind { /// JoinIR→VM 実行まで対応(skip/trim など、意味論を A/B 実証済み) Exec, /// JoinIR lowering / Bridge 構造検証専用(Stage-1/Stage-B など) LowerOnly, } /// JoinIR ブリッジ対象の記述子 /// /// 関数名と実行範囲(Exec/LowerOnly)をペアで管理する。 #[derive(Debug, Clone, Copy)] pub struct JoinIrTargetDesc { /// 対象関数名(MirModule.functions のキー) pub func_name: &'static str, /// 実行範囲 pub kind: JoinIrBridgeKind, /// デフォルト有効化(env フラグなしでも JoinIR 経路に入る) pub default_enabled: bool, } /// JoinIR ブリッジ対象テーブル /// /// Phase 32 L-4: 全対象関数を一覧化し、Exec/LowerOnly の区分を明示する。 /// /// | 関数 | Kind | デフォルト有効 | 備考 | /// |-----|------|---------------|------| /// | Main.skip/1 | Exec | No | PHI canary のため env 必須 | /// | FuncScannerBox.trim/1 | Exec | Yes | A/B 実証済み、事実上本線 | /// | Stage1UsingResolverBox.resolve_for_source/5 | LowerOnly | No | 構造検証のみ | /// | StageBBodyExtractorBox.build_body_src/2 | LowerOnly | No | 構造検証のみ | /// | StageBFuncScannerBox.scan_all_boxes/1 | LowerOnly | No | 構造検証のみ | pub const JOINIR_TARGETS: &[JoinIrTargetDesc] = &[ JoinIrTargetDesc { func_name: "Main.skip/1", kind: JoinIrBridgeKind::Exec, default_enabled: false, // PHI canary のため env 必須 }, JoinIrTargetDesc { func_name: "FuncScannerBox.trim/1", kind: JoinIrBridgeKind::Exec, default_enabled: true, // A/B 実証済み、事実上本線 }, JoinIrTargetDesc { func_name: "Stage1UsingResolverBox.resolve_for_source/5", kind: JoinIrBridgeKind::LowerOnly, default_enabled: false, }, JoinIrTargetDesc { func_name: "StageBBodyExtractorBox.build_body_src/2", kind: JoinIrBridgeKind::LowerOnly, default_enabled: false, }, JoinIrTargetDesc { func_name: "StageBFuncScannerBox.scan_all_boxes/1", kind: JoinIrBridgeKind::LowerOnly, default_enabled: false, }, ]; /// Phase 32 L-4: テーブルから対象関数を探す pub(crate) fn find_joinir_target(module: &MirModule) -> Option<&'static JoinIrTargetDesc> { JOINIR_TARGETS .iter() .find(|target| module.functions.contains_key(target.func_name)) }