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 ;
@@ -20,7 +20,7 @@ use rustc::hir::map::Definitions;
2020use rustc:: hir:: def_id:: LOCAL_CRATE ;
2121
2222use std:: ops:: Deref ;
23- use std:: path:: PathBuf ;
23+ use std:: path:: { Path , PathBuf } ;
2424use std:: { cmp, fs} ;
2525
2626use syntax:: ast;
@@ -112,7 +112,7 @@ impl<'a> CrateLoader<'a> {
112112 -> Option < CrateNum > {
113113 let mut ret = None ;
114114 self . cstore . iter_crate_data ( |cnum, data| {
115- if data. name != name { return }
115+ if data. root . name != name { return }
116116
117117 match hash {
118118 Some ( hash) if * hash == data. root . hash => { ret = Some ( cnum) ; return }
@@ -190,8 +190,7 @@ impl<'a> CrateLoader<'a> {
190190 fn register_crate (
191191 & mut self ,
192192 host_lib : Option < Library > ,
193- root : & Option < CratePaths > ,
194- ident : Symbol ,
193+ root : Option < & CratePaths > ,
195194 span : Span ,
196195 lib : Library ,
197196 dep_kind : DepKind ,
@@ -204,40 +203,38 @@ impl<'a> CrateLoader<'a> {
204203 . map ( |e| e. is_private_dep )
205204 . unwrap_or ( false ) ;
206205
207- info ! ( "register crate `extern crate {} as {}` (private_dep = {})" ,
208- crate_root. name, ident, private_dep) ;
209-
206+ info ! ( "register crate `{}` (private_dep = {})" , crate_root. name, private_dep) ;
210207
211208 // Claim this crate number and cache it
212209 let cnum = self . cstore . alloc_new_crate_num ( ) ;
213210
211+ // Maintain a reference to the top most crate.
214212 // Stash paths for top-most crate locally if necessary.
215- let crate_paths = if root. is_none ( ) {
216- Some ( CratePaths {
217- ident : ident. to_string ( ) ,
213+ let crate_paths;
214+ let root = if let Some ( root) = root {
215+ root
216+ } else {
217+ crate_paths = CratePaths {
218+ ident : crate_root. name . to_string ( ) ,
218219 dylib : lib. dylib . clone ( ) . map ( |p| p. 0 ) ,
219220 rlib : lib. rlib . clone ( ) . map ( |p| p. 0 ) ,
220221 rmeta : lib. rmeta . clone ( ) . map ( |p| p. 0 ) ,
221- } )
222- } else {
223- None
222+ } ;
223+ & crate_paths
224224 } ;
225- // Maintain a reference to the top most crate.
226- let root = if root. is_some ( ) { root } else { & crate_paths } ;
227225
228226 let Library { dylib, rlib, rmeta, metadata } = lib;
229227 let cnum_map = self . resolve_crate_deps ( root, & crate_root, & metadata, cnum, span, dep_kind) ;
230228
231229 let dependencies: Vec < CrateNum > = cnum_map. iter ( ) . cloned ( ) . collect ( ) ;
232230
233231 let raw_proc_macros = crate_root. proc_macro_data . map ( |_| {
234- if self . sess . opts . debugging_opts . dual_proc_macros {
235- let host_lib = host_lib. as_ref ( ) . unwrap ( ) ;
236- self . dlsym_proc_macros ( host_lib. dylib . as_ref ( ) . map ( |p| p. 0 . clone ( ) ) ,
237- & host_lib. metadata . get_root ( ) , span)
238- } else {
239- self . dlsym_proc_macros ( dylib. clone ( ) . map ( |p| p. 0 ) , & crate_root, span)
240- }
232+ let dlsym_dylib = match & host_lib {
233+ Some ( host_lib) => & host_lib. dylib ,
234+ None => & dylib,
235+ } ;
236+ let dlsym_dylib = dlsym_dylib. as_ref ( ) . expect ( "no dylib for a proc-macro crate" ) ;
237+ self . dlsym_proc_macros ( & dlsym_dylib. 0 , crate_root. disambiguator , span)
241238 } ) ;
242239
243240 let interpret_alloc_index: Vec < u32 > = crate_root. interpret_alloc_index
@@ -254,8 +251,6 @@ impl<'a> CrateLoader<'a> {
254251 } ) ;
255252
256253 let cmeta = cstore:: CrateMetadata {
257- name : crate_root. name ,
258- imported_name : ident,
259254 extern_crate : Lock :: new ( None ) ,
260255 def_path_table : Lrc :: new ( def_path_table) ,
261256 trait_impls,
@@ -274,7 +269,6 @@ impl<'a> CrateLoader<'a> {
274269 } ,
275270 private_dep,
276271 span,
277- host_lib,
278272 raw_proc_macros
279273 } ;
280274
@@ -340,24 +334,34 @@ impl<'a> CrateLoader<'a> {
340334
341335 fn resolve_crate < ' b > (
342336 & ' b mut self ,
343- root : & ' b Option < CratePaths > ,
344- ident : Symbol ,
345337 name : Symbol ,
346- hash : Option < & ' b Svh > ,
347- extra_filename : Option < & ' b str > ,
348338 span : Span ,
349- path_kind : PathKind ,
339+ dep_kind : DepKind ,
340+ dep : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
341+ ) -> ( CrateNum , Lrc < cstore:: CrateMetadata > ) {
342+ self . maybe_resolve_crate ( name, span, dep_kind, dep) . unwrap_or_else ( |err| err. report ( ) )
343+ }
344+
345+ fn maybe_resolve_crate < ' b > (
346+ & ' b mut self ,
347+ name : Symbol ,
348+ span : Span ,
350349 mut dep_kind : DepKind ,
350+ dep : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
351351 ) -> Result < ( CrateNum , Lrc < cstore:: CrateMetadata > ) , LoadError < ' b > > {
352- info ! ( "resolving crate `extern crate {} as {}`" , name, ident) ;
352+ info ! ( "resolving crate `{}`" , name) ;
353+ let ( root, hash, extra_filename, path_kind) = match dep {
354+ Some ( ( root, dep) ) =>
355+ ( Some ( root) , Some ( & dep. hash ) , Some ( & dep. extra_filename [ ..] ) , PathKind :: Dependency ) ,
356+ None => ( None , None , None , PathKind :: Crate ) ,
357+ } ;
353358 let result = if let Some ( cnum) = self . existing_match ( name, hash, path_kind) {
354359 ( LoadResult :: Previous ( cnum) , None )
355360 } else {
356361 info ! ( "falling back to a load" ) ;
357362 let mut locate_ctxt = locator:: Context {
358363 sess : self . sess ,
359364 span,
360- ident,
361365 crate_name : name,
362366 hash,
363367 extra_filename,
@@ -393,7 +397,7 @@ impl<'a> CrateLoader<'a> {
393397 Ok ( ( cnum, data) )
394398 }
395399 ( LoadResult :: Loaded ( library) , host_library) => {
396- Ok ( self . register_crate ( host_library, root, ident , span, library, dep_kind, name) )
400+ Ok ( self . register_crate ( host_library, root, span, library, dep_kind, name) )
397401 }
398402 _ => panic ! ( )
399403 }
@@ -469,7 +473,7 @@ impl<'a> CrateLoader<'a> {
469473
470474 // Go through the crate metadata and load any crates that it references
471475 fn resolve_crate_deps ( & mut self ,
472- root : & Option < CratePaths > ,
476+ root : & CratePaths ,
473477 crate_root : & CrateRoot < ' _ > ,
474478 metadata : & MetadataBlob ,
475479 krate : CrateNum ,
@@ -484,9 +488,7 @@ impl<'a> CrateLoader<'a> {
484488 // The map from crate numbers in the crate we're resolving to local crate numbers.
485489 // We map 0 and all other holes in the map to our parent crate. The "additional"
486490 // self-dependencies should be harmless.
487- std:: iter:: once ( krate) . chain ( crate_root. crate_deps
488- . decode ( metadata)
489- . map ( |dep| {
491+ std:: iter:: once ( krate) . chain ( crate_root. crate_deps . decode ( metadata) . map ( |dep| {
490492 info ! ( "resolving dep crate {} hash: `{}` extra filename: `{}`" , dep. name, dep. hash,
491493 dep. extra_filename) ;
492494 if dep. kind == DepKind :: UnexportedMacrosOnly {
@@ -496,32 +498,26 @@ impl<'a> CrateLoader<'a> {
496498 DepKind :: MacrosOnly => DepKind :: MacrosOnly ,
497499 _ => dep. kind ,
498500 } ;
499- let ( local_cnum, ..) = self . resolve_crate (
500- root, dep. name , dep. name , Some ( & dep. hash ) , Some ( & dep. extra_filename ) , span,
501- PathKind :: Dependency , dep_kind,
502- ) . unwrap_or_else ( |err| err. report ( ) ) ;
503- local_cnum
501+ self . resolve_crate ( dep. name , span, dep_kind, Some ( ( root, & dep) ) ) . 0
504502 } ) ) . collect ( )
505503 }
506504
507- fn read_extension_crate ( & mut self , span : Span , orig_name : Symbol , rename : Symbol )
508- -> ExtensionCrate {
509- info ! ( "read extension crate `extern crate {} as {}`" , orig_name, rename) ;
505+ fn read_extension_crate ( & mut self , name : Symbol , span : Span ) -> ExtensionCrate {
506+ info ! ( "read extension crate `{}`" , name) ;
510507 let target_triple = self . sess . opts . target_triple . clone ( ) ;
511508 let host_triple = TargetTriple :: from_triple ( config:: host_triple ( ) ) ;
512509 let is_cross = target_triple != host_triple;
513510 let mut target_only = false ;
514511 let mut locate_ctxt = locator:: Context {
515512 sess : self . sess ,
516513 span,
517- ident : orig_name,
518- crate_name : rename,
514+ crate_name : name,
519515 hash : None ,
520516 extra_filename : None ,
521517 filesearch : self . sess . host_filesearch ( PathKind :: Crate ) ,
522518 target : & self . sess . host ,
523519 triple : host_triple,
524- root : & None ,
520+ root : None ,
525521 rejected_via_hash : vec ! [ ] ,
526522 rejected_via_triple : vec ! [ ] ,
527523 rejected_via_kind : vec ! [ ] ,
@@ -570,25 +566,21 @@ impl<'a> CrateLoader<'a> {
570566 }
571567
572568 fn dlsym_proc_macros ( & self ,
573- dylib : Option < PathBuf > ,
574- root : & CrateRoot < ' _ > ,
569+ path : & Path ,
570+ disambiguator : CrateDisambiguator ,
575571 span : Span
576572 ) -> & ' static [ ProcMacro ] {
577573 use std:: env;
578574 use crate :: dynamic_lib:: DynamicLibrary ;
579575
580- let path = match dylib {
581- Some ( dylib) => dylib,
582- None => span_bug ! ( span, "proc-macro crate not dylib" ) ,
583- } ;
584576 // Make sure the path contains a / or the linker will search for it.
585577 let path = env:: current_dir ( ) . unwrap ( ) . join ( path) ;
586578 let lib = match DynamicLibrary :: open ( Some ( & path) ) {
587579 Ok ( lib) => lib,
588580 Err ( err) => self . sess . span_fatal ( span, & err) ,
589581 } ;
590582
591- let sym = self . sess . generate_proc_macro_decls_symbol ( root . disambiguator ) ;
583+ let sym = self . sess . generate_proc_macro_decls_symbol ( disambiguator) ;
592584 let decls = unsafe {
593585 let sym = match lib. symbol ( & sym) {
594586 Ok ( f) => f,
@@ -610,7 +602,7 @@ impl<'a> CrateLoader<'a> {
610602 span : Span ,
611603 name : Symbol )
612604 -> Option < ( PathBuf , CrateDisambiguator ) > {
613- let ekrate = self . read_extension_crate ( span , name, name ) ;
605+ let ekrate = self . read_extension_crate ( name, span ) ;
614606
615607 if ekrate. target_only {
616608 // Need to abort before syntax expansion.
@@ -701,10 +693,7 @@ impl<'a> CrateLoader<'a> {
701693 } ;
702694 info ! ( "panic runtime not found -- loading {}" , name) ;
703695
704- let dep_kind = DepKind :: Implicit ;
705- let ( cnum, data) =
706- self . resolve_crate ( & None , name, name, None , None , DUMMY_SP , PathKind :: Crate , dep_kind)
707- . unwrap_or_else ( |err| err. report ( ) ) ;
696+ let ( cnum, data) = self . resolve_crate ( name, DUMMY_SP , DepKind :: Implicit , None ) ;
708697
709698 // Sanity check the loaded crate to ensure it is indeed a panic runtime
710699 // and the panic strategy is indeed what we thought it was.
@@ -794,26 +783,21 @@ impl<'a> CrateLoader<'a> {
794783
795784 let mut uses_std = false ;
796785 self . cstore . iter_crate_data ( |_, data| {
797- if data. name == sym:: std {
786+ if data. root . name == sym:: std {
798787 uses_std = true ;
799788 }
800789 } ) ;
801790
802791 if uses_std {
803- let name = match * sanitizer {
792+ let name = Symbol :: intern ( match sanitizer {
804793 Sanitizer :: Address => "rustc_asan" ,
805794 Sanitizer :: Leak => "rustc_lsan" ,
806795 Sanitizer :: Memory => "rustc_msan" ,
807796 Sanitizer :: Thread => "rustc_tsan" ,
808- } ;
797+ } ) ;
809798 info ! ( "loading sanitizer: {}" , name) ;
810799
811- let symbol = Symbol :: intern ( name) ;
812- let dep_kind = DepKind :: Explicit ;
813- let ( _, data) =
814- self . resolve_crate ( & None , symbol, symbol, None , None , DUMMY_SP ,
815- PathKind :: Crate , dep_kind)
816- . unwrap_or_else ( |err| err. report ( ) ) ;
800+ let data = self . resolve_crate ( name, DUMMY_SP , DepKind :: Explicit , None ) . 1 ;
817801
818802 // Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
819803 if !data. root . sanitizer_runtime {
@@ -832,12 +816,8 @@ impl<'a> CrateLoader<'a> {
832816 {
833817 info ! ( "loading profiler" ) ;
834818
835- let symbol = Symbol :: intern ( "profiler_builtins" ) ;
836- let dep_kind = DepKind :: Implicit ;
837- let ( _, data) =
838- self . resolve_crate ( & None , symbol, symbol, None , None , DUMMY_SP ,
839- PathKind :: Crate , dep_kind)
840- . unwrap_or_else ( |err| err. report ( ) ) ;
819+ let name = Symbol :: intern ( "profiler_builtins" ) ;
820+ let data = self . resolve_crate ( name, DUMMY_SP , DepKind :: Implicit , None ) . 1 ;
841821
842822 // Sanity check the loaded crate to ensure it is indeed a profiler runtime
843823 if !data. root . profiler_runtime {
@@ -1004,7 +984,7 @@ impl<'a> CrateLoader<'a> {
1004984 ast:: ItemKind :: ExternCrate ( orig_name) => {
1005985 debug ! ( "resolving extern crate stmt. ident: {} orig_name: {:?}" ,
1006986 item. ident, orig_name) ;
1007- let orig_name = match orig_name {
987+ let name = match orig_name {
1008988 Some ( orig_name) => {
1009989 crate :: validate_crate_name ( Some ( self . sess ) , & orig_name. as_str ( ) ,
1010990 Some ( item. span ) ) ;
@@ -1018,10 +998,7 @@ impl<'a> CrateLoader<'a> {
1018998 DepKind :: Explicit
1019999 } ;
10201000
1021- let ( cnum, ..) = self . resolve_crate (
1022- & None , item. ident . name , orig_name, None , None ,
1023- item. span , PathKind :: Crate , dep_kind,
1024- ) . unwrap_or_else ( |err| err. report ( ) ) ;
1001+ let cnum = self . resolve_crate ( name, item. span , dep_kind, None ) . 0 ;
10251002
10261003 let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
10271004 let path_len = definitions. def_path ( def_id. index ) . data . len ( ) ;
@@ -1047,9 +1024,7 @@ impl<'a> CrateLoader<'a> {
10471024 name : Symbol ,
10481025 span : Span ,
10491026 ) -> CrateNum {
1050- let cnum = self . resolve_crate (
1051- & None , name, name, None , None , span, PathKind :: Crate , DepKind :: Explicit
1052- ) . unwrap_or_else ( |err| err. report ( ) ) . 0 ;
1027+ let cnum = self . resolve_crate ( name, span, DepKind :: Explicit , None ) . 0 ;
10531028
10541029 self . update_extern_crate (
10551030 cnum,
@@ -1071,9 +1046,7 @@ impl<'a> CrateLoader<'a> {
10711046 name : Symbol ,
10721047 span : Span ,
10731048 ) -> Option < CrateNum > {
1074- let cnum = self . resolve_crate (
1075- & None , name, name, None , None , span, PathKind :: Crate , DepKind :: Explicit
1076- ) . ok ( ) ?. 0 ;
1049+ let cnum = self . maybe_resolve_crate ( name, span, DepKind :: Explicit , None ) . ok ( ) ?. 0 ;
10771050
10781051 self . update_extern_crate (
10791052 cnum,
0 commit comments