]> git.lizzy.rs Git - rust.git/commitdiff
Add FixedUnitCount codegen unit partitioning strategy.
authorMichael Woerister <michaelwoerister@posteo.net>
Thu, 21 Apr 2016 20:45:33 +0000 (16:45 -0400)
committerMichael Woerister <michaelwoerister@posteo.net>
Thu, 28 Apr 2016 18:36:34 +0000 (14:36 -0400)
12 files changed:
src/librustc_trans/base.rs
src/librustc_trans/partitioning.rs
src/test/codegen-units/partitioning/extern-drop-glue.rs
src/test/codegen-units/partitioning/extern-generic.rs
src/test/codegen-units/partitioning/inlining-from-extern-crate.rs
src/test/codegen-units/partitioning/local-drop-glue.rs
src/test/codegen-units/partitioning/local-generic.rs
src/test/codegen-units/partitioning/local-inlining.rs
src/test/codegen-units/partitioning/local-transitive-inlining.rs
src/test/codegen-units/partitioning/methods-are-with-self-type.rs
src/test/codegen-units/partitioning/regular-modules.rs
src/test/codegen-units/partitioning/statics.rs

index 9190389b722b603a84468d61863d5a5f3bbc7825..ae097b823a6caad07641380c7f97b50dd670508f 100644 (file)
@@ -58,7 +58,7 @@
 use build::*;
 use builder::{Builder, noname};
 use callee::{Callee, CallArgs, ArgExprs, ArgVals};
-use partitioning;
+use partitioning::{self, PartitioningStrategy};
 use cleanup::{self, CleanupMethods, DropHint};
 use closure;
 use common::{Block, C_bool, C_bytes_in_context, C_i32, C_int, C_uint, C_integral};
@@ -2938,8 +2938,17 @@ fn collect_translation_items<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>) {
         collector::collect_crate_translation_items(&ccx, collection_mode)
     });
 
+    let strategy = if ccx.sess().opts.debugging_opts.incremental.is_some() {
+        PartitioningStrategy::PerModule
+    } else {
+        PartitioningStrategy::FixedUnitCount(ccx.sess().opts.cg.codegen_units)
+    };
+
     let codegen_units = time(time_passes, "codegen unit partitioning", || {
-        partitioning::partition(ccx.tcx(), items.iter().cloned(), &inlining_map)
+        partitioning::partition(ccx.tcx(),
+                                items.iter().cloned(),
+                                strategy,
+                                &inlining_map)
     });
 
     if ccx.sess().opts.debugging_opts.print_trans_items.is_some() {
index d482814961fbc726d4a7036d3db3bfb91d75bf01..d98c377531a4b2d65e84619f8661180f4071ac12 100644 (file)
@@ -132,11 +132,17 @@ pub struct CodegenUnit<'tcx> {
     pub items: FnvHashMap<TransItem<'tcx>, llvm::Linkage>,
 }
 
+pub enum PartitioningStrategy {
+    PerModule,
+    FixedUnitCount(usize)
+}
+
 // Anything we can't find a proper codegen unit for goes into this.
 const FALLBACK_CODEGEN_UNIT: &'static str = "__rustc_fallback_codegen_unit";
 
 pub fn partition<'tcx, I>(tcx: &TyCtxt<'tcx>,
                           trans_items: I,
+                          strategy: PartitioningStrategy,
                           inlining_map: &InliningMap<'tcx>)
                           -> Vec<CodegenUnit<'tcx>>
     where I: Iterator<Item = TransItem<'tcx>>
@@ -144,7 +150,11 @@ pub fn partition<'tcx, I>(tcx: &TyCtxt<'tcx>,
     // In the first step, we place all regular translation items into their
     // respective 'home' codegen unit. Regular translation items are all
     // functions and statics defined in the local crate.
-    let initial_partitioning = place_root_translation_items(tcx, trans_items);
+    let mut initial_partitioning = place_root_translation_items(tcx, trans_items);
+
+    if let PartitioningStrategy::FixedUnitCount(count) = strategy {
+        merge_codegen_units(&mut initial_partitioning, count, &tcx.crate_name[..]);
+    }
 
     // In the next step, we use the inlining map to determine which addtional
     // translation items have to go into each codegen unit. These additional
@@ -217,6 +227,33 @@ fn place_root_translation_items<'tcx, I>(tcx: &TyCtxt<'tcx>,
     }
 }
 
