@@ -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,22 @@ 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 =
621+ |attrs| * crate_name. get_or_insert_with( || passes:: get_crate_name( sess, attrs) ) ;
622+
618623 // NativeStaticLibs and LinkArgs are special - printed during linking
619624 // (empty iterator returns true)
620625 if sess. opts. prints. iter( ) . all( |p| p. kind == NativeStaticLibs || p. kind == LinkArgs ) {
621- return Compilation :: Continue ;
626+ return ( Compilation :: Continue , crate_name ) ;
622627 }
623628
624629 let attrs = if parse_attrs {
@@ -627,7 +632,7 @@ fn print_crate_info(
627632 Ok ( attrs) => Some ( attrs) ,
628633 Err ( parse_error) => {
629634 parse_error. emit( ) ;
630- return Compilation :: Stop ;
635+ return ( Compilation :: Stop , crate_name ) ;
631636 }
632637 }
633638 } else {
@@ -664,24 +669,26 @@ fn print_crate_info(
664669 FileNames => {
665670 let Some ( attrs) = attrs. as_ref( ) else {
666671 // no crate attributes, print out an error and exit
667- return Compilation :: Continue ;
672+ return ( Compilation :: Continue , crate_name ) ;
668673 } ;
669674 let t_outputs = rustc_interface:: util:: build_output_filenames( attrs, sess) ;
670- let crate_name = passes:: get_crate_name( sess, attrs) ;
671675 let crate_types = collect_crate_types( sess, attrs) ;
672676 for & style in & crate_types {
673677 let fname = rustc_session:: output:: filename_for_input(
674- sess, style, crate_name, & t_outputs,
678+ sess,
679+ style,
680+ get_crate_name( attrs) ,
681+ & t_outputs,
675682 ) ;
676683 println_info!( "{}" , fname. as_path( ) . file_name( ) . unwrap( ) . to_string_lossy( ) ) ;
677684 }
678685 }
679686 CrateName => {
680687 let Some ( attrs) = attrs. as_ref( ) else {
681688 // no crate attributes, print out an error and exit
682- return Compilation :: Continue ;
689+ return ( Compilation :: Continue , crate_name ) ;
683690 } ;
684- println_info!( "{}" , passes :: get_crate_name( sess , attrs) ) ;
691+ println_info!( "{}" , get_crate_name( attrs) ) ;
685692 }
686693 Cfg => {
687694 let mut cfgs = sess
@@ -786,7 +793,7 @@ fn print_crate_info(
786793
787794 req. out. overwrite( & crate_info, sess) ;
788795 }
789- Compilation :: Stop
796+ ( Compilation :: Stop , crate_name )
790797}
791798
792799/// Prints version information
0 commit comments