Record that `consumer` delta-unfolds the body of `producer`. Self-edges are ignored. Ensures both endpoints exist as blocks (with zeroed stats if not yet seen) so the graph is well-formed even if a producer is only ever referenced, never directly checked.
(&mut self, consumer: Address, producer: Address)
| 397 | /// Phase A (the kernel recorder) feeds this with one `block(..)` per checked |
| 398 | /// block and one `delta_edge(consumer, producer)` per recorded cross-block |
| 399 | /// unfold. The builder is the merge point for per-worker accumulators: calling |
| 400 | /// `block`/`delta_edge` is commutative and idempotent w.r.t. edge sets, so |
| 401 | /// merge order does not affect the result. |
| 402 | #[derive(Default)] |
| 403 | pub struct ProfileBuilder { |
| 404 | blocks: FxHashMap<Address, Accum>, |
| 405 | } |
| 406 | |
| 407 | #[derive(Default)] |
| 408 | struct Accum { |