Skip to content

Commit 96b9bb4

Browse files
committed
Auto merge of rust-lang#99677 - pietroalbini:pa-fix-97786-perf-regression, r=Mark-Simulacrum
Remove new allocations from `imported_source_files` rust-lang#97786 introduced a [large performance regression](rust-lang#97786 (comment)). After some local investigation it turns out the allocations performed by my change were the cause of the perf regression. This PR refactors my change to remove those allocations.
2 parents b629c85 + f1063c0 commit 96b9bb4

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

compiler/rustc_metadata/src/rmeta/decoder.rs

+20-20
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ use std::io;
4141
use std::iter::TrustedLen;
4242
use std::mem;
4343
use std::num::NonZeroUsize;
44-
use std::path::PathBuf;
44+
use std::path::Path;
4545
use tracing::debug;
4646

4747
pub(super) use cstore_impl::provide;
@@ -1474,30 +1474,30 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
14741474
/// Proc macro crates don't currently export spans, so this function does not have
14751475
/// to work for them.
14761476
fn imported_source_files(self, sess: &Session) -> &'a [ImportedSourceFile] {
1477+
fn filter<'a>(sess: &Session, path: Option<&'a Path>) -> Option<&'a Path> {
1478+
path.filter(|_| {
1479+
// Only spend time on further checks if we have what to translate *to*.
1480+
sess.opts.real_rust_source_base_dir.is_some()
1481+
// Some tests need the translation to be always skipped.
1482+
&& sess.opts.unstable_opts.translate_remapped_path_to_local_path
1483+
})
1484+
.filter(|virtual_dir| {
1485+
// Don't translate away `/rustc/$hash` if we're still remapping to it,
1486+
// since that means we're still building `std`/`rustc` that need it,
1487+
// and we don't want the real path to leak into codegen/debuginfo.
1488+
!sess.opts.remap_path_prefix.iter().any(|(_from, to)| to == virtual_dir)
1489+
})
1490+
}
1491+
14771492
// Translate the virtual `/rustc/$hash` prefix back to a real directory
14781493
// that should hold actual sources, where possible.
14791494
//
14801495
// NOTE: if you update this, you might need to also update bootstrap's code for generating
14811496
// the `rust-src` component in `Src::run` in `src/bootstrap/dist.rs`.
14821497
let virtual_rust_source_base_dir = [
1483-
option_env!("CFG_VIRTUAL_RUST_SOURCE_BASE_DIR").map(PathBuf::from),
1484-
sess.opts.unstable_opts.simulate_remapped_rust_src_base.clone(),
1485-
]
1486-
.into_iter()
1487-
.filter(|_| {
1488-
// Only spend time on further checks if we have what to translate *to*.
1489-
sess.opts.real_rust_source_base_dir.is_some()
1490-
// Some tests need the translation to be always skipped.
1491-
&& sess.opts.unstable_opts.translate_remapped_path_to_local_path
1492-
})
1493-
.flatten()
1494-
.filter(|virtual_dir| {
1495-
// Don't translate away `/rustc/$hash` if we're still remapping to it,
1496-
// since that means we're still building `std`/`rustc` that need it,
1497-
// and we don't want the real path to leak into codegen/debuginfo.
1498-
!sess.opts.remap_path_prefix.iter().any(|(_from, to)| to == virtual_dir)
1499-
})
1500-
.collect::<Vec<_>>();
1498+
filter(sess, option_env!("CFG_VIRTUAL_RUST_SOURCE_BASE_DIR").map(Path::new)),
1499+
filter(sess, sess.opts.unstable_opts.simulate_remapped_rust_src_base.as_deref()),
1500+
];
15011501

15021502
let try_to_translate_virtual_to_real = |name: &mut rustc_span::FileName| {
15031503
debug!(
@@ -1506,7 +1506,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
15061506
name, virtual_rust_source_base_dir, sess.opts.real_rust_source_base_dir,
15071507
);
15081508

1509-
for virtual_dir in &virtual_rust_source_base_dir {
1509+
for virtual_dir in virtual_rust_source_base_dir.iter().flatten() {
15101510
if let Some(real_dir) = &sess.opts.real_rust_source_base_dir {
15111511
if let rustc_span::FileName::Real(old_name) = name {
15121512
if let rustc_span::RealFileName::Remapped { local_path: _, virtual_name } =

0 commit comments

Comments
 (0)