checksum-freshness: Fix incorrect hash/file length values of binary
dependency files
This commit is contained in:
parent
a1a944880f
commit
0df94dd94e
2 changed files with 23 additions and 16 deletions
|
|
@ -275,7 +275,15 @@ fn load_binary_file(
|
|||
}
|
||||
};
|
||||
match cx.source_map().load_binary_file(&resolved_path) {
|
||||
Ok(data) => Ok(data),
|
||||
Ok(data) => {
|
||||
cx.sess
|
||||
.psess
|
||||
.file_depinfo
|
||||
.borrow_mut()
|
||||
.insert(Symbol::intern(&resolved_path.to_string_lossy()));
|
||||
|
||||
Ok(data)
|
||||
}
|
||||
Err(io_err) => {
|
||||
let mut err = cx.dcx().struct_span_err(
|
||||
macro_span,
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ use rustc_ast as ast;
|
|||
use rustc_attr_parsing::{AttributeParser, ShouldEmit};
|
||||
use rustc_codegen_ssa::traits::CodegenBackend;
|
||||
use rustc_codegen_ssa::{CodegenResults, CrateInfo};
|
||||
use rustc_data_structures::indexmap::IndexMap;
|
||||
use rustc_data_structures::jobserver::Proxy;
|
||||
use rustc_data_structures::steal::Steal;
|
||||
use rustc_data_structures::sync::{AppendOnlyIndexVec, FreezeLock, WorkerLocal};
|
||||
|
|
@ -586,7 +587,7 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
|
|||
let result: io::Result<()> = try {
|
||||
// Build a list of files used to compile the output and
|
||||
// write Makefile-compatible dependency rules
|
||||
let mut files: Vec<(String, u64, Option<SourceFileHash>)> = sess
|
||||
let mut files: IndexMap<String, (u64, Option<SourceFileHash>)> = sess
|
||||
.source_map()
|
||||
.files()
|
||||
.iter()
|
||||
|
|
@ -595,10 +596,12 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
|
|||
.map(|fmap| {
|
||||
(
|
||||
escape_dep_filename(&fmap.name.prefer_local_unconditionally().to_string()),
|
||||
// This needs to be unnormalized,
|
||||
// as external tools wouldn't know how rustc normalizes them
|
||||
fmap.unnormalized_source_len as u64,
|
||||
fmap.checksum_hash,
|
||||
(
|
||||
// This needs to be unnormalized,
|
||||
// as external tools wouldn't know how rustc normalizes them
|
||||
fmap.unnormalized_source_len as u64,
|
||||
fmap.checksum_hash,
|
||||
),
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
|
|
@ -616,7 +619,7 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
|
|||
fn hash_iter_files<P: AsRef<Path>>(
|
||||
it: impl Iterator<Item = P>,
|
||||
checksum_hash_algo: Option<SourceFileHashAlgorithm>,
|
||||
) -> impl Iterator<Item = (P, u64, Option<SourceFileHash>)> {
|
||||
) -> impl Iterator<Item = (P, (u64, Option<SourceFileHash>))> {
|
||||
it.map(move |path| {
|
||||
match checksum_hash_algo.and_then(|algo| {
|
||||
fs::File::open(path.as_ref())
|
||||
|
|
@ -632,8 +635,8 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
|
|||
})
|
||||
.ok()
|
||||
}) {
|
||||
Some((file_len, checksum)) => (path, file_len, Some(checksum)),
|
||||
None => (path, 0, None),
|
||||
Some((file_len, checksum)) => (path, (file_len, Some(checksum))),
|
||||
None => (path, (0, None)),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
@ -707,18 +710,14 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
|
|||
file,
|
||||
"{}: {}\n",
|
||||
path.display(),
|
||||
files
|
||||
.iter()
|
||||
.map(|(path, _file_len, _checksum_hash_algo)| path.as_str())
|
||||
.intersperse(" ")
|
||||
.collect::<String>()
|
||||
files.keys().map(String::as_str).intersperse(" ").collect::<String>()
|
||||
)?;
|
||||
}
|
||||
|
||||
// Emit a fake target for each input file to the compilation. This
|
||||
// prevents `make` from spitting out an error if a file is later
|
||||
// deleted. For more info see #28735
|
||||
for (path, _file_len, _checksum_hash_algo) in &files {
|
||||
for path in files.keys() {
|
||||
writeln!(file, "{path}:")?;
|
||||
}
|
||||
|
||||
|
|
@ -747,7 +746,7 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
|
|||
if sess.opts.unstable_opts.checksum_hash_algorithm().is_some() {
|
||||
files
|
||||
.iter()
|
||||
.filter_map(|(path, file_len, hash_algo)| {
|
||||
.filter_map(|(path, (file_len, hash_algo))| {
|
||||
hash_algo.map(|hash_algo| (path, file_len, hash_algo))
|
||||
})
|
||||
.try_for_each(|(path, file_len, checksum_hash)| {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue