2
2
3
3
use crate :: cstore:: { self , CStore , CrateSource , MetadataBlob } ;
4
4
use crate :: locator:: { self , CratePaths } ;
5
- use crate :: schema:: { CrateRoot } ;
5
+ use crate :: schema:: { CrateRoot , CrateDep } ;
6
6
use rustc_data_structures:: sync:: { Lrc , RwLock , Lock } ;
7
7
8
8
use rustc:: hir:: def_id:: CrateNum ;
@@ -190,7 +190,7 @@ impl<'a> CrateLoader<'a> {
190
190
fn register_crate (
191
191
& mut self ,
192
192
host_lib : Option < Library > ,
193
- root : & Option < CratePaths > ,
193
+ root : Option < & CratePaths > ,
194
194
span : Span ,
195
195
lib : Library ,
196
196
dep_kind : DepKind ,
@@ -208,19 +208,20 @@ impl<'a> CrateLoader<'a> {
208
208
// Claim this crate number and cache it
209
209
let cnum = self . cstore . alloc_new_crate_num ( ) ;
210
210
211
+ // Maintain a reference to the top most crate.
211
212
// Stash paths for top-most crate locally if necessary.
212
- let crate_paths = if root. is_none ( ) {
213
- Some ( CratePaths {
213
+ let crate_paths;
214
+ let root = if let Some ( root) = root {
215
+ root
216
+ } else {
217
+ crate_paths = CratePaths {
214
218
ident : crate_root. name . to_string ( ) ,
215
219
dylib : lib. dylib . clone ( ) . map ( |p| p. 0 ) ,
216
220
rlib : lib. rlib . clone ( ) . map ( |p| p. 0 ) ,
217
221
rmeta : lib. rmeta . clone ( ) . map ( |p| p. 0 ) ,
218
- } )
219
- } else {
220
- None
222
+ } ;
223
+ & crate_paths
221
224
} ;
222
- // Maintain a reference to the top most crate.
223
- let root = if root. is_some ( ) { root } else { & crate_paths } ;
224
225
225
226
let Library { dylib, rlib, rmeta, metadata } = lib;
226
227
let cnum_map = self . resolve_crate_deps ( root, & crate_root, & metadata, cnum, span, dep_kind) ;
@@ -336,15 +337,27 @@ impl<'a> CrateLoader<'a> {
336
337
337
338
fn resolve_crate < ' b > (
338
339
& ' b mut self ,
339
- root : & ' b Option < CratePaths > ,
340
340
name : Symbol ,
341
- hash : Option < & ' b Svh > ,
342
- extra_filename : Option < & ' b str > ,
343
341
span : Span ,
344
- path_kind : PathKind ,
342
+ dep_kind : DepKind ,
343
+ dep : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
344
+ ) -> ( CrateNum , Lrc < cstore:: CrateMetadata > ) {
345
+ self . maybe_resolve_crate ( name, span, dep_kind, dep) . unwrap_or_else ( |err| err. report ( ) )
346
+ }
347
+
348
+ fn maybe_resolve_crate < ' b > (
349
+ & ' b mut self ,
350
+ name : Symbol ,
351
+ span : Span ,
345
352
mut dep_kind : DepKind ,
353
+ dep : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
346
354
) -> Result < ( CrateNum , Lrc < cstore:: CrateMetadata > ) , LoadError < ' b > > {
347
355
info ! ( "resolving crate `{}`" , name) ;
356
+ let ( root, hash, extra_filename, path_kind) = match dep {
357
+ Some ( ( root, dep) ) =>
358
+ ( Some ( root) , Some ( & dep. hash ) , Some ( & dep. extra_filename [ ..] ) , PathKind :: Dependency ) ,
359
+ None => ( None , None , None , PathKind :: Crate ) ,
360
+ } ;
348
361
let result = if let Some ( cnum) = self . existing_match ( name, hash, path_kind) {
349
362
( LoadResult :: Previous ( cnum) , None )
350
363
} else {
@@ -463,7 +476,7 @@ impl<'a> CrateLoader<'a> {
463
476
464
477
// Go through the crate metadata and load any crates that it references
465
478
fn resolve_crate_deps ( & mut self ,
466
- root : & Option < CratePaths > ,
479
+ root : & CratePaths ,
467
480
crate_root : & CrateRoot < ' _ > ,
468
481
metadata : & MetadataBlob ,
469
482
krate : CrateNum ,
@@ -478,9 +491,7 @@ impl<'a> CrateLoader<'a> {
478
491
// The map from crate numbers in the crate we're resolving to local crate numbers.
479
492
// We map 0 and all other holes in the map to our parent crate. The "additional"
480
493
// self-dependencies should be harmless.
481
- std:: iter:: once ( krate) . chain ( crate_root. crate_deps
482
- . decode ( metadata)
483
- . map ( |dep| {
494
+ std:: iter:: once ( krate) . chain ( crate_root. crate_deps . decode ( metadata) . map ( |dep| {
484
495
info ! ( "resolving dep crate {} hash: `{}` extra filename: `{}`" , dep. name, dep. hash,
485
496
dep. extra_filename) ;
486
497
if dep. kind == DepKind :: UnexportedMacrosOnly {
@@ -490,11 +501,7 @@ impl<'a> CrateLoader<'a> {
490
501
DepKind :: MacrosOnly => DepKind :: MacrosOnly ,
491
502
_ => dep. kind ,
492
503
} ;
493
- let ( local_cnum, ..) = self . resolve_crate (
494
- root, dep. name , Some ( & dep. hash ) , Some ( & dep. extra_filename ) , span,
495
- PathKind :: Dependency , dep_kind,
496
- ) . unwrap_or_else ( |err| err. report ( ) ) ;
497
- local_cnum
504
+ self . resolve_crate ( dep. name , span, dep_kind, Some ( ( root, & dep) ) ) . 0
498
505
} ) ) . collect ( )
499
506
}
500
507
@@ -513,7 +520,7 @@ impl<'a> CrateLoader<'a> {
513
520
filesearch : self . sess . host_filesearch ( PathKind :: Crate ) ,
514
521
target : & self . sess . host ,
515
522
triple : host_triple,
516
- root : & None ,
523
+ root : None ,
517
524
rejected_via_hash : vec ! [ ] ,
518
525
rejected_via_triple : vec ! [ ] ,
519
526
rejected_via_kind : vec ! [ ] ,
@@ -693,10 +700,7 @@ impl<'a> CrateLoader<'a> {
693
700
} ;
694
701
info ! ( "panic runtime not found -- loading {}" , name) ;
695
702
696
- let dep_kind = DepKind :: Implicit ;
697
- let ( cnum, data) =
698
- self . resolve_crate ( & None , name, None , None , DUMMY_SP , PathKind :: Crate , dep_kind)
699
- . unwrap_or_else ( |err| err. report ( ) ) ;
703
+ let ( cnum, data) = self . resolve_crate ( name, DUMMY_SP , DepKind :: Implicit , None ) ;
700
704
701
705
// Sanity check the loaded crate to ensure it is indeed a panic runtime
702
706
// and the panic strategy is indeed what we thought it was.
@@ -792,20 +796,15 @@ impl<'a> CrateLoader<'a> {
792
796
} ) ;
793
797
794
798
if uses_std {
795
- let name = match * sanitizer {
799
+ let name = Symbol :: intern ( match sanitizer {
796
800
Sanitizer :: Address => "rustc_asan" ,
797
801
Sanitizer :: Leak => "rustc_lsan" ,
798
802
Sanitizer :: Memory => "rustc_msan" ,
799
803
Sanitizer :: Thread => "rustc_tsan" ,
800
- } ;
804
+ } ) ;
801
805
info ! ( "loading sanitizer: {}" , name) ;
802
806
803
- let symbol = Symbol :: intern ( name) ;
804
- let dep_kind = DepKind :: Explicit ;
805
- let ( _, data) =
806
- self . resolve_crate ( & None , symbol, None , None , DUMMY_SP ,
807
- PathKind :: Crate , dep_kind)
808
- . unwrap_or_else ( |err| err. report ( ) ) ;
807
+ let data = self . resolve_crate ( name, DUMMY_SP , DepKind :: Explicit , None ) . 1 ;
809
808
810
809
// Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
811
810
if !data. root . sanitizer_runtime {
@@ -824,12 +823,8 @@ impl<'a> CrateLoader<'a> {
824
823
{
825
824
info ! ( "loading profiler" ) ;
826
825
827
- let symbol = Symbol :: intern ( "profiler_builtins" ) ;
828
- let dep_kind = DepKind :: Implicit ;
829
- let ( _, data) =
830
- self . resolve_crate ( & None , symbol, None , None , DUMMY_SP ,
831
- PathKind :: Crate , dep_kind)
832
- . unwrap_or_else ( |err| err. report ( ) ) ;
826
+ let name = Symbol :: intern ( "profiler_builtins" ) ;
827
+ let data = self . resolve_crate ( name, DUMMY_SP , DepKind :: Implicit , None ) . 1 ;
833
828
834
829
// Sanity check the loaded crate to ensure it is indeed a profiler runtime
835
830
if !data. root . profiler_runtime {
@@ -996,7 +991,7 @@ impl<'a> CrateLoader<'a> {
996
991
ast:: ItemKind :: ExternCrate ( orig_name) => {
997
992
debug ! ( "resolving extern crate stmt. ident: {} orig_name: {:?}" ,
998
993
item. ident, orig_name) ;
999
- let orig_name = match orig_name {
994
+ let name = match orig_name {
1000
995
Some ( orig_name) => {
1001
996
crate :: validate_crate_name ( Some ( self . sess ) , & orig_name. as_str ( ) ,
1002
997
Some ( item. span ) ) ;
@@ -1010,10 +1005,7 @@ impl<'a> CrateLoader<'a> {
1010
1005
DepKind :: Explicit
1011
1006
} ;
1012
1007
1013
- let ( cnum, ..) = self . resolve_crate (
1014
- & None , orig_name, None , None ,
1015
- item. span , PathKind :: Crate , dep_kind,
1016
- ) . unwrap_or_else ( |err| err. report ( ) ) ;
1008
+ let cnum = self . resolve_crate ( name, item. span , dep_kind, None ) . 0 ;
1017
1009
1018
1010
let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
1019
1011
let path_len = definitions. def_path ( def_id. index ) . data . len ( ) ;
@@ -1039,9 +1031,7 @@ impl<'a> CrateLoader<'a> {
1039
1031
name : Symbol ,
1040
1032
span : Span ,
1041
1033
) -> CrateNum {
1042
- let cnum = self . resolve_crate (
1043
- & None , name, None , None , span, PathKind :: Crate , DepKind :: Explicit
1044
- ) . unwrap_or_else ( |err| err. report ( ) ) . 0 ;
1034
+ let cnum = self . resolve_crate ( name, span, DepKind :: Explicit , None ) . 0 ;
1045
1035
1046
1036
self . update_extern_crate (
1047
1037
cnum,
@@ -1063,9 +1053,7 @@ impl<'a> CrateLoader<'a> {
1063
1053
name : Symbol ,
1064
1054
span : Span ,
1065
1055
) -> Option < CrateNum > {
1066
- let cnum = self . resolve_crate (
1067
- & None , name, None , None , span, PathKind :: Crate , DepKind :: Explicit
1068
- ) . ok ( ) ?. 0 ;
1056
+ let cnum = self . maybe_resolve_crate ( name, span, DepKind :: Explicit , None ) . ok ( ) ?. 0 ;
1069
1057
1070
1058
self . update_extern_crate (
1071
1059
cnum,
0 commit comments