1
Fork 0

rustc_codegen_ssa: Buffer file writes in link_rlib

This makes this step take ~25ms on my machine (M3 Max 64GB) for Zed repo instead of ~150ms. Additionally it takes down the time needed for a clean cargo build of ripgrep from ~6.1s to 5.9s.
This change is mostly relevant for crates with multiple large CGUs.
This commit is contained in:
Piotr Osiewicz 2024-12-29 01:17:18 +01:00
parent 3c1e750364
commit 563920ce14

View file

@ -2,7 +2,7 @@ use std::env;
use std::error::Error;
use std::ffi::OsString;
use std::fs::{self, File};
use std::io::{self, Write};
use std::io::{self, BufWriter, Write};
use std::path::{Path, PathBuf};
use ar_archive_writer::{
@ -493,7 +493,6 @@ impl<'a> ArArchiveBuilder<'a> {
perms: 0o644,
})
}
// Write to a temporary file first before atomically renaming to the final name.
// This prevents programs (including rustc) from attempting to read a partial archive.
// It also enables writing an archive with the same filename as a dependency on Windows as
@ -509,9 +508,9 @@ impl<'a> ArArchiveBuilder<'a> {
io_error_context("couldn't create a directory for the temp file", err)
})?;
let archive_tmpfile_path = archive_tmpdir.path().join("tmp.a");
let mut archive_tmpfile = File::create_new(&archive_tmpfile_path)
let archive_tmpfile = File::create_new(&archive_tmpfile_path)
.map_err(|err| io_error_context("couldn't create the temp file", err))?;
let mut archive_tmpfile = BufWriter::new(archive_tmpfile);
write_archive_to_stream(
&mut archive_tmpfile,
&entries,
@ -519,7 +518,8 @@ impl<'a> ArArchiveBuilder<'a> {
false,
/* is_ec = */ self.sess.target.arch == "arm64ec",
)?;
archive_tmpfile.flush()?;
drop(archive_tmpfile);
let any_entries = !entries.is_empty();
drop(entries);
// Drop src_archives to unmap all input archives, which is necessary if we want to write the