2025-09-28 12:19:49 +09:00
|
|
|
|
use super::super::{BasicBlockId, MirBuilder, ValueId};
|
|
|
|
|
|
|
|
|
|
|
|
/// Emit a dev‑only JSONL event for a PHI decision.
|
|
|
|
|
|
/// Computes predecessor meta(type/origin)from the builder’s current maps.
|
|
|
|
|
|
pub(crate) fn emit_phi(builder: &MirBuilder, dst: ValueId, inputs: &Vec<(BasicBlockId, ValueId)>) {
|
|
|
|
|
|
// Respect env gates in hub; just build meta here.
|
|
|
|
|
|
let preds: Vec<serde_json::Value> = inputs
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
.map(|(bb, v)| {
|
2025-12-15 23:27:24 +09:00
|
|
|
|
let t = builder.type_ctx.value_types.get(v).cloned();
|
|
|
|
|
|
let o = builder.type_ctx.value_origin_newbox.get(v).cloned();
|
2025-09-28 12:19:49 +09:00
|
|
|
|
serde_json::json!({
|
|
|
|
|
|
"bb": bb.0,
|
|
|
|
|
|
"v": v.0,
|
|
|
|
|
|
"type": t.as_ref().map(|tt| format!("{:?}", tt)).unwrap_or_default(),
|
|
|
|
|
|
"origin": o.unwrap_or_default(),
|
|
|
|
|
|
})
|
|
|
|
|
|
})
|
|
|
|
|
|
.collect();
|
|
|
|
|
|
let decided_t = builder
|
2025-12-15 23:27:24 +09:00
|
|
|
|
.type_ctx.value_types
|
2025-09-28 12:19:49 +09:00
|
|
|
|
.get(&dst)
|
|
|
|
|
|
.cloned()
|
|
|
|
|
|
.map(|tt| format!("{:?}", tt))
|
|
|
|
|
|
.unwrap_or_default();
|
|
|
|
|
|
let decided_o = builder
|
2025-12-15 23:27:24 +09:00
|
|
|
|
.type_ctx.value_origin_newbox
|
2025-09-28 12:19:49 +09:00
|
|
|
|
.get(&dst)
|
|
|
|
|
|
.cloned()
|
|
|
|
|
|
.unwrap_or_default();
|
|
|
|
|
|
let meta = serde_json::json!({
|
|
|
|
|
|
"dst": dst.0,
|
|
|
|
|
|
"preds": preds,
|
|
|
|
|
|
"decided_type": decided_t,
|
|
|
|
|
|
"decided_origin": decided_o,
|
|
|
|
|
|
});
|
|
|
|
|
|
let fn_name = builder
|
|
|
|
|
|
.current_function
|
|
|
|
|
|
.as_ref()
|
|
|
|
|
|
.map(|f| f.signature.name.as_str());
|
|
|
|
|
|
let region = builder.debug_current_region_id();
|
|
|
|
|
|
crate::debug::hub::emit("ssa", "phi", fn_name, region.as_deref(), meta);
|
|
|
|
|
|
}
|