@@ -24,7 +24,9 @@ use rustc_index::IndexVec;
24
24
use rustc_middle:: bug;
25
25
use rustc_middle:: ty:: { TyCtxt , TyCtxtFeed } ;
26
26
use rustc_session:: config:: { self , CrateType , ExternLocation } ;
27
- use rustc_session:: cstore:: { CrateDepKind , CrateSource , ExternCrate , ExternCrateSource } ;
27
+ use rustc_session:: cstore:: {
28
+ CrateDepKind , CrateSource , CrateStore , ExternCrate , ExternCrateSource ,
29
+ } ;
28
30
use rustc_session:: lint:: { self , BuiltinLintDiag } ;
29
31
use rustc_session:: output:: validate_crate_name;
30
32
use rustc_session:: search_paths:: PathKind ;
@@ -157,6 +159,44 @@ impl<'a> std::fmt::Debug for CrateDump<'a> {
157
159
}
158
160
}
159
161
162
+ ///
163
+ #[ derive( Clone , Copy ) ]
164
+ enum CrateOrigin < ' a > {
165
+ /// This crate was a dependency of another crate.
166
+ Dependency {
167
+ dep_root : & ' a CratePaths ,
168
+ /// Dependency info about this crate.
169
+ dep : & ' a CrateDep ,
170
+ } ,
171
+ ///
172
+ Injected ,
173
+ /// An extern that has been provided with the `force` option.
174
+ ForcedExtern ,
175
+ ///
176
+ ExternPrelude ,
177
+ /// Provided by `extern crate foo` or `extern crate foo as bar`.
178
+ #[ allow( unused) ]
179
+ AstExtern { name : Symbol , orig_name : Option < Symbol > } ,
180
+ }
181
+
182
+ impl < ' a > CrateOrigin < ' a > {
183
+ /// Return the dependency root, if any.
184
+ fn dep_root ( & self ) -> Option < & ' a CratePaths > {
185
+ match self {
186
+ CrateOrigin :: Dependency { dep_root, .. } => Some ( dep_root) ,
187
+ _ => None ,
188
+ }
189
+ }
190
+
191
+ /// Return dependency information, if any.
192
+ fn dep ( & self ) -> Option < & ' a CrateDep > {
193
+ match self {
194
+ CrateOrigin :: Dependency { dep, .. } => Some ( dep) ,
195
+ _ => None ,
196
+ }
197
+ }
198
+ }
199
+
160
200
impl CStore {
161
201
pub fn from_tcx ( tcx : TyCtxt < ' _ > ) -> FreezeReadGuard < ' _ , CStore > {
162
202
FreezeReadGuard :: map ( tcx. untracked ( ) . cstore . read ( ) , |cstore| {
@@ -404,7 +444,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
404
444
& self ,
405
445
name : Symbol ,
406
446
private_dep : Option < bool > ,
407
- dep_root : Option < & CratePaths > ,
447
+ origin : CrateOrigin < ' _ > ,
408
448
) -> bool {
409
449
// Standard library crates are never private.
410
450
if STDLIB_STABLE_CRATES . contains ( & name) {
@@ -414,16 +454,23 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
414
454
415
455
let extern_private = self . sess . opts . externs . get ( name. as_str ( ) ) . map ( |e| e. is_private_dep ) ;
416
456
417
- if name == sym:: compiler_builtins {
418
- // compiler_builtins is a private implementation detail and should never show up in
419
- // diagnostics. See also the note referencing #113634 in
420
- // `rustc_builtin_macros::...::inject`.
457
+ if matches ! ( origin, CrateOrigin :: Injected ) {
421
458
return true ;
422
459
}
460
+
461
+ // if name == sym::compiler_builtins {
462
+ // // compiler_builtins is an implementation detail and should never show up in
463
+ // // diagnostics. `dep_root` is `None` if the requested crate came from an `extern
464
+ // // crate ..`, which is the case since `compiler_builtins` is injected into AST at
465
+ // // `rustc_builtin_macros::standard_library_imports::inject`.
466
+ // //
467
+ // // See also the note at that module referencing #113634.
468
+ // return true;
469
+ // }
423
470
// Any descendants of `std` should be private. These crates are usually not marked
424
471
// private in metadata, so we ignore that field.
425
472
if extern_private. is_none ( )
426
- && let Some ( dep) = dep_root
473
+ && let Some ( dep) = origin . dep_root ( )
427
474
&& STDLIB_STABLE_CRATES . contains ( & dep. name )
428
475
{
429
476
return true ;
@@ -441,7 +488,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
441
488
fn register_crate (
442
489
& mut self ,
443
490
host_lib : Option < Library > ,
444
- dep_root : Option < & CratePaths > ,
491
+ origin : CrateOrigin < ' _ > ,
445
492
lib : Library ,
446
493
dep_kind : CrateDepKind ,
447
494
name : Symbol ,
@@ -453,7 +500,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
453
500
let Library { source, metadata } = lib;
454
501
let crate_root = metadata. get_root ( ) ;
455
502
let host_hash = host_lib. as_ref ( ) . map ( |lib| lib. metadata . get_root ( ) . hash ( ) ) ;
456
- let private_dep = self . is_private_dep ( name, private_dep, dep_root ) ;
503
+ let private_dep = self . is_private_dep ( name, private_dep, origin ) ;
457
504
458
505
// Claim this crate number and cache it
459
506
let feed = self . cstore . intern_stable_crate_id ( & crate_root, self . tcx ) ?;
@@ -469,7 +516,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
469
516
// Maintain a reference to the top most crate.
470
517
// Stash paths for top-most crate locally if necessary.
471
518
let crate_paths;
472
- let dep_root = if let Some ( dep_root) = dep_root {
519
+ let dep_root = if let Some ( dep_root) = origin . dep_root ( ) {
473
520
dep_root
474
521
} else {
475
522
crate_paths = CratePaths :: new ( crate_root. name ( ) , source. clone ( ) ) ;
@@ -577,17 +624,23 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
577
624
name : Symbol ,
578
625
span : Span ,
579
626
dep_kind : CrateDepKind ,
627
+ origin : CrateOrigin < ' _ > ,
580
628
) -> Option < CrateNum > {
581
629
self . used_extern_options . insert ( name) ;
582
- match self . maybe_resolve_crate ( name, dep_kind, None ) {
630
+ match self . maybe_resolve_crate ( name, dep_kind, origin ) {
583
631
Ok ( cnum) => {
584
632
self . cstore . set_used_recursively ( cnum) ;
585
633
Some ( cnum)
586
634
}
587
635
Err ( err) => {
588
636
debug ! ( "failed to resolve crate {} {:?}" , name, dep_kind) ;
589
- let missing_core =
590
- self . maybe_resolve_crate ( sym:: core, CrateDepKind :: Explicit , None ) . is_err ( ) ;
637
+ let missing_core = self
638
+ . maybe_resolve_crate (
639
+ sym:: core,
640
+ CrateDepKind :: Explicit ,
641
+ CrateOrigin :: ExternPrelude ,
642
+ )
643
+ . is_err ( ) ;
591
644
err. report ( self . sess , span, missing_core) ;
592
645
None
593
646
}
@@ -598,15 +651,15 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
598
651
& ' b mut self ,
599
652
name : Symbol ,
600
653
mut dep_kind : CrateDepKind ,
601
- dep_of : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
654
+ origin : CrateOrigin < ' b > ,
602
655
) -> Result < CrateNum , CrateError > {
603
656
info ! ( "resolving crate `{}`" , name) ;
604
657
if !name. as_str ( ) . is_ascii ( ) {
605
658
return Err ( CrateError :: NonAsciiName ( name) ) ;
606
659
}
607
660
608
- let dep_root = dep_of . map ( |d| d . 0 ) ;
609
- let dep = dep_of . map ( |d| d . 1 ) ;
661
+ let dep_root = origin . dep_root ( ) ;
662
+ let dep = origin . dep ( ) ;
610
663
let hash = dep. map ( |d| d. hash ) ;
611
664
let host_hash = dep. map ( |d| d. host_hash ) . flatten ( ) ;
612
665
let extra_filename = dep. map ( |d| & d. extra_filename [ ..] ) ;
@@ -649,7 +702,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
649
702
// not specified by `--extern` on command line parameters, it may be
650
703
// `private-dependency` when `register_crate` is called for the first time. Then it must be updated to
651
704
// `public-dependency` here.
652
- let private_dep = self . is_private_dep ( name, private_dep, dep_root ) ;
705
+ let private_dep = self . is_private_dep ( name, private_dep, origin ) ;
653
706
let data = self . cstore . get_crate_data_mut ( cnum) ;
654
707
if data. is_proc_macro_crate ( ) {
655
708
dep_kind = CrateDepKind :: MacrosOnly ;
@@ -660,7 +713,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
660
713
}
661
714
( LoadResult :: Loaded ( library) , host_library) => {
662
715
info ! ( "register newly loaded library for `{}`" , name) ;
663
- self . register_crate ( host_library, dep_root , library, dep_kind, name, private_dep)
716
+ self . register_crate ( host_library, origin , library, dep_kind, name, private_dep)
664
717
}
665
718
_ => panic ! ( ) ,
666
719
}
@@ -736,7 +789,10 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
736
789
CrateDepKind :: MacrosOnly => CrateDepKind :: MacrosOnly ,
737
790
_ => dep. kind ,
738
791
} ;
739
- let cnum = self . maybe_resolve_crate ( dep. name , dep_kind, Some ( ( dep_root, & dep) ) ) ?;
792
+ let cnum = self . maybe_resolve_crate ( dep. name , dep_kind, CrateOrigin :: Dependency {
793
+ dep_root,
794
+ dep : & dep,
795
+ } ) ?;
740
796
crate_num_map. push ( cnum) ;
741
797
}
742
798
@@ -830,7 +886,9 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
830
886
} ;
831
887
info ! ( "panic runtime not found -- loading {}" , name) ;
832
888
833
- let Some ( cnum) = self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit ) else {
889
+ let Some ( cnum) =
890
+ self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit , CrateOrigin :: Injected )
891
+ else {
834
892
return ;
835
893
} ;
836
894
let data = self . cstore . get_crate_data ( cnum) ;
@@ -859,7 +917,9 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
859
917
info ! ( "loading profiler" ) ;
860
918
861
919
let name = Symbol :: intern ( & self . sess . opts . unstable_opts . profiler_runtime ) ;
862
- let Some ( cnum) = self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit ) else {
920
+ let Some ( cnum) =
921
+ self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit , CrateOrigin :: Injected )
922
+ else {
863
923
return ;
864
924
} ;
865
925
let data = self . cstore . get_crate_data ( cnum) ;
@@ -972,12 +1032,71 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
972
1032
if entry. force {
973
1033
let name_interned = Symbol :: intern ( name) ;
974
1034
if !self . used_extern_options . contains ( & name_interned) {
975
- self . resolve_crate ( name_interned, DUMMY_SP , CrateDepKind :: Explicit ) ;
1035
+ self . resolve_crate (
1036
+ name_interned,
1037
+ DUMMY_SP ,
1038
+ CrateDepKind :: Explicit ,
1039
+ CrateOrigin :: ForcedExtern ,
1040
+ ) ;
976
1041
}
977
1042
}
978
1043
}
979
1044
}
980
1045
1046
+ fn inject_compiler_builtins ( & mut self , krate : & ast:: Crate ) {
1047
+ if attr:: contains_name ( & krate. attrs , sym:: compiler_builtins)
1048
+ || attr:: contains_name ( & krate. attrs , sym:: no_core)
1049
+ {
1050
+ // `compiler_builtins` does not get extern builtins, nor do `#![no_core]` crates
1051
+ info ! ( "`compiler_builtins` unneeded" ) ;
1052
+ return ;
1053
+ }
1054
+
1055
+ // let Some((cnum, _meta)) = self
1056
+ // .cstore
1057
+ // .iter_crate_data()
1058
+ // .find(|(_cnum, meta)| meta.name() == sym::compiler_builtins)
1059
+ // else {
1060
+ // info!("`compiler_builtins` crate was not found for");
1061
+ // return;
1062
+ // };
1063
+ //
1064
+ info ! ( "looking for builtins in {}" , self . cstore. crate_name( LOCAL_CRATE ) ) ;
1065
+
1066
+ // self.process_extern_crate(
1067
+ // ast::ItemKind::ExternCrate(Some(sym::compiler_builtins)),
1068
+ // def_id,
1069
+ // definitions,
1070
+ // )
1071
+
1072
+ let res = self . maybe_resolve_crate (
1073
+ sym:: compiler_builtins,
1074
+ CrateDepKind :: Explicit ,
1075
+ CrateOrigin :: Injected ,
1076
+ ) ;
1077
+
1078
+ info ! ( "BUILTINS RESULT: {res:?}" ) ;
1079
+
1080
+ // let cnum = self
1081
+ // .resolve_crate(
1082
+ // sym::compiler_builtins,
1083
+ // DUMMY_SP,
1084
+ // CrateDepKind::Explicit,
1085
+ // CrateOrigin::Injected,
1086
+ // )
1087
+ // .expect("unresolved builtins");
1088
+
1089
+ // self.cstore.update_extern_crate(cnum, ExternCrate {
1090
+ // src: ExternCrateSource::Path,
1091
+ // // src: ExternCrateSource::Extern(def_id.to_def_id()),
1092
+ // span: DUMMY_SP,
1093
+ // path_len: "compiler_builtins".len(),
1094
+ // dependency_of: LOCAL_CRATE,
1095
+ // });
1096
+
1097
+ // self.cstore.get_crate_data_mut(LOCAL_CRATE).add_dependency(cnum);
1098
+ }
1099
+
981
1100
fn inject_dependency_if (
982
1101
& mut self ,
983
1102
krate : CrateNum ,
@@ -1087,6 +1206,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1087
1206
}
1088
1207
1089
1208
pub fn postprocess ( & mut self , krate : & ast:: Crate ) {
1209
+ self . inject_compiler_builtins ( krate) ;
1090
1210
self . inject_forced_externs ( ) ;
1091
1211
self . inject_profiler_runtime ( ) ;
1092
1212
self . inject_allocator_crate ( krate) ;
@@ -1098,6 +1218,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1098
1218
info ! ( "{:?}" , CrateDump ( self . cstore) ) ;
1099
1219
}
1100
1220
1221
+ /// Process an `extern crate foo` AST node.
1101
1222
pub fn process_extern_crate (
1102
1223
& mut self ,
1103
1224
item : & ast:: Item ,
@@ -1123,7 +1244,11 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1123
1244
CrateDepKind :: Explicit
1124
1245
} ;
1125
1246
1126
- let cnum = self . resolve_crate ( name, item. span , dep_kind) ?;
1247
+ let cnum =
1248
+ self . resolve_crate ( name, item. span , dep_kind, CrateOrigin :: AstExtern {
1249
+ name,
1250
+ orig_name,
1251
+ } ) ?;
1127
1252
1128
1253
let path_len = definitions. def_path ( def_id) . data . len ( ) ;
1129
1254
self . cstore . update_extern_crate ( cnum, ExternCrate {
@@ -1139,7 +1264,8 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1139
1264
}
1140
1265
1141
1266
pub fn process_path_extern ( & mut self , name : Symbol , span : Span ) -> Option < CrateNum > {
1142
- let cnum = self . resolve_crate ( name, span, CrateDepKind :: Explicit ) ?;
1267
+ let cnum =
1268
+ self . resolve_crate ( name, span, CrateDepKind :: Explicit , CrateOrigin :: ExternPrelude ) ?;
1143
1269
1144
1270
self . cstore . update_extern_crate ( cnum, ExternCrate {
1145
1271
src : ExternCrateSource :: Path ,
@@ -1153,7 +1279,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1153
1279
}
1154
1280
1155
1281
pub fn maybe_process_path_extern ( & mut self , name : Symbol ) -> Option < CrateNum > {
1156
- self . maybe_resolve_crate ( name, CrateDepKind :: Explicit , None ) . ok ( )
1282
+ self . maybe_resolve_crate ( name, CrateDepKind :: Explicit , CrateOrigin :: ExternPrelude ) . ok ( )
1157
1283
}
1158
1284
}
1159
1285
0 commit comments