/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 | | } |