@@ -368,6 +368,7 @@ fn merge_codegen_units<'tcx>(
368
368
369
369
let cgu_name_builder = & mut CodegenUnitNameBuilder :: new ( cx. tcx ) ;
370
370
371
+ // Rename the newly merged CGUs.
371
372
if cx. tcx . sess . opts . incremental . is_some ( ) {
372
373
// If we are doing incremental compilation, we want CGU names to
373
374
// reflect the path of the source level module they correspond to.
@@ -404,18 +405,41 @@ fn merge_codegen_units<'tcx>(
404
405
}
405
406
}
406
407
}
408
+
409
+ // A sorted order here ensures what follows can be deterministic.
410
+ codegen_units. sort_by ( |a, b| a. name ( ) . as_str ( ) . cmp ( b. name ( ) . as_str ( ) ) ) ;
407
411
} else {
408
- // If we are compiling non-incrementally we just generate simple CGU
409
- // names containing an index.
412
+ // When compiling non-incrementally, we rename the CGUS so they have
413
+ // identical names except for the numeric suffix, something like
414
+ // `regex.f10ba03eb5ec7975-cgu.N`, where `N` varies.
415
+ //
416
+ // It is useful for debugging and profiling purposes if the resulting
417
+ // CGUs are sorted by name *and* reverse sorted by size. (CGU 0 is the
418
+ // biggest, CGU 1 is the second biggest, etc.)
419
+ //
420
+ // So first we reverse sort by size. Then we generate the names with
421
+ // zero-padded suffixes, which means they are automatically sorted by
422
+ // names. The numeric suffix width depends on the number of CGUs, which
423
+ // is always greater than zero:
424
+ // - [1,9] CGUS: `0`, `1`, `2`, ...
425
+ // - [10,99] CGUS: `00`, `01`, `02`, ...
426
+ // - [100,999] CGUS: `000`, `001`, `002`, ...
427
+ // - etc.
428
+ //
429
+ // If we didn't zero-pad the sorted-by-name order would be `XYZ-cgu.0`,
430
+ // `XYZ-cgu.1`, `XYZ-cgu.10`, `XYZ-cgu.11`, ..., `XYZ-cgu.2`, etc.
431
+ codegen_units. sort_by_key ( |cgu| cmp:: Reverse ( cgu. size_estimate ( ) ) ) ;
432
+ let num_digits = codegen_units. len ( ) . ilog10 ( ) as usize + 1 ;
410
433
for ( index, cgu) in codegen_units. iter_mut ( ) . enumerate ( ) {
434
+ // Note: `WorkItem::short_description` depends on this name ending
435
+ // with `-cgu.` followed by a numeric suffix. Please keep it in
436
+ // sync with this code.
437
+ let suffix = format ! ( "{index:0num_digits$}" ) ;
411
438
let numbered_codegen_unit_name =
412
- cgu_name_builder. build_cgu_name_no_mangle ( LOCAL_CRATE , & [ "cgu" ] , Some ( index ) ) ;
439
+ cgu_name_builder. build_cgu_name_no_mangle ( LOCAL_CRATE , & [ "cgu" ] , Some ( suffix ) ) ;
413
440
cgu. set_name ( numbered_codegen_unit_name) ;
414
441
}
415
442
}
416
-
417
- // A sorted order here ensures what follows can be deterministic.
418
- codegen_units. sort_by ( |a, b| a. name ( ) . as_str ( ) . cmp ( b. name ( ) . as_str ( ) ) ) ;
419
443
}
420
444
421
445
fn internalize_symbols < ' tcx > (
0 commit comments