#[must_use]
#[deprecated(
note = "reference oracle only; production code must dispatch the Weir Program on a concrete GPU backend or use weir::oracle for parity evidence"
)]
pub(crate) fn callgraph_build_cpu(
direct_edges: &[u32],
indirect_sites: &[u32],
pts_closure: &[u32],
node_count: u32,
) -> Vec<u32> {
let words = crate::graph_layout::LinearDomain::new(node_count).bitset_words() as usize;
crate::dispatch_decode::require_bitset_words(
"callgraph_build_cpu direct_edges",
direct_edges,
words,
)
.expect("callgraph_build CPU oracle received malformed direct edge bitset");
crate::dispatch_decode::require_bitset_words(
"callgraph_build_cpu indirect_sites",
indirect_sites,
words,
)
.expect("callgraph_build CPU oracle received malformed indirect-site bitset");
crate::dispatch_decode::require_bitset_words(
"callgraph_build_cpu pts_closure",
pts_closure,
words,
)
.expect("callgraph_build CPU oracle received malformed points-to closure bitset");
let mut out = crate::staging_reserve::reserved_vec(words, "callgraph CPU oracle output")
.unwrap_or_else(|error| panic!("callgraph CPU oracle output reservation failed: {error}"));
for idx in 0..words {
out.push(direct_edges[idx] | (indirect_sites[idx] & pts_closure[idx]));
}
out
}
#[cfg(test)]
#[allow(deprecated)]
mod tests {
use super::callgraph_build_cpu;
#[test]
#[should_panic(expected = "callgraph_build CPU oracle received malformed direct edge bitset")]
fn callgraph_build_rejects_bad_direct_edges() {
let _ = callgraph_build_cpu(&[0b1, 0b0], &[0b1], &[0b1], 2);
}
#[test]
#[should_panic(expected = "callgraph_build CPU oracle received malformed indirect-site bitset")]
fn callgraph_build_rejects_bad_indirect_sites() {
let _ = callgraph_build_cpu(&[0b1], &[0b1, 0b0], &[0b1], 2);
}
#[test]
#[should_panic(
expected = "callgraph_build CPU oracle received malformed points-to closure bitset"
)]
fn callgraph_build_rejects_bad_pts_closure() {
let _ = callgraph_build_cpu(&[0b1], &[0b1], &[0b1, 0b0], 2);
}
}