@@ -718,19 +718,17 @@ pub fn create_and_enter_global_ctxt<T>(
718
718
let arena = WorkerLocal :: new ( |_| Arena :: default ( ) ) ;
719
719
let hir_arena = WorkerLocal :: new ( |_| rustc_hir:: Arena :: default ( ) ) ;
720
720
721
- let gcx = create_global_ctxt ( compiler, krate, & gcx_cell, & arena, & hir_arena) ;
722
- let ret = gcx. enter ( f) ;
723
- gcx. finish ( ) ;
724
- ret
721
+ create_and_enter_global_ctxt_inner ( compiler, krate, & gcx_cell, & arena, & hir_arena, f)
725
722
}
726
723
727
- fn create_global_ctxt < ' tcx > (
724
+ fn create_and_enter_global_ctxt_inner < ' tcx , T > (
728
725
compiler : & ' tcx Compiler ,
729
726
mut krate : rustc_ast:: Crate ,
730
727
gcx_cell : & ' tcx OnceLock < GlobalCtxt < ' tcx > > ,
731
728
arena : & ' tcx WorkerLocal < Arena < ' tcx > > ,
732
729
hir_arena : & ' tcx WorkerLocal < rustc_hir:: Arena < ' tcx > > ,
733
- ) -> & ' tcx GlobalCtxt < ' tcx > {
730
+ f : impl FnOnce ( TyCtxt < ' tcx > ) -> T ,
731
+ ) -> T {
734
732
let sess = & compiler. sess ;
735
733
736
734
rustc_builtin_macros:: cmdline_attrs:: inject (
@@ -778,43 +776,45 @@ fn create_global_ctxt<'tcx>(
778
776
779
777
let incremental = dep_graph. is_fully_enabled ( ) ;
780
778
781
- sess. time ( "setup_global_ctxt" , || {
782
- let qcx = gcx_cell. get_or_init ( move || {
783
- TyCtxt :: create_global_ctxt (
784
- sess,
785
- crate_types,
786
- stable_crate_id,
787
- arena,
788
- hir_arena,
789
- untracked,
790
- dep_graph,
791
- rustc_query_impl:: query_callbacks ( arena) ,
792
- rustc_query_impl:: query_system (
793
- providers. queries ,
794
- providers. extern_queries ,
795
- query_result_on_disk_cache,
796
- incremental,
797
- ) ,
798
- providers. hooks ,
799
- compiler. current_gcx . clone ( ) ,
800
- )
801
- } ) ;
779
+ let qcx = gcx_cell. get_or_init ( move || {
780
+ TyCtxt :: create_global_ctxt (
781
+ sess,
782
+ crate_types,
783
+ stable_crate_id,
784
+ arena,
785
+ hir_arena,
786
+ untracked,
787
+ dep_graph,
788
+ rustc_query_impl:: query_callbacks ( arena) ,
789
+ rustc_query_impl:: query_system (
790
+ providers. queries ,
791
+ providers. extern_queries ,
792
+ query_result_on_disk_cache,
793
+ incremental,
794
+ ) ,
795
+ providers. hooks ,
796
+ compiler. current_gcx . clone ( ) ,
797
+ )
798
+ } ) ;
802
799
803
- qcx. enter ( |tcx| {
804
- let feed = tcx. create_crate_num ( stable_crate_id) . unwrap ( ) ;
805
- assert_eq ! ( feed. key( ) , LOCAL_CRATE ) ;
806
- feed. crate_name ( crate_name) ;
800
+ qcx. enter ( |tcx| {
801
+ let feed = tcx. create_crate_num ( stable_crate_id) . unwrap ( ) ;
802
+ assert_eq ! ( feed. key( ) , LOCAL_CRATE ) ;
803
+ feed. crate_name ( crate_name) ;
807
804
808
- let feed = tcx. feed_unit_query ( ) ;
809
- feed. features_query ( tcx. arena . alloc ( rustc_expand:: config:: features (
810
- sess,
811
- & pre_configured_attrs,
812
- crate_name,
813
- ) ) ) ;
814
- feed. crate_for_resolver ( tcx. arena . alloc ( Steal :: new ( ( krate, pre_configured_attrs) ) ) ) ;
815
- feed. output_filenames ( Arc :: new ( outputs) ) ;
816
- } ) ;
817
- qcx
805
+ let feed = tcx. feed_unit_query ( ) ;
806
+ feed. features_query ( tcx. arena . alloc ( rustc_expand:: config:: features (
807
+ sess,
808
+ & pre_configured_attrs,
809
+ crate_name,
810
+ ) ) ) ;
811
+ feed. crate_for_resolver ( tcx. arena . alloc ( Steal :: new ( ( krate, pre_configured_attrs) ) ) ) ;
812
+ feed. output_filenames ( Arc :: new ( outputs) ) ;
813
+
814
+ let res = f ( tcx) ;
815
+ // FIXME maybe run finish even when a fatal error occured? or at least tcx.alloc_self_profile_query_strings()?
816
+ tcx. finish ( ) ;
817
+ res
818
818
} )
819
819
}
820
820
0 commit comments