0000: 2f 2f 21 20 48 6f 6f 6b 20 69 6e 74 6f 20 6c 69 //! Hook into li
0010: 62 67 72 61 70 68 76 69 7a 20 66 6f 72 20 72 65 bgraphviz for re
0020: 6e 64 65 72 69 6e 67 20 64 61 74 61 66 6c 6f 77 ndering dataflow
0030: 20 67 72 61 70 68 73 20 66 6f 72 20 4d 49 52 2e graphs for MIR.
0040: 0a 0a 75 73 65 20 72 75 73 74 63 3a 3a 68 69 72 ..use rustc::hir
0050: 3a 3a 64 65 66 5f 69 64 3a 3a 44 65 66 49 64 3b ::def_id::DefId;
0060: 0a 75 73 65 20 72 75 73 74 63 3a 3a 6d 69 72 3a .use rustc::mir:
0070: 3a 7b 42 61 73 69 63 42 6c 6f 63 6b 2c 20 42 6f :{BasicBlock, Bo
0080: 64 79 7d 3b 0a 0a 75 73 65 20 73 74 64 3a 3a 66 dy};..use std::f
0090: 73 3b 0a 75 73 65 20 73 74 64 3a 3a 69 6f 3b 0a s;.use std::io;.
00a0: 75 73 65 20 73 74 64 3a 3a 6d 61 72 6b 65 72 3a use std::marker:
00b0: 3a 50 68 61 6e 74 6f 6d 44 61 74 61 3b 0a 75 73 :PhantomData;.us
00c0: 65 20 73 74 64 3a 3a 70 61 74 68 3a 3a 50 61 74 e std::path::Pat
00d0: 68 3b 0a 0a 75 73 65 20 63 72 61 74 65 3a 3a 75 h;..use crate::u
00e0: 74 69 6c 3a 3a 67 72 61 70 68 76 69 7a 5f 73 61 til::graphviz_sa
00f0: 66 65 5f 64 65 66 5f 6e 61 6d 65 3b 0a 0a 75 73 fe_def_name;..us
0100: 65 20 73 75 70 65 72 3a 3a 7b 42 69 74 44 65 6e e super::{BitDen
0110: 6f 74 61 74 69 6f 6e 2c 20 44 61 74 61 66 6c 6f otation, Dataflo
0120: 77 53 74 61 74 65 7d 3b 0a 75 73 65 20 73 75 70 wState};.use sup
0130: 65 72 3a 3a 44 61 74 61 66 6c 6f 77 42 75 69 6c er::DataflowBuil
0140: 64 65 72 3b 0a 75 73 65 20 73 75 70 65 72 3a 3a der;.use super::
0150: 44 65 62 75 67 46 6f 72 6d 61 74 74 65 64 3b 0a DebugFormatted;.
0160: 0a 70 75 62 20 74 72 61 69 74 20 4d 69 72 57 69 .pub trait MirWi
0170: 74 68 46 6c 6f 77 53 74 61 74 65 3c 27 74 63 78 thFlowState<'tcx
0180: 3e 20 7b 0a 20 20 20 20 74 79 70 65 20 42 44 3a > {. type BD:
0190: 20 42 69 74 44 65 6e 6f 74 61 74 69 6f 6e 3c 27 BitDenotation<'
01a0: 74 63 78 3e 3b 0a 20 20 20 20 66 6e 20 64 65 66 tcx>;. fn def
01b0: 5f 69 64 28 26 73 65 6c 66 29 20 2d 3e 20 44 65 _id(&self) -> De
01c0: 66 49 64 3b 0a 20 20 20 20 66 6e 20 62 6f 64 79 fId;. fn body
01d0: 28 26 73 65 6c 66 29 20 2d 3e 20 26 42 6f 64 79 (&self) -> &Body
01e0: 3c 27 74 63 78 3e 3b 0a 20 20 20 20 66 6e 20 66 <'tcx>;. fn f
01f0: 6c 6f 77 5f 73 74 61 74 65 28 26 73 65 6c 66 29 low_state(&self)
0200: 20 2d 3e 20 26 44 61 74 61 66 6c 6f 77 53 74 61 -> &DataflowSta
0210: 74 65 3c 27 74 63 78 2c 20 53 65 6c 66 3a 3a 42 te<'tcx, Self::B
0220: 44 3e 3b 0a 7d 0a 0a 69 6d 70 6c 3c 27 61 2c 20 D>;.}..impl<'a,
0230: 27 74 63 78 2c 20 42 44 3e 20 4d 69 72 57 69 74 'tcx, BD> MirWit
0240: 68 46 6c 6f 77 53 74 61 74 65 3c 27 74 63 78 3e hFlowState<'tcx>
0250: 20 66 6f 72 20 44 61 74 61 66 6c 6f 77 42 75 69 for DataflowBui
0260: 6c 64 65 72 3c 27 61 2c 20 27 74 63 78 2c 20 42 lder<'a, 'tcx, B
0270: 44 3e 0a 20 20 20 20 77 68 65 72 65 20 42 44 3a D>. where BD:
0280: 20 42 69 74 44 65 6e 6f 74 61 74 69 6f 6e 3c 27 BitDenotation<'
0290: 74 63 78 3e 0a 7b 0a 20 20 20 20 74 79 70 65 20 tcx>.{. type
02a0: 42 44 20 3d 20 42 44 3b 0a 20 20 20 20 66 6e 20 BD = BD;. fn
02b0: 64 65 66 5f 69 64 28 26 73 65 6c 66 29 20 2d 3e def_id(&self) ->
02c0: 20 44 65 66 49 64 20 7b 20 73 65 6c 66 2e 64 65 DefId { self.de
02d0: 66 5f 69 64 20 7d 0a 20 20 20 20 66 6e 20 62 6f f_id }. fn bo
02e0: 64 79 28 26 73 65 6c 66 29 20 2d 3e 20 26 42 6f dy(&self) -> &Bo
02f0: 64 79 3c 27 74 63 78 3e 20 7b 20 73 65 6c 66 2e dy<'tcx> { self.
0300: 66 6c 6f 77 5f 73 74 61 74 65 2e 62 6f 64 79 28 flow_state.body(
0310: 29 20 7d 0a 20 20 20 20 66 6e 20 66 6c 6f 77 5f ) }. fn flow_
0320: 73 74 61 74 65 28 26 73 65 6c 66 29 20 2d 3e 20 state(&self) ->
0330: 26 44 61 74 61 66 6c 6f 77 53 74 61 74 65 3c 27 &DataflowState<'
0340: 74 63 78 2c 20 53 65 6c 66 3a 3a 42 44 3e 20 7b tcx, Self::BD> {
0350: 20 26 73 65 6c 66 2e 66 6c 6f 77 5f 73 74 61 74 &self.flow_stat
0360: 65 2e 66 6c 6f 77 5f 73 74 61 74 65 20 7d 0a 7d e.flow_state }.}
0370: 0a 0a 73 74 72 75 63 74 20 47 72 61 70 68 3c 27 ..struct Graph<'
0380: 61 2c 20 27 74 63 78 2c 20 4d 57 46 2c 20 50 3e a, 'tcx, MWF, P>
0390: 20 77 68 65 72 65 0a 20 20 20 20 4d 57 46 3a 20 where. MWF:
03a0: 4d 69 72 57 69 74 68 46 6c 6f 77 53 74 61 74 65 MirWithFlowState
03b0: 3c 27 74 63 78 3e 0a 7b 0a 20 20 20 20 6d 62 63 <'tcx>.{. mbc
03c0: 78 3a 20 26 27 61 20 4d 57 46 2c 0a 20 20 20 20 x: &'a MWF,.
03d0: 70 68 61 6e 74 6f 6d 3a 20 50 68 61 6e 74 6f 6d phantom: Phantom
03e0: 44 61 74 61 3c 26 27 74 63 78 20 28 29 3e 2c 0a Data<&'tcx ()>,.
03f0: 20 20 20 20 72 65 6e 64 65 72 5f 69 64 78 3a 20 render_idx:
0400: 50 2c 0a 7d 0a 0a 70 75 62 28 63 72 61 74 65 29 P,.}..pub(crate)
0410: 20 66 6e 20 70 72 69 6e 74 5f 62 6f 72 72 6f 77 fn print_borrow
0420: 63 6b 5f 67 72 61 70 68 5f 74 6f 3c 27 61 2c 20 ck_graph_to<'a,
0430: 27 74 63 78 2c 20 42 44 2c 20 50 3e 28 0a 20 20 'tcx, BD, P>(.
0440: 20 20 6d 62 63 78 3a 20 26 44 61 74 61 66 6c 6f mbcx: &Dataflo
0450: 77 42 75 69 6c 64 65 72 3c 27 61 2c 20 27 74 63 wBuilder<'a, 'tc
0460: 78 2c 20 42 44 3e 2c 0a 20 20 20 20 70 61 74 68 x, BD>,. path
0470: 3a 20 26 50 61 74 68 2c 0a 20 20 20 20 72 65 6e : &Path,. ren
0480: 64 65 72 5f 69 64 78 3a 20 50 29 0a 20 20 20 20 der_idx: P).
0490: 2d 3e 20 69 6f 3a 3a 52 65 73 75 6c 74 3c 28 29 -> io::Result<()
04a0: 3e 0a 20 20 20 20 77 68 65 72 65 20 42 44 3a 20 >. where BD:
04b0: 42 69 74 44 65 6e 6f 74 61 74 69 6f 6e 3c 27 74 BitDenotation<'t
04c0: 63 78 3e 2c 0a 20 20 20 20 20 20 20 20 20 20 50 cx>,. P
04d0: 3a 20 46 6e 28 26 42 44 2c 20 42 44 3a 3a 49 64 : Fn(&BD, BD::Id
04e0: 78 29 20 2d 3e 20 44 65 62 75 67 46 6f 72 6d 61 x) -> DebugForma
04f0: 74 74 65 64 2c 0a 7b 0a 20 20 20 20 6c 65 74 20 tted,.{. let
0500: 67 20 3d 20 47 72 61 70 68 20 7b 20 6d 62 63 78 g = Graph { mbcx
0510: 2c 20 70 68 61 6e 74 6f 6d 3a 20 50 68 61 6e 74 , phantom: Phant
0520: 6f 6d 44 61 74 61 2c 20 72 65 6e 64 65 72 5f 69 omData, render_i
0530: 64 78 20 7d 3b 0a 20 20 20 20 6c 65 74 20 6d 75 dx };. let mu
0540: 74 20 76 20 3d 20 56 65 63 3a 3a 6e 65 77 28 29 t v = Vec::new()
0550: 3b 0a 20 20 20 20 64 6f 74 3a 3a 72 65 6e 64 65 ;. dot::rende
0560: 72 28 26 67 2c 20 26 6d 75 74 20 76 29 3f 3b 0a r(&g, &mut v)?;.
0570: 20 20 20 20 64 65 62 75 67 21 28 22 70 72 69 6e debug!("prin
0580: 74 5f 62 6f 72 72 6f 77 63 6b 5f 67 72 61 70 68 t_borrowck_graph
0590: 5f 74 6f 20 70 61 74 68 3a 20 7b 7d 20 64 65 66 _to path: {} def
05a0: 5f 69 64 3a 20 7b 3a 3f 7d 22 2c 0a 20 20 20 20 _id: {:?}",.
05b0: 20 20 20 20 20 20 20 70 61 74 68 2e 64 69 73 70 path.disp
05c0: 6c 61 79 28 29 2c 20 6d 62 63 78 2e 64 65 66 5f lay(), mbcx.def_
05d0: 69 64 29 3b 0a 20 20 20 20 66 73 3a 3a 77 72 69 id);. fs::wri
05e0: 74 65 28 70 61 74 68 2c 20 76 29 0a 7d 0a 0a 70 te(path, v).}..p
05f0: 75 62 20 74 79 70 65 20 4e 6f 64 65 20 3d 20 42 ub type Node = B
0600: 61 73 69 63 42 6c 6f 63 6b 3b 0a 0a 23 5b 64 65 asicBlock;..#[de
0610: 72 69 76 65 28 43 6f 70 79 2c 20 43 6c 6f 6e 65 rive(Copy, Clone
0620: 2c 20 50 61 72 74 69 61 6c 45 71 2c 20 45 71 2c , PartialEq, Eq,
0630: 20 44 65 62 75 67 29 5d 0a 70 75 62 20 73 74 72 Debug)].pub str
0640: 75 63 74 20 45 64 67 65 20 7b 20 73 6f 75 72 63 uct Edge { sourc
0650: 65 3a 20 42 61 73 69 63 42 6c 6f 63 6b 2c 20 69 e: BasicBlock, i
0660: 6e 64 65 78 3a 20 75 73 69 7a 65 20 7d 0a 0a 66 ndex: usize }..f
0670: 6e 20 6f 75 74 67 6f 69 6e 67 28 62 6f 64 79 3a n outgoing(body:
0680: 20 26 42 6f 64 79 3c 27 5f 3e 2c 20 62 62 3a 20 &Body<'_>, bb:
0690: 42 61 73 69 63 42 6c 6f 63 6b 29 20 2d 3e 20 56 BasicBlock) -> V
06a0: 65 63 3c 45 64 67 65 3e 20 7b 0a 20 20 20 20 28 ec<Edge> {. (
06b0: 30 2e 2e 62 6f 64 79 5b 62 62 5d 2e 74 65 72 6d 0..body[bb].term
06c0: 69 6e 61 74 6f 72 28 29 2e 73 75 63 63 65 73 73 inator().success
06d0: 6f 72 73 28 29 2e 63 6f 75 6e 74 28 29 29 0a 20 ors().count()).
06e0: 20 20 20 20 20 20 20 2e 6d 61 70 28 7c 69 6e 64 .map(|ind
06f0: 65 78 7c 20 45 64 67 65 20 7b 20 73 6f 75 72 63 ex| Edge { sourc
0700: 65 3a 20 62 62 2c 20 69 6e 64 65 78 3a 20 69 6e e: bb, index: in
0710: 64 65 78 7d 29 2e 63 6f 6c 6c 65 63 74 28 29 0a dex}).collect().
0720: 7d 0a 0a 69 6d 70 6c 3c 27 61 2c 20 27 74 63 78 }..impl<'a, 'tcx
0730: 2c 20 4d 57 46 2c 20 50 3e 20 64 6f 74 3a 3a 4c , MWF, P> dot::L
0740: 61 62 65 6c 6c 65 72 3c 27 61 3e 20 66 6f 72 20 abeller<'a> for
0750: 47 72 61 70 68 3c 27 61 2c 20 27 74 63 78 2c 20 Graph<'a, 'tcx,
0760: 4d 57 46 2c 20 50 3e 0a 20 20 20 20 77 68 65 72 MWF, P>. wher
0770: 65 20 4d 57 46 3a 20 4d 69 72 57 69 74 68 46 6c e MWF: MirWithFl
0780: 6f 77 53 74 61 74 65 3c 27 74 63 78 3e 2c 0a 20 owState<'tcx>,.
0790: 20 20 20 20 20 20 20 20 20 50 3a 20 46 6e 28 26 P: Fn(&
07a0: 4d 57 46 3a 3a 42 44 2c 20 3c 4d 57 46 3a 3a 42 MWF::BD, <MWF::B
07b0: 44 20 61 73 20 42 69 74 44 65 6e 6f 74 61 74 69 D as BitDenotati
07c0: 6f 6e 3c 27 74 63 78 3e 3e 3a 3a 49 64 78 29 20 on<'tcx>>::Idx)
07d0: 2d 3e 20 44 65 62 75 67 46 6f 72 6d 61 74 74 65 -> DebugFormatte
07e0: 64 2c 0a 7b 0a 20 20 20 20 74 79 70 65 20 4e 6f d,.{. type No
07f0: 64 65 20 3d 20 4e 6f 64 65 3b 0a 20 20 20 20 74 de = Node;. t
0800: 79 70 65 20 45 64 67 65 20 3d 20 45 64 67 65 3b ype Edge = Edge;
0810: 0a 20 20 20 20 66 6e 20 67 72 61 70 68 5f 69 64 . fn graph_id
0820: 28 26 73 65 6c 66 29 20 2d 3e 20 64 6f 74 3a 3a (&self) -> dot::
0830: 49 64 3c 27 5f 3e 20 7b 0a 20 20 20 20 20 20 20 Id<'_> {.
0840: 20 6c 65 74 20 6e 61 6d 65 20 3d 20 67 72 61 70 let name = grap
0850: 68 76 69 7a 5f 73 61 66 65 5f 64 65 66 5f 6e 61 hviz_safe_def_na
0860: 6d 65 28 73 65 6c 66 2e 6d 62 63 78 2e 64 65 66 me(self.mbcx.def
0870: 5f 69 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20 _id());.
0880: 64 6f 74 3a 3a 49 64 3a 3a 6e 65 77 28 66 6f 72 dot::Id::new(for
0890: 6d 61 74 21 28 22 67 72 61 70 68 5f 66 6f 72 5f mat!("graph_for_
08a0: 64 65 66 5f 69 64 5f 7b 7d 22 2c 20 6e 61 6d 65 def_id_{}", name
08b0: 29 29 2e 75 6e 77 72 61 70 28 29 0a 20 20 20 20 )).unwrap().
08c0: 7d 0a 0a 20 20 20 20 66 6e 20 6e 6f 64 65 5f 69 }.. fn node_i
08d0: 64 28 26 73 65 6c 66 2c 20 6e 3a 20 26 4e 6f 64 d(&self, n: &Nod
08e0: 65 29 20 2d 3e 20 64 6f 74 3a 3a 49 64 3c 27 5f e) -> dot::Id<'_
08f0: 3e 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 74 3a > {. dot:
0900: 3a 49 64 3a 3a 6e 65 77 28 66 6f 72 6d 61 74 21 :Id::new(format!
0910: 28 22 62 62 5f 7b 7d 22 2c 20 6e 2e 69 6e 64 65 ("bb_{}", n.inde
0920: 78 28 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 x())).
0930: 20 20 2e 75 6e 77 72 61 70 28 29 0a 20 20 20 20 .unwrap().
0940: 7d 0a 0a 20 20 20 20 66 6e 20 6e 6f 64 65 5f 6c }.. fn node_l
0950: 61 62 65 6c 28 26 73 65 6c 66 2c 20 6e 3a 20 26 abel(&self, n: &
0960: 4e 6f 64 65 29 20 2d 3e 20 64 6f 74 3a 3a 4c 61 Node) -> dot::La
0970: 62 65 6c 54 65 78 74 3c 27 5f 3e 20 7b 0a 20 20 belText<'_> {.
0980: 20 20 20 20 20 20 2f 2f 20 4e 6f 64 65 20 6c 61 // Node la
0990: 62 65 6c 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 bel is something
09a0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 like this:.
09b0: 20 20 20 20 2f 2f 20 2b 2d 2d 2d 2d 2d 2d 2d 2d // +--------
09c0: 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d -+--------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09e0: 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----+-----------
09f0: 2d 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d -------+--------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 0a 20 20 20 20 ----------+.
0a10: 20 20 20 20 2f 2f 20 7c 20 45 4e 54 52 59 20 20 // | ENTRY
0a20: 20 7c 20 4d 49 52 20 20 20 20 20 20 20 20 20 20 | MIR
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0a40: 20 20 20 20 7c 20 47 45 4e 20 20 20 20 20 20 20 | GEN
0a50: 20 20 20 20 20 20 20 7c 20 4b 49 4c 4c 20 20 20 | KILL
0a60: 20 20 20 20 20 20 20 20 20 20 7c 0a 20 20 20 20 |.
0a70: 20 20 20 20 2f 2f 20 2b 2d 2d 2d 2d 2d 2d 2d 2d // +--------
0a80: 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d -+--------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0aa0: 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----+-----------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d -------+--------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 0a 20 20 20 20 ----------+.
0ad0: 20 20 20 20 2f 2f 20 7c 20 20 20 20 20 20 20 20 // |
0ae0: 20 7c 20 20 30 3a 20 53 74 6f 72 61 67 65 4c 69 | 0: StorageLi
0af0: 76 65 28 5f 37 29 20 20 20 20 20 20 20 20 20 20 ve(_7)
0b00: 20 20 20 20 7c 20 62 62 33 5b 32 5d 3a 20 72 65 | bb3[2]: re
0b10: 73 65 72 76 65 64 20 7c 20 62 62 32 5b 30 5d 3a served | bb2[0]:
0b20: 20 72 65 73 65 72 76 65 64 20 7c 0a 20 20 20 20 reserved |.
0b30: 20 20 20 20 2f 2f 20 7c 20 20 20 20 20 20 20 20 // |
0b40: 20 7c 20 20 31 3a 20 53 74 6f 72 61 67 65 4c 69 | 1: StorageLi
0b50: 76 65 28 5f 38 29 20 20 20 20 20 20 20 20 20 20 ve(_8)
0b60: 20 20 20 20 7c 20 62 62 33 5b 32 5d 3a 20 61 63 | bb3[2]: ac
0b70: 74 69 76 65 20 20 20 7c 20 62 62 32 5b 30 5d 3a tive | bb2[0]:
0b80: 20 61 63 74 69 76 65 20 20 20 7c 0a 20 20 20 20 active |.
0b90: 20 20 20 20 2f 2f 20 7c 20 20 20 20 20 20 20 20 // |
0ba0: 20 7c 20 20 32 3a 20 5f 38 20 3d 20 26 6d 75 74 | 2: _8 = &mut
0bb0: 20 5f 31 20 20 20 20 20 20 20 20 20 20 20 20 20 _1
0bc0: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 |
0bd0: 20 20 20 20 20 20 20 7c 20 62 62 34 5b 32 5d 3a | bb4[2]:
0be0: 20 72 65 73 65 72 76 65 64 20 7c 0a 20 20 20 20 reserved |.
0bf0: 20 20 20 20 2f 2f 20 7c 20 20 20 20 20 20 20 20 // |
0c00: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c20: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 |
0c30: 20 20 20 20 20 20 20 7c 20 62 62 34 5b 32 5d 3a | bb4[2]:
0c40: 20 61 63 74 69 76 65 20 20 20 7c 0a 20 20 20 20 active |.
0c50: 20 20 20 20 2f 2f 20 7c 20 20 20 20 20 20 20 20 // |
0c60: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c80: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 |
0c90: 20 20 20 20 20 20 20 7c 20 62 62 39 5b 30 5d 3a | bb9[0]:
0ca0: 20 72 65 73 65 72 76 65 64 20 7c 0a 20 20 20 20 reserved |.
0cb0: 20 20 20 20 2f 2f 20 7c 20 20 20 20 20 20 20 20 // |
0cc0: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ce0: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 |
0cf0: 20 20 20 20 20 20 20 7c 20 62 62 39 5b 30 5d 3a | bb9[0]:
0d00: 20 61 63 74 69 76 65 20 20 20 7c 0a 20 20 20 20 active |.
0d10: 20 20 20 20 2f 2f 20 7c 20 20 20 20 20 20 20 20 // |
0d20: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d40: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 |
0d50: 20 20 20 20 20 20 20 7c 20 62 62 31 30 5b 30 5d | bb10[0]
0d60: 3a 20 72 65 73 65 72 76 65 64 7c 0a 20 20 20 20 : reserved|.
0d70: 20 20 20 20 2f 2f 20 7c 20 20 20 20 20 20 20 20 // |
0d80: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0da0: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 |
0db0: 20 20 20 20 20 20 20 7c 20 62 62 31 30 5b 30 5d | bb10[0]
0dc0: 3a 20 61 63 74 69 76 65 20 20 7c 0a 20 20 20 20 : active |.
0dd0: 20 20 20 20 2f 2f 20 7c 20 20 20 20 20 20 20 20 // |
0de0: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0e00: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 |
0e10: 20 20 20 20 20 20 20 7c 20 62 62 31 31 5b 30 5d | bb11[0]
0e20: 3a 20 72 65 73 65 72 76 65 64 7c 0a 20 20 20 20 : reserved|.
0e30: 20 20 20 20 2f 2f 20 7c 20 20 20 20 20 20 20 20 // |
0e40: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0e60: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 |
0e70: 20 20 20 20 20 20 20 7c 20 62 62 31 31 5b 30 5d | bb11[0]
0e80: 3a 20 61 63 74 69 76 65 20 20 7c 0a 20 20 20 20 : active |.
0e90: 20 20 20 20 2f 2f 20 2b 2d 2d 2d 2d 2d 2d 2d 2d // +--------
0ea0: 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d -+--------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ec0: 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----+-----------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d -------+--------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 0a 20 20 20 20 ----------+.
0ef0: 20 20 20 20 2f 2f 20 7c 20 5b 30 30 2d 30 30 5d // | [00-00]
0f00: 20 7c 20 5f 37 20 3d 20 63 6f 6e 73 74 20 46 6f | _7 = const Fo
0f10: 6f 3a 3a 74 77 69 64 64 6c 65 28 6d 6f 76 65 20 o::twiddle(move
0f20: 5f 38 29 20 7c 20 5b 30 63 2d 30 30 5d 20 20 20 _8) | [0c-00]
0f30: 20 20 20 20 20 20 20 7c 20 5b 66 33 2d 30 66 5d | [f3-0f]
0f40: 20 20 20 20 20 20 20 20 20 20 7c 0a 20 20 20 20 |.
0f50: 20 20 20 20 2f 2f 20 2b 2d 2d 2d 2d 2d 2d 2d 2d // +--------
0f60: 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d -+--------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f80: 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----+-----------
0f90: 2d 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d -------+--------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 0a 20 20 20 20 ----------+.
0fb0: 20 20 20 20 6c 65 74 20 6d 75 74 20 76 20 3d 20 let mut v =
0fc0: 56 65 63 3a 3a 6e 65 77 28 29 3b 0a 20 20 20 20 Vec::new();.
0fd0: 20 20 20 20 73 65 6c 66 2e 6e 6f 64 65 5f 6c 61 self.node_la
0fe0: 62 65 6c 5f 69 6e 74 65 72 6e 61 6c 28 6e 2c 20 bel_internal(n,
0ff0: 26 6d 75 74 20 76 2c 20 2a 6e 2c 20 73 65 6c 66 &mut v, *n, self
1000: 2e 6d 62 63 78 2e 62 6f 64 79 28 29 29 2e 75 6e .mbcx.body()).un
1010: 77 72 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20 wrap();.
1020: 64 6f 74 3a 3a 4c 61 62 65 6c 54 65 78 74 3a 3a dot::LabelText::
1030: 68 74 6d 6c 28 53 74 72 69 6e 67 3a 3a 66 72 6f html(String::fro
1040: 6d 5f 75 74 66 38 28 76 29 2e 75 6e 77 72 61 70 m_utf8(v).unwrap
1050: 28 29 29 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 ()). }...
1060: 66 6e 20 6e 6f 64 65 5f 73 68 61 70 65 28 26 73 fn node_shape(&s
1070: 65 6c 66 2c 20 5f 6e 3a 20 26 4e 6f 64 65 29 20 elf, _n: &Node)
1080: 2d 3e 20 4f 70 74 69 6f 6e 3c 64 6f 74 3a 3a 4c -> Option<dot::L
1090: 61 62 65 6c 54 65 78 74 3c 27 5f 3e 3e 20 7b 0a abelText<'_>> {.
10a0: 20 20 20 20 20 20 20 20 53 6f 6d 65 28 64 6f 74 Some(dot
10b0: 3a 3a 4c 61 62 65 6c 54 65 78 74 3a 3a 6c 61 62 ::LabelText::lab
10c0: 65 6c 28 22 6e 6f 6e 65 22 29 29 0a 20 20 20 20 el("none")).
10d0: 7d 0a 0a 20 20 20 20 66 6e 20 65 64 67 65 5f 6c }.. fn edge_l
10e0: 61 62 65 6c 28 26 27 61 20 73 65 6c 66 2c 20 65 abel(&'a self, e
10f0: 3a 20 26 45 64 67 65 29 20 2d 3e 20 64 6f 74 3a : &Edge) -> dot:
1100: 3a 4c 61 62 65 6c 54 65 78 74 3c 27 61 3e 20 7b :LabelText<'a> {
1110: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 74 65 72 . let ter
1120: 6d 20 3d 20 73 65 6c 66 2e 6d 62 63 78 2e 62 6f m = self.mbcx.bo
1130: 64 79 28 29 5b 65 2e 73 6f 75 72 63 65 5d 2e 74 dy()[e.source].t
1140: 65 72 6d 69 6e 61 74 6f 72 28 29 3b 0a 20 20 20 erminator();.
1150: 20 20 20 20 20 6c 65 74 20 6c 61 62 65 6c 20 3d let label =
1160: 20 26 74 65 72 6d 2e 6b 69 6e 64 2e 66 6d 74 5f &term.kind.fmt_
1170: 73 75 63 63 65 73 73 6f 72 5f 6c 61 62 65 6c 73 successor_labels
1180: 28 29 5b 65 2e 69 6e 64 65 78 5d 3b 0a 20 20 20 ()[e.index];.
1190: 20 20 20 20 20 64 6f 74 3a 3a 4c 61 62 65 6c 54 dot::LabelT
11a0: 65 78 74 3a 3a 6c 61 62 65 6c 28 6c 61 62 65 6c ext::label(label
11b0: 2e 63 6c 6f 6e 65 28 29 29 0a 20 20 20 20 7d 0a .clone()). }.
11c0: 7d 0a 0a 69 6d 70 6c 3c 27 61 2c 20 27 74 63 78 }..impl<'a, 'tcx
11d0: 2c 20 4d 57 46 2c 20 50 3e 20 47 72 61 70 68 3c , MWF, P> Graph<
11e0: 27 61 2c 20 27 74 63 78 2c 20 4d 57 46 2c 20 50 'a, 'tcx, MWF, P
11f0: 3e 0a 77 68 65 72 65 20 4d 57 46 3a 20 4d 69 72 >.where MWF: Mir
1200: 57 69 74 68 46 6c 6f 77 53 74 61 74 65 3c 27 74 WithFlowState<'t
1210: 63 78 3e 2c 0a 20 20 20 20 20 20 50 3a 20 46 6e cx>,. P: Fn
1220: 28 26 4d 57 46 3a 3a 42 44 2c 20 3c 4d 57 46 3a (&MWF::BD, <MWF:
1230: 3a 42 44 20 61 73 20 42 69 74 44 65 6e 6f 74 61 :BD as BitDenota
1240: 74 69 6f 6e 3c 27 74 63 78 3e 3e 3a 3a 49 64 78 tion<'tcx>>::Idx
1250: 29 20 2d 3e 20 44 65 62 75 67 46 6f 72 6d 61 74 ) -> DebugFormat
1260: 74 65 64 2c 0a 7b 0a 20 20 20 20 2f 2f 2f 20 47 ted,.{. /// G
1270: 65 6e 65 72 61 74 65 20 74 68 65 20 6e 6f 64 65 enerate the node
1280: 20 6c 61 62 65 6c 0a 20 20 20 20 66 6e 20 6e 6f label. fn no
1290: 64 65 5f 6c 61 62 65 6c 5f 69 6e 74 65 72 6e 61 de_label_interna
12a0: 6c 3c 57 3a 20 69 6f 3a 3a 57 72 69 74 65 3e 28 l<W: io::Write>(
12b0: 26 73 65 6c 66 2c 0a 20 20 20 20 20 20 20 20 20 &self,.
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12e0: 6e 3a 20 26 4e 6f 64 65 2c 0a 20 20 20 20 20 20 n: &Node,.
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1310: 20 20 20 77 3a 20 26 6d 75 74 20 57 2c 0a 20 20 w: &mut W,.
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1340: 20 20 20 20 20 20 20 62 6c 6f 63 6b 3a 20 42 61 block: Ba
1350: 73 69 63 42 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 sicBlock,.
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1380: 20 20 20 62 6f 64 79 3a 20 26 42 6f 64 79 3c 27 body: &Body<'
1390: 5f 3e 29 20 2d 3e 20 69 6f 3a 3a 52 65 73 75 6c _>) -> io::Resul
13a0: 74 3c 28 29 3e 20 7b 0a 20 20 20 20 20 20 20 20 t<()> {.
13b0: 2f 2f 20 48 65 61 64 65 72 20 72 6f 77 73 0a 20 // Header rows.
13c0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 48 44 52 const HDR
13d0: 53 3a 20 5b 26 73 74 72 3b 20 34 5d 20 3d 20 5b S: [&str; 4] = [
13e0: 22 45 4e 54 52 59 22 2c 20 22 4d 49 52 22 2c 20 "ENTRY", "MIR",
13f0: 22 42 4c 4f 43 4b 20 47 45 4e 53 22 2c 20 22 42 "BLOCK GENS", "B
1400: 4c 4f 43 4b 20 4b 49 4c 4c 53 22 5d 3b 0a 20 20 LOCK KILLS"];.
1410: 20 20 20 20 20 20 63 6f 6e 73 74 20 48 44 52 5f const HDR_
1420: 46 4d 54 3a 20 26 73 74 72 20 3d 20 22 62 67 63 FMT: &str = "bgc
1430: 6f 6c 6f 72 3d 5c 22 67 72 65 79 5c 22 22 3b 0a olor=\"grey\"";.
1440: 20 20 20 20 20 20 20 20 77 72 69 74 65 21 28 77 write!(w
1450: 2c 20 22 3c 74 61 62 6c 65 3e 3c 74 72 3e 3c 74 , "<table><tr><t
1460: 64 20 72 6f 77 73 70 61 6e 3d 5c 22 7b 7d 5c 22 d rowspan=\"{}\"
1470: 3e 22 2c 20 48 44 52 53 2e 6c 65 6e 28 29 29 3f >", HDRS.len())?
1480: 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 21 ;. write!
1490: 28 77 2c 20 22 7b 3a 3f 7d 22 2c 20 62 6c 6f 63 (w, "{:?}", bloc
14a0: 6b 2e 69 6e 64 65 78 28 29 29 3f 3b 0a 20 20 20 k.index())?;.
14b0: 20 20 20 20 20 77 72 69 74 65 21 28 77 2c 20 22 write!(w, "
14c0: 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 74 72 3e 22 29 </td></tr><tr>")
14d0: 3f 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 68 ?;. for h
14e0: 64 72 20 69 6e 20 26 48 44 52 53 20 7b 0a 20 20 dr in &HDRS {.
14f0: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21 write!
1500: 28 77 2c 20 22 3c 74 64 20 7b 7d 3e 7b 7d 3c 2f (w, "<td {}>{}</
1510: 74 64 3e 22 2c 20 48 44 52 5f 46 4d 54 2c 20 68 td>", HDR_FMT, h
1520: 64 72 29 3f 3b 0a 20 20 20 20 20 20 20 20 7d 0a dr)?;. }.
1530: 20 20 20 20 20 20 20 20 77 72 69 74 65 21 28 77 write!(w
1540: 2c 20 22 3c 2f 74 72 3e 22 29 3f 3b 0a 0a 20 20 , "</tr>")?;..
1550: 20 20 20 20 20 20 2f 2f 20 44 61 74 61 20 72 6f // Data ro
1560: 77 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 6e w. self.n
1570: 6f 64 65 5f 6c 61 62 65 6c 5f 76 65 72 62 6f 73 ode_label_verbos
1580: 65 5f 72 6f 77 28 6e 2c 20 77 2c 20 62 6c 6f 63 e_row(n, w, bloc
1590: 6b 2c 20 62 6f 64 79 29 3f 3b 0a 20 20 20 20 20 k, body)?;.
15a0: 20 20 20 73 65 6c 66 2e 6e 6f 64 65 5f 6c 61 62 self.node_lab
15b0: 65 6c 5f 66 69 6e 61 6c 5f 72 6f 77 28 6e 2c 20 el_final_row(n,
15c0: 77 2c 20 62 6c 6f 63 6b 2c 20 62 6f 64 79 29 3f w, block, body)?
15d0: 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 21 ;. write!
15e0: 28 77 2c 20 22 3c 2f 74 61 62 6c 65 3e 22 29 3f (w, "</table>")?
15f0: 3b 0a 0a 20 20 20 20 20 20 20 20 4f 6b 28 28 29 ;.. Ok(()
1600: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f ). }.. ///
1610: 20 42 75 69 6c 64 73 20 74 68 65 20 76 65 72 62 Builds the verb
1620: 6f 73 65 20 72 6f 77 3a 20 66 75 6c 6c 20 4d 49 ose row: full MI
1630: 52 20 64 61 74 61 2c 20 61 6e 64 20 64 65 74 61 R data, and deta
1640: 69 6c 65 64 20 67 65 6e 2f 6b 69 6c 6c 2f 65 6e iled gen/kill/en
1650: 74 72 79 20 73 65 74 73 2e 0a 20 20 20 20 66 6e try sets.. fn
1660: 20 6e 6f 64 65 5f 6c 61 62 65 6c 5f 76 65 72 62 node_label_verb
1670: 6f 73 65 5f 72 6f 77 3c 57 3a 20 69 6f 3a 3a 57 ose_row<W: io::W
1680: 72 69 74 65 3e 28 26 73 65 6c 66 2c 0a 20 20 20 rite>(&self,.
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16b0: 20 20 20 20 20 20 20 20 20 6e 3a 20 26 4e 6f 64 n: &Nod
16c0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 e,.
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 w
16f0: 3a 20 26 6d 75 74 20 57 2c 0a 20 20 20 20 20 20 : &mut W,.
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1720: 20 20 20 20 20 20 62 6c 6f 63 6b 3a 20 42 61 73 block: Bas
1730: 69 63 42 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 icBlock,.
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1760: 20 20 20 20 20 62 6f 64 79 3a 20 26 42 6f 64 79 body: &Body
1770: 3c 27 5f 3e 29 0a 20 20 20 20 20 20 20 20 20 20 <'_>).
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17a0: 20 20 2d 3e 20 69 6f 3a 3a 52 65 73 75 6c 74 3c -> io::Result<
17b0: 28 29 3e 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 ()> {. le
17c0: 74 20 69 20 3d 20 6e 2e 69 6e 64 65 78 28 29 3b t i = n.index();
17d0: 0a 0a 20 20 20 20 20 20 20 20 6d 61 63 72 6f 5f .. macro_
17e0: 72 75 6c 65 73 21 20 64 75 6d 70 5f 73 65 74 5f rules! dump_set_
17f0: 66 6f 72 20 7b 0a 20 20 20 20 20 20 20 20 20 20 for {.
1800: 20 20 28 24 73 65 74 3a 69 64 65 6e 74 2c 20 24 ($set:ident, $
1810: 69 6e 74 65 72 70 72 65 74 3a 69 64 65 6e 74 29 interpret:ident)
1820: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 => {.
1830: 20 20 20 20 20 20 77 72 69 74 65 21 28 77 2c 20 write!(w,
1840: 22 3c 74 64 3e 22 29 3f 3b 0a 0a 20 20 20 20 20 "<td>")?;..
1850: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 66 let f
1860: 6c 6f 77 20 3d 20 73 65 6c 66 2e 6d 62 63 78 2e low = self.mbcx.
1870: 66 6c 6f 77 5f 73 74 61 74 65 28 29 3b 0a 20 20 flow_state();.
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 le
1890: 74 20 65 6e 74 72 79 5f 69 6e 74 65 72 70 20 3d t entry_interp =
18a0: 20 66 6c 6f 77 2e 24 69 6e 74 65 72 70 72 65 74 flow.$interpret
18b0: 28 26 66 6c 6f 77 2e 6f 70 65 72 61 74 6f 72 2c (&flow.operator,
18c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18f0: 20 20 20 20 66 6c 6f 77 2e 73 65 74 73 2e 24 73 flow.sets.$s
1900: 65 74 28 69 29 2c 0a 20 20 20 20 20 20 20 20 20 et(i),.
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1930: 20 20 20 20 20 20 20 20 20 20 26 73 65 6c 66 2e &self.
1940: 72 65 6e 64 65 72 5f 69 64 78 29 3b 0a 20 20 20 render_idx);.
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 for
1960: 20 65 20 69 6e 20 26 65 6e 74 72 79 5f 69 6e 74 e in &entry_int
1970: 65 72 70 20 7b 0a 20 20 20 20 20 20 20 20 20 20 erp {.
1980: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 21 write!
1990: 28 77 2c 20 22 7b 3a 3f 7d 3c 62 72 2f 3e 22 2c (w, "{:?}<br/>",
19a0: 20 65 29 3f 3b 0a 20 20 20 20 20 20 20 20 20 20 e)?;.
19b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
19c0: 20 20 20 20 20 20 20 20 77 72 69 74 65 21 28 77 write!(w
19d0: 2c 20 22 3c 2f 74 64 3e 22 29 3f 3b 0a 20 20 20 , "</td>")?;.
19e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
19f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 77 72 }.. wr
1a00: 69 74 65 21 28 77 2c 20 22 3c 74 72 3e 22 29 3f ite!(w, "<tr>")?
1a10: 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 45 6e 74 ;. // Ent
1a20: 72 79 0a 20 20 20 20 20 20 20 20 64 75 6d 70 5f ry. dump_
1a30: 73 65 74 5f 66 6f 72 21 28 65 6e 74 72 79 5f 73 set_for!(entry_s
1a40: 65 74 5f 66 6f 72 2c 20 69 6e 74 65 72 70 72 65 et_for, interpre
1a50: 74 5f 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 20 t_set);..
1a60: 20 2f 2f 20 4d 49 52 20 73 74 61 74 65 6d 65 6e // MIR statemen
1a70: 74 73 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 ts. write
1a80: 21 28 77 2c 20 22 3c 74 64 3e 22 29 3f 3b 0a 20 !(w, "<td>")?;.
1a90: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 {.
1aa0: 20 20 20 20 20 6c 65 74 20 64 61 74 61 20 3d 20 let data =
1ab0: 26 62 6f 64 79 5b 62 6c 6f 63 6b 5d 3b 0a 20 20 &body[block];.
1ac0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 for (i
1ad0: 2c 20 73 74 61 74 65 6d 65 6e 74 29 20 69 6e 20 , statement) in
1ae0: 64 61 74 61 2e 73 74 61 74 65 6d 65 6e 74 73 2e data.statements.
1af0: 69 74 65 72 28 29 2e 65 6e 75 6d 65 72 61 74 65 iter().enumerate
1b00: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 () {.
1b10: 20 20 20 20 20 77 72 69 74 65 21 28 77 2c 20 22 write!(w, "
1b20: 7b 7d 3c 62 72 20 61 6c 69 67 6e 3d 5c 22 6c 65 {}<br align=\"le
1b30: 66 74 5c 22 2f 3e 22 2c 0a 20 20 20 20 20 20 20 ft\"/>",.
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b50: 64 6f 74 3a 3a 65 73 63 61 70 65 5f 68 74 6d 6c dot::escape_html
1b60: 28 26 66 6f 72 6d 61 74 21 28 22 7b 3a 33 7d 3a (&format!("{:3}:
1b70: 20 7b 3a 3f 7d 22 2c 20 69 2c 20 73 74 61 74 65 {:?}", i, state
1b80: 6d 65 6e 74 29 29 29 3f 3b 0a 20 20 20 20 20 20 ment)))?;.
1b90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
1ba0: 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 21 }. write!
1bb0: 28 77 2c 20 22 3c 2f 74 64 3e 22 29 3f 3b 0a 0a (w, "</td>")?;..
1bc0: 20 20 20 20 20 20 20 20 2f 2f 20 47 65 6e 0a 20 // Gen.
1bd0: 20 20 20 20 20 20 20 64 75 6d 70 5f 73 65 74 5f dump_set_
1be0: 66 6f 72 21 28 67 65 6e 5f 73 65 74 5f 66 6f 72 for!(gen_set_for
1bf0: 2c 20 69 6e 74 65 72 70 72 65 74 5f 68 79 62 72 , interpret_hybr
1c00: 69 64 5f 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 id_set);..
1c10: 20 20 2f 2f 20 4b 69 6c 6c 0a 20 20 20 20 20 20 // Kill.
1c20: 20 20 64 75 6d 70 5f 73 65 74 5f 66 6f 72 21 28 dump_set_for!(
1c30: 6b 69 6c 6c 5f 73 65 74 5f 66 6f 72 2c 20 69 6e kill_set_for, in
1c40: 74 65 72 70 72 65 74 5f 68 79 62 72 69 64 5f 73 terpret_hybrid_s
1c50: 65 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 77 72 et);.. wr
1c60: 69 74 65 21 28 77 2c 20 22 3c 2f 74 72 3e 22 29 ite!(w, "</tr>")
1c70: 3f 3b 0a 0a 20 20 20 20 20 20 20 20 4f 6b 28 28 ?;.. Ok((
1c80: 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f )). }.. //
1c90: 2f 20 42 75 69 6c 64 73 20 74 68 65 20 73 75 6d / Builds the sum
1ca0: 6d 61 72 79 20 72 6f 77 3a 20 74 65 72 6d 69 6e mary row: termin
1cb0: 61 74 6f 72 2c 20 67 65 6e 2f 6b 69 6c 6c 2f 65 ator, gen/kill/e
1cc0: 6e 74 72 79 20 62 69 74 20 73 65 74 73 2e 0a 20 ntry bit sets..
1cd0: 20 20 20 66 6e 20 6e 6f 64 65 5f 6c 61 62 65 6c fn node_label
1ce0: 5f 66 69 6e 61 6c 5f 72 6f 77 3c 57 3a 20 69 6f _final_row<W: io
1cf0: 3a 3a 57 72 69 74 65 3e 28 26 73 65 6c 66 2c 0a ::Write>(&self,.
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d20: 20 20 20 20 20 20 20 20 20 20 6e 3a 20 26 4e 6f n: &No
1d30: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 de,.
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 3a w:
1d60: 20 26 6d 75 74 20 57 2c 0a 20 20 20 20 20 20 20 &mut W,.
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d90: 20 20 20 62 6c 6f 63 6b 3a 20 42 61 73 69 63 42 block: BasicB
1da0: 6c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 lock,.
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dd0: 62 6f 64 79 3a 20 26 42 6f 64 79 3c 27 5f 3e 29 body: &Body<'_>)
1de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e00: 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20 69 6f -> io
1e10: 3a 3a 52 65 73 75 6c 74 3c 28 29 3e 20 7b 0a 20 ::Result<()> {.
1e20: 20 20 20 20 20 20 20 6c 65 74 20 69 20 3d 20 6e let i = n
1e30: 2e 69 6e 64 65 78 28 29 3b 0a 0a 20 20 20 20 20 .index();..
1e40: 20 20 20 6c 65 74 20 66 6c 6f 77 20 3d 20 73 65 let flow = se
1e50: 6c 66 2e 6d 62 63 78 2e 66 6c 6f 77 5f 73 74 61 lf.mbcx.flow_sta
1e60: 74 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 77 te();.. w
1e70: 72 69 74 65 21 28 77 2c 20 22 3c 74 72 3e 22 29 rite!(w, "<tr>")
1e80: 3f 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 45 ?;.. // E
1e90: 6e 74 72 79 0a 20 20 20 20 20 20 20 20 6c 65 74 ntry. let
1ea0: 20 73 65 74 20 3d 20 66 6c 6f 77 2e 73 65 74 73 set = flow.sets
1eb0: 2e 65 6e 74 72 79 5f 73 65 74 5f 66 6f 72 28 69 .entry_set_for(i
1ec0: 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 );. write
1ed0: 21 28 77 2c 20 22 3c 74 64 3e 7b 3a 3f 7d 3c 2f !(w, "<td>{:?}</
1ee0: 74 64 3e 22 2c 20 64 6f 74 3a 3a 65 73 63 61 70 td>", dot::escap
1ef0: 65 5f 68 74 6d 6c 28 26 73 65 74 2e 74 6f 5f 73 e_html(&set.to_s
1f00: 74 72 69 6e 67 28 29 29 29 3f 3b 0a 0a 20 20 20 tring()))?;..
1f10: 20 20 20 20 20 2f 2f 20 54 65 72 6d 69 6e 61 74 // Terminat
1f20: 6f 72 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 or. write
1f30: 21 28 77 2c 20 22 3c 74 64 3e 22 29 3f 3b 0a 20 !(w, "<td>")?;.
1f40: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 {.
1f50: 20 20 20 20 20 6c 65 74 20 64 61 74 61 20 3d 20 let data =
1f60: 26 62 6f 64 79 5b 62 6c 6f 63 6b 5d 3b 0a 20 20 &body[block];.
1f70: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 let mu
1f80: 74 20 74 65 72 6d 69 6e 61 74 6f 72 5f 68 65 61 t terminator_hea
1f90: 64 20 3d 20 53 74 72 69 6e 67 3a 3a 6e 65 77 28 d = String::new(
1fa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 );. d
1fb0: 61 74 61 2e 74 65 72 6d 69 6e 61 74 6f 72 28 29 ata.terminator()
1fc0: 2e 6b 69 6e 64 2e 66 6d 74 5f 68 65 61 64 28 26 .kind.fmt_head(&
1fd0: 6d 75 74 20 74 65 72 6d 69 6e 61 74 6f 72 5f 68 mut terminator_h
1fe0: 65 61 64 29 2e 75 6e 77 72 61 70 28 29 3b 0a 20 ead).unwrap();.
1ff0: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 write
2000: 21 28 77 2c 20 22 7b 7d 22 2c 20 64 6f 74 3a 3a !(w, "{}", dot::
2010: 65 73 63 61 70 65 5f 68 74 6d 6c 28 26 74 65 72 escape_html(&ter
2020: 6d 69 6e 61 74 6f 72 5f 68 65 61 64 29 29 3f 3b minator_head))?;
2030: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
2040: 20 20 20 77 72 69 74 65 21 28 77 2c 20 22 3c 2f write!(w, "</
2050: 74 64 3e 22 29 3f 3b 0a 0a 20 20 20 20 20 20 20 td>")?;..
2060: 20 2f 2f 20 47 65 6e 2f 4b 69 6c 6c 0a 20 20 20 // Gen/Kill.
2070: 20 20 20 20 20 6c 65 74 20 74 72 61 6e 73 20 3d let trans =
2080: 20 66 6c 6f 77 2e 73 65 74 73 2e 74 72 61 6e 73 flow.sets.trans
2090: 5f 66 6f 72 28 69 29 3b 0a 20 20 20 20 20 20 20 _for(i);.
20a0: 20 77 72 69 74 65 21 28 77 2c 20 22 3c 74 64 3e write!(w, "<td>
20b0: 7b 3a 3f 7d 3c 2f 74 64 3e 22 2c 20 64 6f 74 3a {:?}</td>", dot:
20c0: 3a 65 73 63 61 70 65 5f 68 74 6d 6c 28 26 66 6f :escape_html(&fo
20d0: 72 6d 61 74 21 28 22 7b 3a 3f 7d 22 2c 20 74 72 rmat!("{:?}", tr
20e0: 61 6e 73 2e 67 65 6e 5f 73 65 74 29 29 29 3f 3b ans.gen_set)))?;
20f0: 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 21 28 . write!(
2100: 77 2c 20 22 3c 74 64 3e 7b 3a 3f 7d 3c 2f 74 64 w, "<td>{:?}</td
2110: 3e 22 2c 20 64 6f 74 3a 3a 65 73 63 61 70 65 5f >", dot::escape_
2120: 68 74 6d 6c 28 26 66 6f 72 6d 61 74 21 28 22 7b html(&format!("{
2130: 3a 3f 7d 22 2c 20 74 72 61 6e 73 2e 6b 69 6c 6c :?}", trans.kill
2140: 5f 73 65 74 29 29 29 3f 3b 0a 0a 20 20 20 20 20 _set)))?;..
2150: 20 20 20 77 72 69 74 65 21 28 77 2c 20 22 3c 2f write!(w, "</
2160: 74 72 3e 22 29 3f 3b 0a 0a 20 20 20 20 20 20 20 tr>")?;..
2170: 20 4f 6b 28 28 29 29 0a 20 20 20 20 7d 0a 7d 0a Ok(()). }.}.
2180: 0a 69 6d 70 6c 3c 27 61 2c 20 27 74 63 78 2c 20 .impl<'a, 'tcx,
2190: 4d 57 46 2c 20 50 3e 20 64 6f 74 3a 3a 47 72 61 MWF, P> dot::Gra
21a0: 70 68 57 61 6c 6b 3c 27 61 3e 20 66 6f 72 20 47 phWalk<'a> for G
21b0: 72 61 70 68 3c 27 61 2c 20 27 74 63 78 2c 20 4d raph<'a, 'tcx, M
21c0: 57 46 2c 20 50 3e 0a 20 20 20 20 77 68 65 72 65 WF, P>. where
21d0: 20 4d 57 46 3a 20 4d 69 72 57 69 74 68 46 6c 6f MWF: MirWithFlo
21e0: 77 53 74 61 74 65 3c 27 74 63 78 3e 0a 7b 0a 20 wState<'tcx>.{.
21f0: 20 20 20 74 79 70 65 20 4e 6f 64 65 20 3d 20 4e type Node = N
2200: 6f 64 65 3b 0a 20 20 20 20 74 79 70 65 20 45 64 ode;. type Ed
2210: 67 65 20 3d 20 45 64 67 65 3b 0a 20 20 20 20 66 ge = Edge;. f
2220: 6e 20 6e 6f 64 65 73 28 26 73 65 6c 66 29 20 2d n nodes(&self) -
2230: 3e 20 64 6f 74 3a 3a 4e 6f 64 65 73 3c 27 5f 2c > dot::Nodes<'_,
2240: 20 4e 6f 64 65 3e 20 7b 0a 20 20 20 20 20 20 20 Node> {.
2250: 20 73 65 6c 66 2e 6d 62 63 78 2e 62 6f 64 79 28 self.mbcx.body(
2260: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e 62 ). .b
2270: 61 73 69 63 5f 62 6c 6f 63 6b 73 28 29 0a 20 20 asic_blocks().
2280: 20 20 20 20 20 20 20 20 20 20 2e 69 6e 64 69 63 .indic
2290: 65 73 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 es().
22a0: 20 2e 63 6f 6c 6c 65 63 74 3a 3a 3c 56 65 63 3c .collect::<Vec<
22b0: 5f 3e 3e 28 29 0a 20 20 20 20 20 20 20 20 20 20 _>>().
22c0: 20 20 2e 69 6e 74 6f 28 29 0a 20 20 20 20 7d 0a .into(). }.
22d0: 0a 20 20 20 20 66 6e 20 65 64 67 65 73 28 26 73 . fn edges(&s
22e0: 65 6c 66 29 20 2d 3e 20 64 6f 74 3a 3a 45 64 67 elf) -> dot::Edg
22f0: 65 73 3c 27 5f 2c 20 45 64 67 65 3e 20 7b 0a 20 es<'_, Edge> {.
2300: 20 20 20 20 20 20 20 6c 65 74 20 62 6f 64 79 20 let body
2310: 3d 20 73 65 6c 66 2e 6d 62 63 78 2e 62 6f 64 79 = self.mbcx.body
2320: 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 62 6f 64 ();.. bod
2330: 79 2e 62 61 73 69 63 5f 62 6c 6f 63 6b 73 28 29 y.basic_blocks()
2340: 0a 20 20 20 20 20 20 20 20 20 20 20 2e 69 6e 64 . .ind
2350: 69 63 65 73 28 29 0a 20 20 20 20 20 20 20 20 20 ices().
2360: 20 20 2e 66 6c 61 74 5f 6d 61 70 28 7c 62 62 7c .flat_map(|bb|
2370: 20 6f 75 74 67 6f 69 6e 67 28 62 6f 64 79 2c 20 outgoing(body,
2380: 62 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 bb)).
2390: 2e 63 6f 6c 6c 65 63 74 3a 3a 3c 56 65 63 3c 5f .collect::<Vec<_
23a0: 3e 3e 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 >>().
23b0: 2e 69 6e 74 6f 28 29 0a 20 20 20 20 7d 0a 0a 20 .into(). }..
23c0: 20 20 20 66 6e 20 73 6f 75 72 63 65 28 26 73 65 fn source(&se
23d0: 6c 66 2c 20 65 64 67 65 3a 20 26 45 64 67 65 29 lf, edge: &Edge)
23e0: 20 2d 3e 20 4e 6f 64 65 20 7b 0a 20 20 20 20 20 -> Node {.
23f0: 20 20 20 65 64 67 65 2e 73 6f 75 72 63 65 0a 20 edge.source.
2400: 20 20 20 7d 0a 0a 20 20 20 20 66 6e 20 74 61 72 }.. fn tar
2410: 67 65 74 28 26 73 65 6c 66 2c 20 65 64 67 65 3a get(&self, edge:
2420: 20 26 45 64 67 65 29 20 2d 3e 20 4e 6f 64 65 20 &Edge) -> Node
2430: 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 62 6f {. let bo
2440: 64 79 20 3d 20 73 65 6c 66 2e 6d 62 63 78 2e 62 dy = self.mbcx.b
2450: 6f 64 79 28 29 3b 0a 20 20 20 20 20 20 20 20 2a ody();. *
2460: 62 6f 64 79 5b 65 64 67 65 2e 73 6f 75 72 63 65 body[edge.source
2470: 5d 2e 74 65 72 6d 69 6e 61 74 6f 72 28 29 2e 73 ].terminator().s
2480: 75 63 63 65 73 73 6f 72 73 28 29 2e 6e 74 68 28 uccessors().nth(
2490: 65 64 67 65 2e 69 6e 64 65 78 29 2e 75 6e 77 72 edge.index).unwr
24a0: 61 70 28 29 0a 20 20 20 20 7d 0a 7d 0a ap(). }.}.