Skip to content

Commit 32bd529

Browse files
committed
Avoid writing empty metadata reference file when -Zsplit-metadata is disabled
1 parent 646f2a5 commit 32bd529

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
lines changed

compiler/rustc_metadata/src/fs.rs

+14-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::{fs, io};
33

44
use rustc_data_structures::temp_dir::MaybeTempDir;
55
use rustc_middle::ty::TyCtxt;
6-
use rustc_session::config::{OutFileName, OutputType};
6+
use rustc_session::config::{CrateType, OutFileName, OutputType};
77
use rustc_session::output::filename_for_metadata;
88
use rustc_session::{MetadataKind, Session};
99
use tempfile::Builder as TempFileBuilder;
@@ -51,7 +51,13 @@ pub fn encode_and_write_metadata(tcx: TyCtxt<'_>) -> (EncodedMetadata, bool) {
5151
.unwrap_or_else(|err| tcx.dcx().emit_fatal(FailedCreateTempdir { err }));
5252
let metadata_tmpdir = MaybeTempDir::new(metadata_tmpdir, tcx.sess.opts.cg.save_temps);
5353
let metadata_filename = metadata_tmpdir.as_ref().join("full.rmeta");
54-
let metadata_reference_filename = metadata_tmpdir.as_ref().join("ref.rmeta");
54+
let metadata_reference_filename = if tcx.sess.opts.unstable_opts.split_metadata
55+
&& !tcx.crate_types().contains(&CrateType::ProcMacro)
56+
{
57+
Some(metadata_tmpdir.as_ref().join("ref.rmeta"))
58+
} else {
59+
None
60+
};
5561

5662
// Always create a file at `metadata_filename`, even if we have nothing to write to it.
5763
// This simplifies the creation of the output `out_filename` when requested.
@@ -61,12 +67,14 @@ pub fn encode_and_write_metadata(tcx: TyCtxt<'_>) -> (EncodedMetadata, bool) {
6167
std::fs::File::create(&metadata_filename).unwrap_or_else(|err| {
6268
tcx.dcx().emit_fatal(FailedCreateFile { filename: &metadata_filename, err });
6369
});
64-
std::fs::File::create(&metadata_reference_filename).unwrap_or_else(|err| {
65-
tcx.dcx().emit_fatal(FailedCreateFile { filename: &metadata_filename, err });
66-
});
70+
if let Some(metadata_reference_filename) = &metadata_reference_filename {
71+
std::fs::File::create(metadata_reference_filename).unwrap_or_else(|err| {
72+
tcx.dcx().emit_fatal(FailedCreateFile { filename: &metadata_filename, err });
73+
});
74+
}
6775
}
6876
MetadataKind::Uncompressed | MetadataKind::Compressed => {
69-
encode_metadata(tcx, &metadata_filename, &metadata_reference_filename)
77+
encode_metadata(tcx, &metadata_filename, metadata_reference_filename.as_deref())
7078
}
7179
};
7280

compiler/rustc_metadata/src/rmeta/encoder.rs

+9-12
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use rustc_span::{
3333
};
3434
use tracing::{debug, instrument, trace};
3535

36-
use crate::errors::{FailCreateFileEncoder, FailWriteFile, FailedCreateFile};
36+
use crate::errors::{FailCreateFileEncoder, FailWriteFile};
3737
use crate::rmeta::*;
3838

3939
pub(super) struct EncodeContext<'a, 'tcx> {
@@ -2240,7 +2240,7 @@ impl EncodedMetadata {
22402240
#[inline]
22412241
pub fn from_path(
22422242
path: PathBuf,
2243-
reference_path: PathBuf,
2243+
reference_path: Option<PathBuf>,
22442244
temp_dir: Option<MaybeTempDir>,
22452245
) -> std::io::Result<Self> {
22462246
let file = std::fs::File::open(&path)?;
@@ -2250,8 +2250,11 @@ impl EncodedMetadata {
22502250
}
22512251
let full_mmap = unsafe { Some(Mmap::map(file)?) };
22522252

2253-
let reference = std::fs::read(reference_path)?;
2254-
let reference = if reference.is_empty() { None } else { Some(reference) };
2253+
let reference = if let Some(reference_path) = reference_path {
2254+
Some(std::fs::read(reference_path)?)
2255+
} else {
2256+
None
2257+
};
22552258

22562259
Ok(Self { full_mmap, reference, _temp_dir: temp_dir })
22572260
}
@@ -2296,7 +2299,7 @@ impl<D: Decoder> Decodable<D> for EncodedMetadata {
22962299
}
22972300
}
22982301

2299-
pub fn encode_metadata(tcx: TyCtxt<'_>, path: &Path, ref_path: &Path) {
2302+
pub fn encode_metadata(tcx: TyCtxt<'_>, path: &Path, ref_path: Option<&Path>) {
23002303
let _prof_timer = tcx.prof.verbose_generic_activity("generate_crate_metadata");
23012304

23022305
// Since encoding metadata is not in a query, and nothing is cached,
@@ -2327,9 +2330,7 @@ pub fn encode_metadata(tcx: TyCtxt<'_>, path: &Path, ref_path: &Path) {
23272330
root.position.get()
23282331
});
23292332

2330-
if tcx.sess.opts.unstable_opts.split_metadata
2331-
&& !tcx.crate_types().contains(&CrateType::ProcMacro)
2332-
{
2333+
if let Some(ref_path) = ref_path {
23332334
with_encode_metadata_header(tcx, ref_path, |ecx| {
23342335
let header: LazyValue<CrateHeader> = ecx.lazy(CrateHeader {
23352336
name: tcx.crate_name(LOCAL_CRATE),
@@ -2340,10 +2341,6 @@ pub fn encode_metadata(tcx: TyCtxt<'_>, path: &Path, ref_path: &Path) {
23402341
});
23412342
header.position.get()
23422343
});
2343-
} else {
2344-
std::fs::File::create(&ref_path).unwrap_or_else(|err| {
2345-
tcx.dcx().emit_fatal(FailedCreateFile { filename: &ref_path, err });
2346-
});
23472344
}
23482345
}
23492346

0 commit comments

Comments
 (0)