Files
hakorune/src/mir/builder/observe/ssa.rs

44 lines
1.5 KiB
Rust
Raw Normal View History

use super::super::{BasicBlockId, MirBuilder, ValueId};
/// Emit a devonly JSONL event for a PHI decision.
/// Computes predecessor metatype/originfrom the builders 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)| {
let t = builder.type_ctx.value_types.get(v).cloned();
let o = builder.type_ctx.value_origin_newbox.get(v).cloned();
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
.type_ctx.value_types
.get(&dst)
.cloned()
.map(|tt| format!("{:?}", tt))
.unwrap_or_default();
let decided_o = builder
.type_ctx.value_origin_newbox
.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);
}