@@ -59,7 +59,7 @@ use rustc_session::getopts::{self, Matches};
5959use  rustc_session:: lint:: { Lint ,  LintId } ; 
6060use  rustc_session:: output:: collect_crate_types; 
6161use  rustc_session:: { EarlyDiagCtxt ,  Session ,  config,  filesearch} ; 
62- use  rustc_span:: FileName ; 
62+ use  rustc_span:: { FileName ,   Symbol } ; 
6363use  rustc_target:: json:: ToJson ; 
6464use  rustc_target:: spec:: { Target ,  TargetTuple } ; 
6565use  time:: OffsetDateTime ; 
@@ -290,7 +290,8 @@ pub fn run_compiler(at_args: &[String], callbacks: &mut (dyn Callbacks + Send))
290290            return  early_exit( ) ; 
291291        } 
292292
293-         if  print_crate_info( codegen_backend,  sess,  has_input)  == Compilation :: Stop  { 
293+         let  ( c,  crate_name)  = print_crate_info( codegen_backend,  sess,  has_input) ; 
294+         if  c == Compilation :: Stop  { 
294295            return  early_exit( ) ; 
295296        } 
296297
@@ -316,7 +317,7 @@ pub fn run_compiler(at_args: &[String], callbacks: &mut (dyn Callbacks + Send))
316317        // If pretty printing is requested: Figure out the representation, print it and exit 
317318        if  let  Some ( pp_mode)  = sess. opts. pretty { 
318319            if  pp_mode. needs_ast_map( )  { 
319-                 create_and_enter_global_ctxt( compiler,  krate,  |tcx| { 
320+                 create_and_enter_global_ctxt( compiler,  krate,  crate_name ,   |tcx| { 
320321                    tcx. ensure_ok( ) . early_lint_checks( ( ) ) ; 
321322                    pretty:: print( sess,  pp_mode,  pretty:: PrintExtra :: NeedsAstMap  {  tcx } ) ; 
322323                    passes:: write_dep_info( tcx) ; 
@@ -336,7 +337,7 @@ pub fn run_compiler(at_args: &[String], callbacks: &mut (dyn Callbacks + Send))
336337            return  early_exit( ) ; 
337338        } 
338339
339-         let  linker = create_and_enter_global_ctxt( compiler,  krate,  |tcx| { 
340+         let  linker = create_and_enter_global_ctxt( compiler,  krate,  crate_name ,   |tcx| { 
340341            let  early_exit = || { 
341342                sess. dcx( ) . abort_if_errors( ) ; 
342343                None 
@@ -607,18 +608,23 @@ fn print_crate_info(
607608    codegen_backend:  & dyn CodegenBackend , 
608609    sess:  & Session , 
609610    parse_attrs:  bool , 
610- )  -> Compilation  { 
611+ )  -> ( Compilation ,   Option < Symbol > )  { 
611612    use  rustc_session:: config:: PrintKind :: * ; 
612613    // This import prevents the following code from using the printing macros 
613614    // used by the rest of the module. Within this function, we only write to 
614615    // the output specified by `sess.io.output_file`. 
615616    #[ allow( unused_imports) ] 
616617    use  { do_not_use_safe_print as  safe_print,  do_not_use_safe_print as  safe_println} ; 
617618
619+     let  mut  crate_name = None ; 
620+     let  mut  get_crate_name = |attrs| { 
621+         * crate_name. get_or_insert_with( || passes:: get_crate_name( sess,  attrs) ) 
622+     } ; 
623+ 
618624    // NativeStaticLibs and LinkArgs are special - printed during linking 
619625    // (empty iterator returns true) 
620626    if  sess. opts. prints. iter( ) . all( |p| p. kind == NativeStaticLibs  || p. kind == LinkArgs )  { 
621-         return  Compilation :: Continue ; 
627+         return  ( Compilation :: Continue ,  crate_name ) ; 
622628    } 
623629
624630    let  attrs = if  parse_attrs { 
@@ -627,7 +633,7 @@ fn print_crate_info(
627633            Ok ( attrs)  => Some ( attrs) , 
628634            Err ( parse_error)  => { 
629635                parse_error. emit( ) ; 
630-                 return  Compilation :: Stop ; 
636+                 return  ( Compilation :: Stop ,  crate_name ) ; 
631637            } 
632638        } 
633639    }  else { 
@@ -664,24 +670,23 @@ fn print_crate_info(
664670            FileNames  => { 
665671                let  Some ( attrs)  = attrs. as_ref( )  else { 
666672                    // no crate attributes, print out an error and exit 
667-                     return  Compilation :: Continue ; 
673+                     return  ( Compilation :: Continue ,  crate_name ) ; 
668674                } ; 
669675                let  t_outputs = rustc_interface:: util:: build_output_filenames( attrs,  sess) ; 
670-                 let  crate_name = passes:: get_crate_name( sess,  attrs) ; 
671676                let  crate_types = collect_crate_types( sess,  attrs) ; 
672677                for  & style in & crate_types { 
673678                    let  fname = rustc_session:: output:: filename_for_input( 
674-                         sess,  style,  crate_name ,  & t_outputs, 
679+                         sess,  style,  get_crate_name ( attrs ) ,  & t_outputs, 
675680                    ) ; 
676681                    println_info!( "{}" ,  fname. as_path( ) . file_name( ) . unwrap( ) . to_string_lossy( ) ) ; 
677682                } 
678683            } 
679684            CrateName  => { 
680685                let  Some ( attrs)  = attrs. as_ref( )  else { 
681686                    // no crate attributes, print out an error and exit 
682-                     return  Compilation :: Continue ; 
687+                     return  ( Compilation :: Continue ,  crate_name ) ; 
683688                } ; 
684-                 println_info!( "{}" ,  passes :: get_crate_name( sess ,   attrs) ) ; 
689+                 println_info!( "{}" ,  get_crate_name( attrs) ) ; 
685690            } 
686691            Cfg  => { 
687692                let  mut  cfgs = sess
@@ -786,7 +791,7 @@ fn print_crate_info(
786791
787792        req. out. overwrite( & crate_info,  sess) ; 
788793    } 
789-     Compilation :: Stop 
794+     ( Compilation :: Stop ,  crate_name ) 
790795} 
791796
792797/// Prints version information 
0 commit comments