22
33use crate :: cstore:: { self , CStore , CrateSource , MetadataBlob } ;
44use crate :: locator:: { self , CratePaths } ;
5- use crate :: schema:: { CrateRoot } ;
5+ use crate :: schema:: { CrateRoot , CrateDep } ;
66use rustc_data_structures:: sync:: { Lrc , RwLock , Lock } ;
77
88use rustc:: hir:: def_id:: CrateNum ;
@@ -190,7 +190,7 @@ impl<'a> CrateLoader<'a> {
190190 fn register_crate (
191191 & mut self ,
192192 host_lib : Option < Library > ,
193- root : & Option < CratePaths > ,
193+ root : Option < & CratePaths > ,
194194 span : Span ,
195195 lib : Library ,
196196 dep_kind : DepKind ,
@@ -208,19 +208,20 @@ impl<'a> CrateLoader<'a> {
208208 // Claim this crate number and cache it
209209 let cnum = self . cstore . alloc_new_crate_num ( ) ;
210210
211+ // Maintain a reference to the top most crate.
211212 // 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 {
214218 ident : crate_root. name . to_string ( ) ,
215219 dylib : lib. dylib . clone ( ) . map ( |p| p. 0 ) ,
216220 rlib : lib. rlib . clone ( ) . map ( |p| p. 0 ) ,
217221 rmeta : lib. rmeta . clone ( ) . map ( |p| p. 0 ) ,
218- } )
219- } else {
220- None
222+ } ;
223+ & crate_paths
221224 } ;
222- // Maintain a reference to the top most crate.
223- let root = if root. is_some ( ) { root } else { & crate_paths } ;
224225
225226 let Library { dylib, rlib, rmeta, metadata } = lib;
226227 let cnum_map = self . resolve_crate_deps ( root, & crate_root, & metadata, cnum, span, dep_kind) ;
@@ -336,15 +337,27 @@ impl<'a> CrateLoader<'a> {
336337
337338 fn resolve_crate < ' b > (
338339 & ' b mut self ,
339- root : & ' b Option < CratePaths > ,
340340 name : Symbol ,
341- hash : Option < & ' b Svh > ,
342- extra_filename : Option < & ' b str > ,
343341 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 ,
345352 mut dep_kind : DepKind ,
353+ dep : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
346354 ) -> Result < ( CrateNum , Lrc < cstore:: CrateMetadata > ) , LoadError < ' b > > {
347355 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+ } ;
348361 let result = if let Some ( cnum) = self . existing_match ( name, hash, path_kind) {
349362 ( LoadResult :: Previous ( cnum) , None )
350363 } else {
@@ -463,7 +476,7 @@ impl<'a> CrateLoader<'a> {
463476
464477 // Go through the crate metadata and load any crates that it references
465478 fn resolve_crate_deps ( & mut self ,
466- root : & Option < CratePaths > ,
479+ root : & CratePaths ,
467480 crate_root : & CrateRoot < ' _ > ,
468481 metadata : & MetadataBlob ,
469482 krate : CrateNum ,
@@ -478,9 +491,7 @@ impl<'a> CrateLoader<'a> {
478491 // The map from crate numbers in the crate we're resolving to local crate numbers.
479492 // We map 0 and all other holes in the map to our parent crate. The "additional"
480493 // 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| {
484495 info ! ( "resolving dep crate {} hash: `{}` extra filename: `{}`" , dep. name, dep. hash,
485496 dep. extra_filename) ;
486497 if dep. kind == DepKind :: UnexportedMacrosOnly {
@@ -490,11 +501,7 @@ impl<'a> CrateLoader<'a> {
490501 DepKind :: MacrosOnly => DepKind :: MacrosOnly ,
491502 _ => dep. kind ,
492503 } ;
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
498505 } ) ) . collect ( )
499506 }
500507
@@ -513,7 +520,7 @@ impl<'a> CrateLoader<'a> {
513520 filesearch : self . sess . host_filesearch ( PathKind :: Crate ) ,
514521 target : & self . sess . host ,
515522 triple : host_triple,
516- root : & None ,
523+ root : None ,
517524 rejected_via_hash : vec ! [ ] ,
518525 rejected_via_triple : vec ! [ ] ,
519526 rejected_via_kind : vec ! [ ] ,
@@ -693,10 +700,7 @@ impl<'a> CrateLoader<'a> {
693700 } ;
694701 info ! ( "panic runtime not found -- loading {}" , name) ;
695702
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 ) ;
700704
701705 // Sanity check the loaded crate to ensure it is indeed a panic runtime
702706 // and the panic strategy is indeed what we thought it was.
@@ -792,20 +796,15 @@ impl<'a> CrateLoader<'a> {
792796 } ) ;
793797
794798 if uses_std {
795- let name = match * sanitizer {
799+ let name = Symbol :: intern ( match sanitizer {
796800 Sanitizer :: Address => "rustc_asan" ,
797801 Sanitizer :: Leak => "rustc_lsan" ,
798802 Sanitizer :: Memory => "rustc_msan" ,
799803 Sanitizer :: Thread => "rustc_tsan" ,
800- } ;
804+ } ) ;
801805 info ! ( "loading sanitizer: {}" , name) ;
802806
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 ;
809808
810809 // Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
811810 if !data. root . sanitizer_runtime {
@@ -824,12 +823,8 @@ impl<'a> CrateLoader<'a> {
824823 {
825824 info ! ( "loading profiler" ) ;
826825
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 ;
833828
834829 // Sanity check the loaded crate to ensure it is indeed a profiler runtime
835830 if !data. root . profiler_runtime {
@@ -996,7 +991,7 @@ impl<'a> CrateLoader<'a> {
996991 ast:: ItemKind :: ExternCrate ( orig_name) => {
997992 debug ! ( "resolving extern crate stmt. ident: {} orig_name: {:?}" ,
998993 item. ident, orig_name) ;
999- let orig_name = match orig_name {
994+ let name = match orig_name {
1000995 Some ( orig_name) => {
1001996 crate :: validate_crate_name ( Some ( self . sess ) , & orig_name. as_str ( ) ,
1002997 Some ( item. span ) ) ;
@@ -1010,10 +1005,7 @@ impl<'a> CrateLoader<'a> {
10101005 DepKind :: Explicit
10111006 } ;
10121007
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 ;
10171009
10181010 let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
10191011 let path_len = definitions. def_path ( def_id. index ) . data . len ( ) ;
@@ -1039,9 +1031,7 @@ impl<'a> CrateLoader<'a> {
10391031 name : Symbol ,
10401032 span : Span ,
10411033 ) -> 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 ;
10451035
10461036 self . update_extern_crate (
10471037 cnum,
@@ -1063,9 +1053,7 @@ impl<'a> CrateLoader<'a> {
10631053 name : Symbol ,
10641054 span : Span ,
10651055 ) -> 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 ;
10691057
10701058 self . update_extern_crate (
10711059 cnum,
0 commit comments