about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicholas Nethercote <n.nethercote@gmail.com>2023-07-17 13:04:07 +1000
committerNicholas Nethercote <n.nethercote@gmail.com>2023-07-19 07:23:09 +1000
commit77b053a2dd20cc8b1dc1401385a0ef71c7cb25b4 (patch)
tree62c826e8ade860e1e5144c1e7146da0e6c4d152d
parent299179e69457125e77be1489531bca0b9ee1af48 (diff)
downloadrust-77b053a2dd20cc8b1dc1401385a0ef71c7cb25b4.tar.gz
rust-77b053a2dd20cc8b1dc1401385a0ef71c7cb25b4.zip
Add `MonoItemData::inlined`.
-rw-r--r--compiler/rustc_middle/src/mir/mono.rs6
-rw-r--r--compiler/rustc_monomorphize/src/partitioning.rs30
2 files changed, 19 insertions, 17 deletions
diff --git a/compiler/rustc_middle/src/mir/mono.rs b/compiler/rustc_middle/src/mir/mono.rs
index 16addc2dc1e..d217e1c5f8f 100644
--- a/compiler/rustc_middle/src/mir/mono.rs
+++ b/compiler/rustc_middle/src/mir/mono.rs
@@ -248,8 +248,14 @@ pub struct CodegenUnit<'tcx> {
 /// Auxiliary info about a `MonoItem`.
 #[derive(Copy, Clone, PartialEq, Debug, HashStable)]
 pub struct MonoItemData {
+    /// A cached copy of the result of `MonoItem::instantiation_mode`, where
+    /// `GloballyShared` maps to `false` and `LocalCopy` maps to `true`.
+    pub inlined: bool,
+
     pub linkage: Linkage,
     pub visibility: Visibility,
+
+    /// A cached copy of the result of `MonoItem::size_estimate`.
     pub size_estimate: usize,
 }
 
diff --git a/compiler/rustc_monomorphize/src/partitioning.rs b/compiler/rustc_monomorphize/src/partitioning.rs
index 54096abb2e0..f6a71e5cf54 100644
--- a/compiler/rustc_monomorphize/src/partitioning.rs
+++ b/compiler/rustc_monomorphize/src/partitioning.rs
@@ -248,7 +248,8 @@ where
         }
         let size_estimate = mono_item.size_estimate(cx.tcx);
 
-        cgu.items_mut().insert(mono_item, MonoItemData { linkage, visibility, size_estimate });
+        cgu.items_mut()
+            .insert(mono_item, MonoItemData { inlined: false, linkage, visibility, size_estimate });
 
         // Get all inlined items that are reachable from `mono_item` without
         // going via another root item. This includes drop-glue, functions from
@@ -263,6 +264,7 @@ where
         for inlined_item in reachable_inlined_items {
             // This is a CGU-private copy.
             cgu.items_mut().entry(inlined_item).or_insert_with(|| MonoItemData {
+                inlined: true,
                 linkage: Linkage::Internal,
                 visibility: Visibility::Default,
                 size_estimate: inlined_item.size_estimate(cx.tcx),
@@ -870,19 +872,16 @@ fn debug_dump<'a, 'tcx: 'a>(tcx: TyCtxt<'tcx>, label: &str, cgus: &[CodegenUnit<
             all_cgu_sizes.push(cgu.size_estimate());
 
             for (item, data) in cgu.items() {
-                match item.instantiation_mode(tcx) {
-                    InstantiationMode::GloballyShared { .. } => {
-                        root_items += 1;
-                        root_size += data.size_estimate;
-                    }
-                    InstantiationMode::LocalCopy => {
-                        if inlined_items.insert(item) {
-                            unique_inlined_items += 1;
-                            unique_inlined_size += data.size_estimate;
-                        }
-                        placed_inlined_items += 1;
-                        placed_inlined_size += data.size_estimate;
+                if !data.inlined {
+                    root_items += 1;
+                    root_size += data.size_estimate;
+                } else {
+                    if inlined_items.insert(item) {
+                        unique_inlined_items += 1;
+                        unique_inlined_size += data.size_estimate;
                     }
+                    placed_inlined_items += 1;
+                    placed_inlined_size += data.size_estimate;
                 }
             }
         }
@@ -937,10 +936,7 @@ fn debug_dump<'a, 'tcx: 'a>(tcx: TyCtxt<'tcx>, label: &str, cgus: &[CodegenUnit<
                 let symbol_name = item.symbol_name(tcx).name;
                 let symbol_hash_start = symbol_name.rfind('h');
                 let symbol_hash = symbol_hash_start.map_or("<no hash>", |i| &symbol_name[i..]);
-                let kind = match item.instantiation_mode(tcx) {
-                    InstantiationMode::GloballyShared { .. } => "root",
-                    InstantiationMode::LocalCopy => "inlined",
-                };
+                let kind = if !data.inlined { "root" } else { "inlined" };
                 let size = data.size_estimate;
                 let _ = with_no_trimmed_paths!(writeln!(
                     s,