@@ -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