+fn merge_codegen_units<'tcx>(initial_partitioning: &mut InitialPartitioning<'tcx>,
+                             target_cgu_count: usize,
+                             crate_name: &str) {
+    if target_cgu_count >= initial_partitioning.codegen_units.len() {
+        return;
+    }
+
+    assert!(target_cgu_count >= 1);
+    let codegen_units = &mut initial_partitioning.codegen_units;
+
+    // Merge the two smallest codegen units until the target size is reached
+    while codegen_units.len() > target_cgu_count {
+        // Sort small cgus to the back
+        codegen_units.as_mut_slice().sort_by_key(|cgu| -(cgu.items.len() as i64));
+        let smallest = codegen_units.pop().unwrap();
+        let second_smallest = codegen_units.last_mut().unwrap();
+
+        for (k, v) in smallest.items.into_iter() {
+            second_smallest.items.insert(k, v);
+        }
+    }
+
+    for (index, cgu) in codegen_units.iter_mut().enumerate() {
+        cgu.name = token::intern_and_get_ident(&format!("{}.{}", crate_name, index)[..]);
+    }
+}
+
 fn place_inlined_translation_items<'tcx>(initial_partitioning: InitialPartitioning<'tcx>,
                                          inlining_map: &InliningMap<'tcx>)
                                          -> Vec<CodegenUnit<'tcx>> {
index bd57a09fadd349eb992078508ce455110d2b05e2..78a051de6c78d9e77b9e25ceea69dedee33019ad 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 // ignore-tidy-linelength
-// compile-flags:-Zprint-trans-items=lazy
+// compile-flags:-Zprint-trans-items=lazy -Zincremental=""
 
 #![allow(dead_code)]
 #![crate_type="lib"]
index 71af676b0a9707a34ba88d70faf1646ff6c69cc4..c28dfb49de332344467f282fafd2bd3ed8843c9f 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 // ignore-tidy-linelength
-// compile-flags:-Zprint-trans-items=eager
+// compile-flags:-Zprint-trans-items=eager -Zincremental=""
 
 #![allow(dead_code)]
 #![crate_type="lib"]
index 469f2c08c39c2abbefc8cd82cb2181b9bacd6086..9071050da1147b848ac1a7972e7cecd1f8c5ceb0 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 // ignore-tidy-linelength
-// compile-flags:-Zprint-trans-items=lazy
+// compile-flags:-Zprint-trans-items=lazy -Zincremental=""
 
 #![crate_type="lib"]
 
index a42a34a0766b71fb2b1dd2ef063b1e1a266708f7..532eaef4659f7b4fd15fcd20ffc8ba1491b3ebf7 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 // ignore-tidy-linelength
-// compile-flags:-Zprint-trans-items=lazy
+// compile-flags:-Zprint-trans-items=lazy -Zincremental=""
 
 #![allow(dead_code)]
 #![crate_type="lib"]
index 08c8ff0cb2f9186ddba4defb2657a3ab37e19f28..d2ccf36515c1b0cb2e81c25391364a91c17eb1ff 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 // ignore-tidy-linelength
-// compile-flags:-Zprint-trans-items=eager
+// compile-flags:-Zprint-trans-items=eager -Zincremental=""
 
 #![allow(dead_code)]
 #![crate_type="lib"]
index d2bfa83834665e28d0de8df53258c65e6e0489fe..194e5763ac50b43f75ae0352d1df7342af759dbf 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 // ignore-tidy-linelength
-// compile-flags:-Zprint-trans-items=lazy
+// compile-flags:-Zprint-trans-items=lazy -Zincremental=""
 
 #![allow(dead_code)]
 #![crate_type="lib"]
index 2e47dc5c9020f23e65913e470064bea432e3a9d1..7b1b7e8cb0a84a2d45062ac2a70e4a888393e634 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 // ignore-tidy-linelength
-// compile-flags:-Zprint-trans-items=lazy
+// compile-flags:-Zprint-trans-items=lazy -Zincremental=""
 
 #![allow(dead_code)]
 #![crate_type="lib"]
index 51d2d53f24a80eff72e68c16cb35ac81896159aa..3697b83927bd70f7f1956f5ea59a6cc6137088d8 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 // ignore-tidy-linelength
-// compile-flags:-Zprint-trans-items=lazy
+// compile-flags:-Zprint-trans-items=lazy -Zincremental=""
 
 #![allow(dead_code)]
 
index a761cab2e44e48581d4de7fc078475471b9ecac3..57f93d2b65bfdd635e60963ff0439f98ad2da7aa 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 // ignore-tidy-linelength
-// compile-flags:-Zprint-trans-items=eager
+// compile-flags:-Zprint-trans-items=eager -Z incremental=""
 
 #![allow(dead_code)]
 #![crate_type="lib"]
index ac6a0c55d4f6db3e2ab24fe75f3c0486f245cba2..7e4c0a4ca6a0f4fa31d2ff6ed3e38c485657ac43 100644 (file)
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 // ignore-tidy-linelength
-// compile-flags:-Zprint-trans-items=lazy
+// compile-flags:-Zprint-trans-items=lazy -Zincremental=""
 
 #![crate_type="lib"]