@@ -7,16 +7,16 @@ use rustc_ast::{self as ast, visit};
77use rustc_codegen_ssa:: traits:: CodegenBackend ;
88use rustc_data_structures:: parallel;
99use rustc_data_structures:: steal:: Steal ;
10- use rustc_data_structures:: sync:: { Lrc , OnceLock , WorkerLocal } ;
11- use rustc_errors:: PResult ;
10+ use rustc_data_structures:: sync:: { AppendOnlyIndexVec , FreezeLock , Lrc , OnceLock , WorkerLocal } ;
1211use rustc_expand:: base:: { ExtCtxt , LintStoreExpand } ;
1312use rustc_feature:: Features ;
1413use rustc_fs_util:: try_canonicalize;
15- use rustc_hir:: def_id:: { StableCrateId , LOCAL_CRATE } ;
14+ use rustc_hir:: def_id:: { StableCrateId , StableCrateIdMap , LOCAL_CRATE } ;
15+ use rustc_hir:: definitions:: Definitions ;
16+ use rustc_incremental:: setup_dep_graph;
1617use rustc_lint:: { unerased_lint_store, BufferedEarlyLint , EarlyCheckNode , LintStore } ;
1718use rustc_metadata:: creader:: CStore ;
1819use rustc_middle:: arena:: Arena ;
19- use rustc_middle:: dep_graph:: DepGraph ;
2020use rustc_middle:: ty:: { self , GlobalCtxt , RegisteredTools , TyCtxt } ;
2121use rustc_middle:: util:: Providers ;
2222use rustc_parse:: {
@@ -28,6 +28,7 @@ use rustc_session::code_stats::VTableSizeInfo;
2828use rustc_session:: config:: { CrateType , Input , OutFileName , OutputFilenames , OutputType } ;
2929use rustc_session:: cstore:: Untracked ;
3030use rustc_session:: output:: filename_for_input;
31+ use rustc_session:: output:: { collect_crate_types, find_crate_name} ;
3132use rustc_session:: search_paths:: PathKind ;
3233use rustc_session:: { Limit , Session } ;
3334use rustc_span:: symbol:: { sym, Symbol } ;
@@ -39,20 +40,22 @@ use std::any::Any;
3940use std:: ffi:: OsString ;
4041use std:: io:: { self , BufWriter , Write } ;
4142use std:: path:: { Path , PathBuf } ;
42- use std:: sync:: LazyLock ;
43+ use std:: sync:: { Arc , LazyLock } ;
4344use std:: { env, fs, iter} ;
4445use tracing:: { info, instrument} ;
4546
46- pub fn parse < ' a > ( sess : & ' a Session ) -> PResult < ' a , ast:: Crate > {
47- let krate = sess. time ( "parse_crate" , || {
48- let mut parser = unwrap_or_emit_fatal ( match & sess. io . input {
49- Input :: File ( file) => new_parser_from_file ( & sess. psess , file, None ) ,
50- Input :: Str { input, name } => {
51- new_parser_from_source_str ( & sess. psess , name. clone ( ) , input. clone ( ) )
52- }
53- } ) ;
54- parser. parse_crate_mod ( )
55- } ) ?;
47+ pub fn parse < ' a > ( sess : & ' a Session ) -> Result < ast:: Crate > {
48+ let krate = sess
49+ . time ( "parse_crate" , || {
50+ let mut parser = unwrap_or_emit_fatal ( match & sess. io . input {
51+ Input :: File ( file) => new_parser_from_file ( & sess. psess , file, None ) ,
52+ Input :: Str { input, name } => {
53+ new_parser_from_source_str ( & sess. psess , name. clone ( ) , input. clone ( ) )
54+ }
55+ } ) ;
56+ parser. parse_crate_mod ( )
57+ } )
58+ . map_err ( |parse_error| parse_error. emit ( ) ) ?;
5659
5760 if sess. opts . unstable_opts . input_stats {
5861 eprintln ! ( "Lines of code: {}" , sess. source_map( ) . count_lines( ) ) ;
@@ -642,20 +645,47 @@ pub static DEFAULT_QUERY_PROVIDERS: LazyLock<Providers> = LazyLock::new(|| {
642645
643646pub fn create_global_ctxt < ' tcx > (
644647 compiler : & ' tcx Compiler ,
645- crate_types : Vec < CrateType > ,
646- stable_crate_id : StableCrateId ,
647- dep_graph : DepGraph ,
648- untracked : Untracked ,
648+ mut krate : rustc_ast:: Crate ,
649649 gcx_cell : & ' tcx OnceLock < GlobalCtxt < ' tcx > > ,
650650 arena : & ' tcx WorkerLocal < Arena < ' tcx > > ,
651651 hir_arena : & ' tcx WorkerLocal < rustc_hir:: Arena < ' tcx > > ,
652- ) -> & ' tcx GlobalCtxt < ' tcx > {
652+ ) -> Result < & ' tcx GlobalCtxt < ' tcx > > {
653+ let sess = & compiler. sess ;
654+
655+ rustc_builtin_macros:: cmdline_attrs:: inject (
656+ & mut krate,
657+ & sess. psess ,
658+ & sess. opts . unstable_opts . crate_attr ,
659+ ) ;
660+
661+ // FIXME modify krate.attrs in place once #65860 is a hard error.
662+ let pre_configured_attrs = rustc_expand:: config:: pre_configure_attrs ( sess, & krate. attrs ) ;
663+
664+ // parse `#[crate_name]` even if `--crate-name` was passed, to make sure it matches.
665+ let crate_name = find_crate_name ( sess, & pre_configured_attrs) ;
666+ let crate_types = collect_crate_types ( sess, & pre_configured_attrs) ;
667+ let stable_crate_id = StableCrateId :: new (
668+ crate_name,
669+ crate_types. contains ( & CrateType :: Executable ) ,
670+ sess. opts . cg . metadata . clone ( ) ,
671+ sess. cfg_version ,
672+ ) ;
673+ let outputs = util:: build_output_filenames ( & pre_configured_attrs, sess) ;
674+ let dep_graph = setup_dep_graph ( sess) ?;
675+
676+ let cstore =
677+ FreezeLock :: new ( Box :: new ( CStore :: new ( compiler. codegen_backend . metadata_loader ( ) ) ) as _ ) ;
678+ let definitions = FreezeLock :: new ( Definitions :: new ( stable_crate_id) ) ;
679+
680+ let stable_crate_ids = FreezeLock :: new ( StableCrateIdMap :: default ( ) ) ;
681+ let untracked =
682+ Untracked { cstore, source_span : AppendOnlyIndexVec :: new ( ) , definitions, stable_crate_ids } ;
683+
653684 // We're constructing the HIR here; we don't care what we will
654685 // read, since we haven't even constructed the *input* to
655686 // incr. comp. yet.
656687 dep_graph. assert_ignored ( ) ;
657688
658- let sess = & compiler. sess ;
659689 let query_result_on_disk_cache = rustc_incremental:: load_query_result_cache ( sess) ;
660690
661691 let codegen_backend = & compiler. codegen_backend ;
@@ -669,7 +699,7 @@ pub fn create_global_ctxt<'tcx>(
669699 let incremental = dep_graph. is_fully_enabled ( ) ;
670700
671701 sess. time ( "setup_global_ctxt" , || {
672- gcx_cell. get_or_init ( move || {
702+ let qcx = gcx_cell. get_or_init ( move || {
673703 TyCtxt :: create_global_ctxt (
674704 sess,
675705 crate_types,
@@ -688,7 +718,23 @@ pub fn create_global_ctxt<'tcx>(
688718 providers. hooks ,
689719 compiler. current_gcx . clone ( ) ,
690720 )
691- } )
721+ } ) ;
722+
723+ qcx. enter ( |tcx| {
724+ let feed = tcx. create_crate_num ( stable_crate_id) . unwrap ( ) ;
725+ assert_eq ! ( feed. key( ) , LOCAL_CRATE ) ;
726+ feed. crate_name ( crate_name) ;
727+
728+ let feed = tcx. feed_unit_query ( ) ;
729+ feed. features_query ( tcx. arena . alloc ( rustc_expand:: config:: features (
730+ sess,
731+ & pre_configured_attrs,
732+ crate_name,
733+ ) ) ) ;
734+ feed. crate_for_resolver ( tcx. arena . alloc ( Steal :: new ( ( krate, pre_configured_attrs) ) ) ) ;
735+ feed. output_filenames ( Arc :: new ( outputs) ) ;
736+ } ) ;
737+ Ok ( qcx)
692738 } )
693739}
694740
0 commit comments