summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_metadata/src/locator.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:59:35 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:59:35 +0000
commitd1b2d29528b7794b41e66fc2136e395a02f8529b (patch)
treea4a17504b260206dec3cf55b2dca82929a348ac2 /compiler/rustc_metadata/src/locator.rs
parentReleasing progress-linux version 1.72.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-d1b2d29528b7794b41e66fc2136e395a02f8529b.tar.xz
rustc-d1b2d29528b7794b41e66fc2136e395a02f8529b.zip
Merging upstream version 1.73.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_metadata/src/locator.rs')
-rw-r--r--compiler/rustc_metadata/src/locator.rs74
1 files changed, 40 insertions, 34 deletions
diff --git a/compiler/rustc_metadata/src/locator.rs b/compiler/rustc_metadata/src/locator.rs
index a89d7b464..bf6004ba8 100644
--- a/compiler/rustc_metadata/src/locator.rs
+++ b/compiler/rustc_metadata/src/locator.rs
@@ -222,7 +222,7 @@ use rustc_data_structures::owned_slice::slice_owned;
use rustc_data_structures::svh::Svh;
use rustc_errors::{DiagnosticArgValue, FatalError, IntoDiagnosticArg};
use rustc_fs_util::try_canonicalize;
-use rustc_session::config::{self, CrateType};
+use rustc_session::config;
use rustc_session::cstore::{CrateSource, MetadataLoader};
use rustc_session::filesearch::FileSearch;
use rustc_session::search_paths::PathKind;
@@ -305,14 +305,12 @@ impl<'a> CrateLocator<'a> {
sess: &'a Session,
metadata_loader: &'a dyn MetadataLoader,
crate_name: Symbol,
+ is_rlib: bool,
hash: Option<Svh>,
extra_filename: Option<&'a str>,
is_host: bool,
path_kind: PathKind,
) -> CrateLocator<'a> {
- // The all loop is because `--crate-type=rlib --crate-type=rlib` is
- // legal and produces both inside this type.
- let is_rlib = sess.crate_types().iter().all(|c| *c == CrateType::Rlib);
let needs_object_code = sess.opts.output_types.should_codegen();
// If we're producing an rlib, then we don't need object code.
// Or, if we're not producing object code, then we don't need it either
@@ -511,7 +509,7 @@ impl<'a> CrateLocator<'a> {
rlib: self.extract_one(rlibs, CrateFlavor::Rlib, &mut slot)?,
dylib: self.extract_one(dylibs, CrateFlavor::Dylib, &mut slot)?,
};
- Ok(slot.map(|(svh, metadata)| (svh, Library { source, metadata })))
+ Ok(slot.map(|(svh, metadata, _)| (svh, Library { source, metadata })))
}
fn needs_crate_flavor(&self, flavor: CrateFlavor) -> bool {
@@ -535,11 +533,13 @@ impl<'a> CrateLocator<'a> {
// read the metadata from it if `*slot` is `None`. If the metadata couldn't
// be read, it is assumed that the file isn't a valid rust library (no
// errors are emitted).
+ //
+ // The `PathBuf` in `slot` will only be used for diagnostic purposes.
fn extract_one(
&mut self,
m: FxHashMap<PathBuf, PathKind>,
flavor: CrateFlavor,
- slot: &mut Option<(Svh, MetadataBlob)>,
+ slot: &mut Option<(Svh, MetadataBlob, PathBuf)>,
) -> Result<Option<(PathBuf, PathKind)>, CrateError> {
// If we are producing an rlib, and we've already loaded metadata, then
// we should not attempt to discover further crate sources (unless we're
@@ -550,16 +550,9 @@ impl<'a> CrateLocator<'a> {
//
// See also #68149 which provides more detail on why emitting the
// dependency on the rlib is a bad thing.
- //
- // We currently do not verify that these other sources are even in sync,
- // and this is arguably a bug (see #10786), but because reading metadata
- // is quite slow (especially from dylibs) we currently do not read it
- // from the other crate sources.
if slot.is_some() {
if m.is_empty() || !self.needs_crate_flavor(flavor) {
return Ok(None);
- } else if m.len() == 1 {
- return Ok(Some(m.into_iter().next().unwrap()));
}
}
@@ -610,8 +603,7 @@ impl<'a> CrateLocator<'a> {
candidates,
));
}
- err_data = Some(vec![ret.as_ref().unwrap().0.clone()]);
- *slot = None;
+ err_data = Some(vec![slot.take().unwrap().2]);
}
if let Some(candidates) = &mut err_data {
candidates.push(lib);
@@ -644,7 +636,7 @@ impl<'a> CrateLocator<'a> {
continue;
}
}
- *slot = Some((hash, metadata));
+ *slot = Some((hash, metadata, lib.clone()));
ret = Some((lib, kind));
}
@@ -804,25 +796,36 @@ fn get_metadata_section<'p>(
}
// Length of the compressed stream - this allows linkers to pad the section if they want
- let Ok(len_bytes) = <[u8; 4]>::try_from(&buf[header_len..cmp::min(data_start, buf.len())]) else {
- return Err(MetadataError::LoadFailure("invalid metadata length found".to_string()));
+ let Ok(len_bytes) =
+ <[u8; 4]>::try_from(&buf[header_len..cmp::min(data_start, buf.len())])
+ else {
+ return Err(MetadataError::LoadFailure(
+ "invalid metadata length found".to_string(),
+ ));
};
let compressed_len = u32::from_be_bytes(len_bytes) as usize;
// Header is okay -> inflate the actual metadata
- let compressed_bytes = &buf[data_start..(data_start + compressed_len)];
- debug!("inflating {} bytes of compressed metadata", compressed_bytes.len());
- // Assume the decompressed data will be at least the size of the compressed data, so we
- // don't have to grow the buffer as much.
- let mut inflated = Vec::with_capacity(compressed_bytes.len());
- FrameDecoder::new(compressed_bytes).read_to_end(&mut inflated).map_err(|_| {
- MetadataError::LoadFailure(format!(
- "failed to decompress metadata: {}",
- filename.display()
- ))
- })?;
+ let compressed_bytes = buf.slice(|buf| &buf[data_start..(data_start + compressed_len)]);
+ if &compressed_bytes[..cmp::min(METADATA_HEADER.len(), compressed_bytes.len())]
+ == METADATA_HEADER
+ {
+ // The metadata was not actually compressed.
+ compressed_bytes
+ } else {
+ debug!("inflating {} bytes of compressed metadata", compressed_bytes.len());
+ // Assume the decompressed data will be at least the size of the compressed data, so we
+ // don't have to grow the buffer as much.
+ let mut inflated = Vec::with_capacity(compressed_bytes.len());
+ FrameDecoder::new(&*compressed_bytes).read_to_end(&mut inflated).map_err(|_| {
+ MetadataError::LoadFailure(format!(
+ "failed to decompress metadata: {}",
+ filename.display()
+ ))
+ })?;
- slice_owned(inflated, Deref::deref)
+ slice_owned(inflated, Deref::deref)
+ }
}
CrateFlavor::Rmeta => {
// mmap the file, because only a small fraction of it is read.
@@ -878,9 +881,10 @@ fn find_plugin_registrar_impl<'a>(
sess,
metadata_loader,
name,
- None, // hash
- None, // extra_filename
- true, // is_host
+ false, // is_rlib
+ None, // hash
+ None, // extra_filename
+ true, // is_host
PathKind::Crate,
);
@@ -903,7 +907,7 @@ pub fn list_file_metadata(
let flavor = get_flavor_from_path(path);
match get_metadata_section(target, flavor, path, metadata_loader) {
Ok(metadata) => metadata.list_crate_metadata(out),
- Err(msg) => write!(out, "{}\n", msg),
+ Err(msg) => write!(out, "{msg}\n"),
}
}
@@ -1125,6 +1129,7 @@ impl CrateError {
is_nightly_build: sess.is_nightly_build(),
profiler_runtime: Symbol::intern(&sess.opts.unstable_opts.profiler_runtime),
locator_triple: locator.triple,
+ is_ui_testing: sess.opts.unstable_opts.ui_testing,
});
}
}
@@ -1141,6 +1146,7 @@ impl CrateError {
is_nightly_build: sess.is_nightly_build(),
profiler_runtime: Symbol::intern(&sess.opts.unstable_opts.profiler_runtime),
locator_triple: sess.opts.target_triple.clone(),
+ is_ui_testing: sess.opts.unstable_opts.ui_testing,
});
}
}