11use rustc_data_structures:: fx:: FxHashSet ;
2+ use rustc_data_structures:: temp_dir:: MaybeTempDir ;
23use rustc_fs_util:: fix_windows_verbatim_for_gcc;
34use rustc_hir:: def_id:: CrateNum ;
45use rustc_middle:: middle:: cstore:: { EncodedMetadata , LibSource , NativeLib } ;
@@ -23,7 +24,7 @@ use super::rpath::{self, RPathConfig};
2324use crate :: { looks_like_rust_object_file, CodegenResults , CrateInfo , METADATA_FILENAME } ;
2425
2526use cc:: windows_registry;
26- use tempfile:: { Builder as TempFileBuilder , TempDir } ;
27+ use tempfile:: Builder as TempFileBuilder ;
2728
2829use std:: ffi:: OsString ;
2930use std:: path:: { Path , PathBuf } ;
@@ -70,35 +71,29 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(
7071 }
7172 } ) ;
7273
73- let tmpdir = TempFileBuilder :: new ( )
74- . prefix ( "rustc" )
75- . tempdir ( )
76- . unwrap_or_else ( |err| sess. fatal ( & format ! ( "couldn't create a temp dir: {}" , err) ) ) ;
77-
7874 if outputs. outputs . should_codegen ( ) {
75+ let tmpdir = TempFileBuilder :: new ( )
76+ . prefix ( "rustc" )
77+ . tempdir ( )
78+ . unwrap_or_else ( |err| sess. fatal ( & format ! ( "couldn't create a temp dir: {}" , err) ) ) ;
79+ let path = MaybeTempDir :: new ( tmpdir, sess. opts . cg . save_temps ) ;
7980 let out_filename = out_filename ( sess, crate_type, outputs, crate_name) ;
8081 match crate_type {
8182 CrateType :: Rlib => {
8283 let _timer = sess. timer ( "link_rlib" ) ;
83- link_rlib :: < B > (
84- sess,
85- codegen_results,
86- RlibFlavor :: Normal ,
87- & out_filename,
88- & tmpdir,
89- )
90- . build ( ) ;
84+ link_rlib :: < B > ( sess, codegen_results, RlibFlavor :: Normal , & out_filename, & path)
85+ . build ( ) ;
9186 }
9287 CrateType :: Staticlib => {
93- link_staticlib :: < B > ( sess, codegen_results, & out_filename, & tmpdir ) ;
88+ link_staticlib :: < B > ( sess, codegen_results, & out_filename, & path ) ;
9489 }
9590 _ => {
9691 link_natively :: < B > (
9792 sess,
9893 crate_type,
9994 & out_filename,
10095 codegen_results,
101- tmpdir . path ( ) ,
96+ path. as_ref ( ) ,
10297 target_cpu,
10398 ) ;
10499 }
@@ -107,10 +102,6 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(
107102 sess. parse_sess . span_diagnostic . emit_artifact_notification ( & out_filename, "link" ) ;
108103 }
109104 }
110-
111- if sess. opts . cg . save_temps {
112- let _ = tmpdir. into_path ( ) ;
113- }
114105 }
115106
116107 // Remove the temporary object file and metadata if we aren't saving temps
@@ -279,8 +270,8 @@ pub fn each_linked_rlib(
279270/// building an `.rlib` (stomping over one another), or writing an `.rmeta` into a
280271/// directory being searched for `extern crate` (observing an incomplete file).
281272/// The returned path is the temporary file containing the complete metadata.
282- pub fn emit_metadata ( sess : & Session , metadata : & EncodedMetadata , tmpdir : & TempDir ) -> PathBuf {
283- let out_filename = tmpdir. path ( ) . join ( METADATA_FILENAME ) ;
273+ pub fn emit_metadata ( sess : & Session , metadata : & EncodedMetadata , tmpdir : & MaybeTempDir ) -> PathBuf {
274+ let out_filename = tmpdir. as_ref ( ) . join ( METADATA_FILENAME ) ;
284275 let result = fs:: write ( & out_filename, & metadata. raw_data ) ;
285276
286277 if let Err ( e) = result {
@@ -301,7 +292,7 @@ fn link_rlib<'a, B: ArchiveBuilder<'a>>(
301292 codegen_results : & CodegenResults ,
302293 flavor : RlibFlavor ,
303294 out_filename : & Path ,
304- tmpdir : & TempDir ,
295+ tmpdir : & MaybeTempDir ,
305296) -> B {
306297 info ! ( "preparing rlib to {:?}" , out_filename) ;
307298 let mut ab = <B as ArchiveBuilder >:: new ( sess, out_filename, None ) ;
@@ -406,7 +397,7 @@ fn link_staticlib<'a, B: ArchiveBuilder<'a>>(
406397 sess : & ' a Session ,
407398 codegen_results : & CodegenResults ,
408399 out_filename : & Path ,
409- tempdir : & TempDir ,
400+ tempdir : & MaybeTempDir ,
410401) {
411402 let mut ab =
412403 link_rlib :: < B > ( sess, codegen_results, RlibFlavor :: StaticlibBase , out_filename, tempdir) ;
0 commit comments