about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_mir/util/graphviz.rs22
-rw-r--r--src/librustc_mir/util/pretty.rs2
2 files changed, 20 insertions, 4 deletions
diff --git a/src/librustc_mir/util/graphviz.rs b/src/librustc_mir/util/graphviz.rs
index 4b7ee7ab753..ff2946d3a69 100644
--- a/src/librustc_mir/util/graphviz.rs
+++ b/src/librustc_mir/util/graphviz.rs
@@ -16,10 +16,22 @@ pub fn write_mir_graphviz<W>(
 where
     W: Write,
 {
-    for def_id in dump_mir_def_ids(tcx, single) {
+    let def_ids = dump_mir_def_ids(tcx, single);
+
+    let use_subgraphs = def_ids.len() > 1;
+    if use_subgraphs {
+        writeln!(w, "digraph __crate__ {{")?;
+    }
+
+    for def_id in def_ids {
         let body = &tcx.optimized_mir(def_id);
-        write_mir_fn_graphviz(tcx, def_id, body, w)?;
+        write_mir_fn_graphviz(tcx, def_id, body, use_subgraphs, w)?;
     }
+
+    if use_subgraphs {
+        writeln!(w, "}}")?;
+    }
+
     Ok(())
 }
 
@@ -38,12 +50,16 @@ pub fn write_mir_fn_graphviz<'tcx, W>(
     tcx: TyCtxt<'tcx>,
     def_id: DefId,
     body: &Body<'_>,
+    subgraph: bool,
     w: &mut W,
 ) -> io::Result<()>
 where
     W: Write,
 {
-    writeln!(w, "digraph Mir_{} {{", graphviz_safe_def_name(def_id))?;
+    let kind = if subgraph { "subgraph" } else { "digraph" };
+    let cluster = if subgraph { "cluster_" } else { "" }; // Prints a border around MIR
+    let def_name = graphviz_safe_def_name(def_id);
+    writeln!(w, "{} {}Mir_{} {{", kind, cluster, def_name)?;
 
     // Global graph properties
     writeln!(w, r#"    graph [fontname="monospace"];"#)?;
diff --git a/src/librustc_mir/util/pretty.rs b/src/librustc_mir/util/pretty.rs
index 7f6b60b1b11..89f298846d2 100644
--- a/src/librustc_mir/util/pretty.rs
+++ b/src/librustc_mir/util/pretty.rs
@@ -145,7 +145,7 @@ fn dump_matched_mir_node<'tcx, F>(
         let _: io::Result<()> = try {
             let mut file =
                 create_dump_file(tcx, "dot", pass_num, pass_name, disambiguator, source)?;
-            write_mir_fn_graphviz(tcx, source.def_id(), body, &mut file)?;
+            write_mir_fn_graphviz(tcx, source.def_id(), body, false, &mut file)?;
         };
     }
 }