Skip to content

Commit c2ea570

Browse files
committed
avoid codegenunit clone
1 parent 9db09fa commit c2ea570

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

compiler/rustc_middle/src/mir/mono.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ impl<'tcx> fmt::Display for MonoItem<'tcx> {
223223
}
224224
}
225225

226-
#[derive(Debug)]
226+
#[derive(Debug, Clone)]
227227
pub struct CodegenUnit<'tcx> {
228228
/// A name for this CGU. Incremental compilation requires that
229229
/// name be unique amongst **all** crates. Therefore, it should
@@ -236,6 +236,7 @@ pub struct CodegenUnit<'tcx> {
236236
/// True if this is CGU is used to hold code coverage information for dead code,
237237
/// false otherwise.
238238
is_code_coverage_dead_code_cgu: bool,
239+
was_merged: bool,
239240
}
240241

241242
/// Specifies the linkage type for a `MonoItem`.
@@ -272,6 +273,7 @@ impl<'tcx> CodegenUnit<'tcx> {
272273
size_estimate: None,
273274
primary: false,
274275
is_code_coverage_dead_code_cgu: false,
276+
was_merged: false,
275277
}
276278
}
277279

@@ -291,6 +293,14 @@ impl<'tcx> CodegenUnit<'tcx> {
291293
self.primary = true;
292294
}
293295

296+
pub fn was_merged(&self) -> bool {
297+
self.was_merged
298+
}
299+
300+
pub fn make_merged(&mut self) {
301+
self.was_merged = true;
302+
}
303+
294304
/// The order of these items is non-determinstic.
295305
pub fn items(&self) -> &FxHashMap<MonoItem<'tcx>, (Linkage, Visibility)> {
296306
&self.items
@@ -411,6 +421,7 @@ impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for CodegenUnit<'tcx> {
411421
size_estimate: _,
412422
primary: _,
413423
is_code_coverage_dead_code_cgu,
424+
was_merged: _,
414425
} = *self;
415426

416427
name.hash_stable(hcx, hasher);

compiler/rustc_monomorphize/src/partitioning.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -336,27 +336,30 @@ fn merge_codegen_units<'tcx>(
336336
// Sort small cgus to the back.
337337
codegen_units.sort_by_cached_key(|cgu| cmp::Reverse(cgu.size_estimate()));
338338
let fallback_cgu_name = fallback_cgu_name(cgu_name_builder);
339+
let mut default = CodegenUnit::new(fallback_cgu_name);
340+
default.create_size_estimate(cx.tcx);
339341
let mut merged_subsets: Vec<CodegenUnit<'_>> =
340-
vec![CodegenUnit::new(fallback_cgu_name); cx.tcx.sess.codegen_units().as_usize()];
342+
vec![default; cx.tcx.sess.codegen_units().as_usize()];
341343

342-
for cgu in codegen_units.iter_mut() {
344+
codegen_units.iter_mut().for_each(|cgu| {
343345
let min = merged_subsets
344346
.iter()
345347
.enumerate()
346348
.min_by_key(|(_, cgu)| cgu.size_estimate())
347349
.map(|(i, _)| i)
348350
.unwrap_or(0);
349351
let min_cgu = &mut merged_subsets[min];
350-
if min_cgu.name() == fallback_cgu_name {
352+
if !min_cgu.was_merged() {
351353
*min_cgu = std::mem::replace(cgu, CodegenUnit::new(fallback_cgu_name));
354+
min_cgu.make_merged();
352355
} else {
353356
min_cgu.modify_size_estimate(cgu.size_estimate());
354357
min_cgu.items_mut().extend(cgu.items_mut().drain());
355358
let mut consumed_cgu_names = cgu_contents.remove(&cgu.name()).unwrap();
356359
cgu_contents.get_mut(&min_cgu.name()).unwrap().append(&mut consumed_cgu_names);
357360
debug!("CodegenUnit {} merged into CodegenUnit {}", cgu.name(), min_cgu.name());
358361
}
359-
}
362+
});
360363
*codegen_units = merged_subsets;
361364
}
362365

0 commit comments

Comments
 (0)