Coverage Report

Created: 2026-08-15 07:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/regalloc2/src/ion/dump.rs
Line
Count
Source
1
//! Debugging output.
2
3
use alloc::string::ToString;
4
use alloc::{format, vec};
5
use alloc::{string::String, vec::Vec};
6
7
use super::Env;
8
use crate::{Block, Function, ProgPoint};
9
10
impl<'a, F: Function> Env<'a, F> {
11
0
    pub fn dump_state(&self) {
12
0
        trace!("Bundles:");
13
0
        for (i, b) in self.bundles.iter().enumerate() {
14
0
            trace!(
15
                "bundle{}: spillset={:?} alloc={:?}",
16
                i,
17
                b.spillset,
18
                b.allocation
19
            );
20
0
            for entry in &b.ranges {
21
0
                trace!(
22
                    " * range {:?} -- {:?}: range{}",
23
                    entry.range.from,
24
                    entry.range.to,
25
0
                    entry.index.index()
26
                );
27
            }
28
        }
29
0
        trace!("VRegs:");
30
0
        for (i, v) in self.vregs.iter().enumerate() {
31
0
            trace!("vreg{}:", i);
32
0
            for entry in &v.ranges {
33
0
                trace!(
34
                    " * range {:?} -- {:?}: range{}",
35
                    entry.range.from,
36
                    entry.range.to,
37
0
                    entry.index.index()
38
                );
39
            }
40
        }
41
0
        trace!("Ranges:");
42
0
        for (i, r) in self.ranges.iter().enumerate() {
43
0
            trace!(
44
                "range{}: range={:?} vreg={:?} bundle={:?} weight={:?}",
45
                i,
46
                r.range,
47
                r.vreg,
48
                r.bundle,
49
0
                r.uses_spill_weight(),
50
            );
51
0
            for u in &r.uses {
52
0
                trace!(" * use at {:?} (slot {}): {:?}", u.pos, u.slot, u.operand);
53
            }
54
        }
55
0
    }
56
57
0
    pub fn annotate(&mut self, progpoint: ProgPoint, s: String) {
58
0
        if self.annotations_enabled {
59
0
            self.debug_annotations
60
0
                .entry(progpoint)
61
0
                .or_insert_with(|| vec![])
62
0
                .push(s);
63
0
        }
64
0
    }
65
66
0
    pub fn dump_results(&self) {
67
0
        log::info!("=== REGALLOC RESULTS ===");
68
0
        for block in 0..self.func.num_blocks() {
69
0
            let block = Block::new(block);
70
0
            log::info!(
71
                "block{}: [succs {:?} preds {:?}]",
72
0
                block.index(),
73
0
                self.func
74
0
                    .block_succs(block)
75
0
                    .iter()
76
0
                    .map(|b| b.index())
77
0
                    .collect::<Vec<_>>(),
78
0
                self.func
79
0
                    .block_preds(block)
80
0
                    .iter()
81
0
                    .map(|b| b.index())
82
0
                    .collect::<Vec<_>>()
83
            );
84
0
            for inst in self.func.block_insns(block).iter() {
85
0
                for annotation in self
86
0
                    .debug_annotations
87
0
                    .get(&ProgPoint::before(inst))
88
0
                    .map(|v| &v[..])
89
0
                    .unwrap_or(&[])
90
                {
91
0
                    log::info!("  inst{}-pre: {}", inst.index(), annotation);
92
                }
93
0
                let ops = self
94
0
                    .func
95
0
                    .inst_operands(inst)
96
0
                    .iter()
97
0
                    .map(|op| format!("{}", op))
98
0
                    .collect::<Vec<_>>();
99
0
                let clobbers = self
100
0
                    .func
101
0
                    .inst_clobbers(inst)
102
0
                    .into_iter()
103
0
                    .map(|preg| format!("{}", preg))
104
0
                    .collect::<Vec<_>>();
105
0
                let allocs = (0..ops.len())
106
0
                    .map(|i| format!("{}", self.get_alloc(inst, i)))
107
0
                    .collect::<Vec<_>>();
108
0
                let opname = if self.func.is_branch(inst) {
109
0
                    "br"
110
0
                } else if self.func.is_ret(inst) {
111
0
                    "ret"
112
                } else {
113
0
                    "op"
114
                };
115
0
                let args = ops
116
0
                    .iter()
117
0
                    .zip(allocs.iter())
118
0
                    .map(|(op, alloc)| format!("{} [{}]", op, alloc))
119
0
                    .collect::<Vec<_>>();
120
0
                let clobbers = if clobbers.is_empty() {
121
0
                    "".to_string()
122
                } else {
123
0
                    format!(" [clobber: {}]", clobbers.join(", "))
124
                };
125
0
                log::info!(
126
                    "  inst{}: {} {}{}",
127
0
                    inst.index(),
128
                    opname,
129
0
                    args.join(", "),
130
                    clobbers
131
                );
132
0
                for annotation in self
133
0
                    .debug_annotations
134
0
                    .get(&ProgPoint::after(inst))
135
0
                    .map(|v| &v[..])
136
0
                    .unwrap_or(&[])
137
                {
138
0
                    log::info!("  inst{}-post: {}", inst.index(), annotation);
139
                }
140
            }
141
        }
142
0
    }
143
}