about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2019-02-03 13:31:50 +0100
committerRalf Jung <post@ralfj.de>2019-02-09 12:11:12 +0100
commitfed4c5d9e13e7cde3399336342a64ba23308d4f5 (patch)
tree136682b12b4f07c38b987193a559a593229fe26b
parent270894678792fa9a30acc6ebc3a13caf5fa0b9c6 (diff)
downloadrust-fed4c5d9e13e7cde3399336342a64ba23308d4f5.tar.gz
rust-fed4c5d9e13e7cde3399336342a64ba23308d4f5.zip
disambiguate filenames of multiple drop shims being dumped
-rw-r--r--src/librustc_mir/util/pretty.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/librustc_mir/util/pretty.rs b/src/librustc_mir/util/pretty.rs
index 120055ad397..48a6fd3a95d 100644
--- a/src/librustc_mir/util/pretty.rs
+++ b/src/librustc_mir/util/pretty.rs
@@ -186,10 +186,29 @@ fn dump_path(
     let item_name = tcx
         .def_path(source.def_id())
         .to_filename_friendly_no_crate();
+    // All drop shims have the same DefId, so we have to add the type
+    // to get unique file names.
+    let shim_disambiguator = match source.instance {
+        ty::InstanceDef::DropGlue(_, Some(ty)) => {
+            // Unfortunately, pretty-printed typed are not very filename-friendly.
+            // We dome some filtering.
+            let mut s = ".".to_owned();
+            s.extend(ty.to_string()
+                .chars()
+                .filter_map(|c| match c {
+                    ' ' => None,
+                    ':' => Some('_'),
+                    c => Some(c)
+                }));
+            s
+        }
+        _ => String::new(),
+    };
 
     let file_name = format!(
-        "rustc.{}{}{}.{}.{}.{}",
+        "rustc.{}{}{}{}.{}.{}.{}",
         item_name,
+        shim_disambiguator,
         promotion_id,
         pass_num,
         pass_name,