Prepend temp files with a string per invocation of rustc

This commit is contained in:
Michael Goulet
2025-04-06 23:50:16 +00:00
parent effef88ac7
commit 9c372d8940
17 changed files with 260 additions and 50 deletions

View File

@@ -1016,10 +1016,13 @@ impl OutFileName {
outputs: &OutputFilenames,
flavor: OutputType,
codegen_unit_name: &str,
invocation_temp: Option<&str>,
) -> PathBuf {
match *self {
OutFileName::Real(ref path) => path.clone(),
OutFileName::Stdout => outputs.temp_path_for_cgu(flavor, codegen_unit_name),
OutFileName::Stdout => {
outputs.temp_path_for_cgu(flavor, codegen_unit_name, invocation_temp)
}
}
}
@@ -1094,21 +1097,41 @@ impl OutputFilenames {
/// Gets the path where a compilation artifact of the given type for the
/// given codegen unit should be placed on disk. If codegen_unit_name is
/// None, a path distinct from those of any codegen unit will be generated.
pub fn temp_path_for_cgu(&self, flavor: OutputType, codegen_unit_name: &str) -> PathBuf {
pub fn temp_path_for_cgu(
&self,
flavor: OutputType,
codegen_unit_name: &str,
invocation_temp: Option<&str>,
) -> PathBuf {
let extension = flavor.extension();
self.temp_path_ext_for_cgu(extension, codegen_unit_name)
self.temp_path_ext_for_cgu(extension, codegen_unit_name, invocation_temp)
}
/// Like `temp_path`, but specifically for dwarf objects.
pub fn temp_path_dwo_for_cgu(&self, codegen_unit_name: &str) -> PathBuf {
self.temp_path_ext_for_cgu(DWARF_OBJECT_EXT, codegen_unit_name)
pub fn temp_path_dwo_for_cgu(
&self,
codegen_unit_name: &str,
invocation_temp: Option<&str>,
) -> PathBuf {
self.temp_path_ext_for_cgu(DWARF_OBJECT_EXT, codegen_unit_name, invocation_temp)
}
/// Like `temp_path`, but also supports things where there is no corresponding
/// OutputType, like noopt-bitcode or lto-bitcode.
pub fn temp_path_ext_for_cgu(&self, ext: &str, codegen_unit_name: &str) -> PathBuf {
pub fn temp_path_ext_for_cgu(
&self,
ext: &str,
codegen_unit_name: &str,
invocation_temp: Option<&str>,
) -> PathBuf {
let mut extension = codegen_unit_name.to_string();
// Append `.{invocation_temp}` to ensure temporary files are unique.
if let Some(rng) = invocation_temp {
extension.push('.');
extension.push_str(rng);
}
// FIXME: This is sketchy that we're not appending `.rcgu` when the ext is empty.
// Append `.rcgu.{ext}`.
if !ext.is_empty() {
@@ -1144,9 +1167,10 @@ impl OutputFilenames {
split_debuginfo_kind: SplitDebuginfo,
split_dwarf_kind: SplitDwarfKind,
cgu_name: &str,
invocation_temp: Option<&str>,
) -> Option<PathBuf> {
let obj_out = self.temp_path_for_cgu(OutputType::Object, cgu_name);
let dwo_out = self.temp_path_dwo_for_cgu(cgu_name);
let obj_out = self.temp_path_for_cgu(OutputType::Object, cgu_name, invocation_temp);
let dwo_out = self.temp_path_dwo_for_cgu(cgu_name, invocation_temp);
match (split_debuginfo_kind, split_dwarf_kind) {
(SplitDebuginfo::Off, SplitDwarfKind::Single | SplitDwarfKind::Split) => None,
// Single mode doesn't change how DWARF is emitted, but does add Split DWARF attributes