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 ;
@@ -20,7 +20,7 @@ use rustc::hir::map::Definitions;
20
20
use rustc:: hir:: def_id:: LOCAL_CRATE ;
21
21
22
22
use std:: ops:: Deref ;
23
- use std:: path:: PathBuf ;
23
+ use std:: path:: { Path , PathBuf } ;
24
24
use std:: { cmp, fs} ;
25
25
26
26
use syntax:: ast;
@@ -112,7 +112,7 @@ impl<'a> CrateLoader<'a> {
112
112
-> Option < CrateNum > {
113
113
let mut ret = None ;
114
114
self . cstore . iter_crate_data ( |cnum, data| {
115
- if data. name != name { return }
115
+ if data. root . name != name { return }
116
116
117
117
match hash {
118
118
Some ( hash) if * hash == data. root . hash => { ret = Some ( cnum) ; return }
@@ -190,8 +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 > ,
194
- ident : Symbol ,
193
+ root : Option < & CratePaths > ,
195
194
span : Span ,
196
195
lib : Library ,
197
196
dep_kind : DepKind ,
@@ -204,40 +203,40 @@ impl<'a> CrateLoader<'a> {
204
203
. map ( |e| e. is_private_dep )
205
204
. unwrap_or ( false ) ;
206
205
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) ;
210
207
211
208
// Claim this crate number and cache it
212
209
let cnum = self . cstore . alloc_new_crate_num ( ) ;
213
210
211
+ // Maintain a reference to the top most crate.
214
212
// 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 ( ) ,
218
219
dylib : lib. dylib . clone ( ) . map ( |p| p. 0 ) ,
219
220
rlib : lib. rlib . clone ( ) . map ( |p| p. 0 ) ,
220
221
rmeta : lib. rmeta . clone ( ) . map ( |p| p. 0 ) ,
221
- } )
222
- } else {
223
- None
222
+ } ;
223
+ & crate_paths
224
224
} ;
225
- // Maintain a reference to the top most crate.
226
- let root = if root. is_some ( ) { root } else { & crate_paths } ;
227
225
228
226
let Library { dylib, rlib, rmeta, metadata } = lib;
229
227
let cnum_map = self . resolve_crate_deps ( root, & crate_root, & metadata, cnum, span, dep_kind) ;
230
228
231
229
let dependencies: Vec < CrateNum > = cnum_map. iter ( ) . cloned ( ) . collect ( ) ;
232
230
233
231
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 temp_root;
233
+ let ( dlsym_dylib, dlsym_root) = match & host_lib {
234
+ Some ( host_lib) =>
235
+ ( & host_lib. dylib , { temp_root = host_lib. metadata . get_root ( ) ; & temp_root } ) ,
236
+ None => ( & dylib, & crate_root) ,
237
+ } ;
238
+ let dlsym_dylib = dlsym_dylib. as_ref ( ) . expect ( "no dylib for a proc-macro crate" ) ;
239
+ self . dlsym_proc_macros ( & dlsym_dylib. 0 , dlsym_root. disambiguator , span)
241
240
} ) ;
242
241
243
242
let interpret_alloc_index: Vec < u32 > = crate_root. interpret_alloc_index
@@ -254,8 +253,6 @@ impl<'a> CrateLoader<'a> {
254
253
} ) ;
255
254
256
255
let cmeta = cstore:: CrateMetadata {
257
- name : crate_root. name ,
258
- imported_name : ident,
259
256
extern_crate : Lock :: new ( None ) ,
260
257
def_path_table : Lrc :: new ( def_path_table) ,
261
258
trait_impls,
@@ -274,7 +271,6 @@ impl<'a> CrateLoader<'a> {
274
271
} ,
275
272
private_dep,
276
273
span,
277
- host_lib,
278
274
raw_proc_macros
279
275
} ;
280
276
@@ -340,24 +336,34 @@ impl<'a> CrateLoader<'a> {
340
336
341
337
fn resolve_crate < ' b > (
342
338
& ' b mut self ,
343
- root : & ' b Option < CratePaths > ,
344
- ident : Symbol ,
345
339
name : Symbol ,
346
- hash : Option < & ' b Svh > ,
347
- extra_filename : Option < & ' b str > ,
348
340
span : Span ,
349
- path_kind : PathKind ,
341
+ dep_kind : DepKind ,
342
+ dep : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
343
+ ) -> ( CrateNum , Lrc < cstore:: CrateMetadata > ) {
344
+ self . maybe_resolve_crate ( name, span, dep_kind, dep) . unwrap_or_else ( |err| err. report ( ) )
345
+ }
346
+
347
+ fn maybe_resolve_crate < ' b > (
348
+ & ' b mut self ,
349
+ name : Symbol ,
350
+ span : Span ,
350
351
mut dep_kind : DepKind ,
352
+ dep : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
351
353
) -> Result < ( CrateNum , Lrc < cstore:: CrateMetadata > ) , LoadError < ' b > > {
352
- info ! ( "resolving crate `extern crate {} as {}`" , name, ident) ;
354
+ info ! ( "resolving crate `{}`" , name) ;
355
+ let ( root, hash, extra_filename, path_kind) = match dep {
356
+ Some ( ( root, dep) ) =>
357
+ ( Some ( root) , Some ( & dep. hash ) , Some ( & dep. extra_filename [ ..] ) , PathKind :: Dependency ) ,
358
+ None => ( None , None , None , PathKind :: Crate ) ,
359
+ } ;
353
360
let result = if let Some ( cnum) = self . existing_match ( name, hash, path_kind) {
354
361
( LoadResult :: Previous ( cnum) , None )
355
362
} else {
356
363
info ! ( "falling back to a load" ) ;
357
364
let mut locate_ctxt = locator:: Context {
358
365
sess : self . sess ,
359
366
span,
360
- ident,
361
367
crate_name : name,
362
368
hash,
363
369
extra_filename,
@@ -393,7 +399,7 @@ impl<'a> CrateLoader<'a> {
393
399
Ok ( ( cnum, data) )
394
400
}
395
401
( LoadResult :: Loaded ( library) , host_library) => {
396
- Ok ( self . register_crate ( host_library, root, ident , span, library, dep_kind, name) )
402
+ Ok ( self . register_crate ( host_library, root, span, library, dep_kind, name) )
397
403
}
398
404
_ => panic ! ( )
399
405
}
@@ -469,7 +475,7 @@ impl<'a> CrateLoader<'a> {
469
475
470
476
// Go through the crate metadata and load any crates that it references
471
477
fn resolve_crate_deps ( & mut self ,
472
- root : & Option < CratePaths > ,
478
+ root : & CratePaths ,
473
479
crate_root : & CrateRoot < ' _ > ,
474
480
metadata : & MetadataBlob ,
475
481
krate : CrateNum ,
@@ -484,9 +490,7 @@ impl<'a> CrateLoader<'a> {
484
490
// The map from crate numbers in the crate we're resolving to local crate numbers.
485
491
// We map 0 and all other holes in the map to our parent crate. The "additional"
486
492
// self-dependencies should be harmless.
487
- std:: iter:: once ( krate) . chain ( crate_root. crate_deps
488
- . decode ( metadata)
489
- . map ( |dep| {
493
+ std:: iter:: once ( krate) . chain ( crate_root. crate_deps . decode ( metadata) . map ( |dep| {
490
494
info ! ( "resolving dep crate {} hash: `{}` extra filename: `{}`" , dep. name, dep. hash,
491
495
dep. extra_filename) ;
492
496
if dep. kind == DepKind :: UnexportedMacrosOnly {
@@ -496,32 +500,26 @@ impl<'a> CrateLoader<'a> {
496
500
DepKind :: MacrosOnly => DepKind :: MacrosOnly ,
497
501
_ => dep. kind ,
498
502
} ;
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
503
+ self . resolve_crate ( dep. name , span, dep_kind, Some ( ( root, & dep) ) ) . 0
504
504
} ) ) . collect ( )
505
505
}
506
506
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) ;
507
+ fn read_extension_crate ( & mut self , name : Symbol , span : Span ) -> ExtensionCrate {
508
+ info ! ( "read extension crate `{}`" , name) ;
510
509
let target_triple = self . sess . opts . target_triple . clone ( ) ;
511
510
let host_triple = TargetTriple :: from_triple ( config:: host_triple ( ) ) ;
512
511
let is_cross = target_triple != host_triple;
513
512
let mut target_only = false ;
514
513
let mut locate_ctxt = locator:: Context {
515
514
sess : self . sess ,
516
515
span,
517
- ident : orig_name,
518
- crate_name : rename,
516
+ crate_name : name,
519
517
hash : None ,
520
518
extra_filename : None ,
521
519
filesearch : self . sess . host_filesearch ( PathKind :: Crate ) ,
522
520
target : & self . sess . host ,
523
521
triple : host_triple,
524
- root : & None ,
522
+ root : None ,
525
523
rejected_via_hash : vec ! [ ] ,
526
524
rejected_via_triple : vec ! [ ] ,
527
525
rejected_via_kind : vec ! [ ] ,
@@ -570,25 +568,21 @@ impl<'a> CrateLoader<'a> {
570
568
}
571
569
572
570
fn dlsym_proc_macros ( & self ,
573
- dylib : Option < PathBuf > ,
574
- root : & CrateRoot < ' _ > ,
571
+ path : & Path ,
572
+ disambiguator : CrateDisambiguator ,
575
573
span : Span
576
574
) -> & ' static [ ProcMacro ] {
577
575
use std:: env;
578
576
use crate :: dynamic_lib:: DynamicLibrary ;
579
577
580
- let path = match dylib {
581
- Some ( dylib) => dylib,
582
- None => span_bug ! ( span, "proc-macro crate not dylib" ) ,
583
- } ;
584
578
// Make sure the path contains a / or the linker will search for it.
585
579
let path = env:: current_dir ( ) . unwrap ( ) . join ( path) ;
586
580
let lib = match DynamicLibrary :: open ( Some ( & path) ) {
587
581
Ok ( lib) => lib,
588
582
Err ( err) => self . sess . span_fatal ( span, & err) ,
589
583
} ;
590
584
591
- let sym = self . sess . generate_proc_macro_decls_symbol ( root . disambiguator ) ;
585
+ let sym = self . sess . generate_proc_macro_decls_symbol ( disambiguator) ;
592
586
let decls = unsafe {
593
587
let sym = match lib. symbol ( & sym) {
594
588
Ok ( f) => f,
@@ -610,7 +604,7 @@ impl<'a> CrateLoader<'a> {
610
604
span : Span ,
611
605
name : Symbol )
612
606
-> Option < ( PathBuf , CrateDisambiguator ) > {
613
- let ekrate = self . read_extension_crate ( span , name, name ) ;
607
+ let ekrate = self . read_extension_crate ( name, span ) ;
614
608
615
609
if ekrate. target_only {
616
610
// Need to abort before syntax expansion.
@@ -701,10 +695,7 @@ impl<'a> CrateLoader<'a> {
701
695
} ;
702
696
info ! ( "panic runtime not found -- loading {}" , name) ;
703
697
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 ( ) ) ;
698
+ let ( cnum, data) = self . resolve_crate ( name, DUMMY_SP , DepKind :: Implicit , None ) ;
708
699
709
700
// Sanity check the loaded crate to ensure it is indeed a panic runtime
710
701
// and the panic strategy is indeed what we thought it was.
@@ -794,26 +785,21 @@ impl<'a> CrateLoader<'a> {
794
785
795
786
let mut uses_std = false ;
796
787
self . cstore . iter_crate_data ( |_, data| {
797
- if data. name == sym:: std {
788
+ if data. root . name == sym:: std {
798
789
uses_std = true ;
799
790
}
800
791
} ) ;
801
792
802
793
if uses_std {
803
- let name = match * sanitizer {
794
+ let name = Symbol :: intern ( match sanitizer {
804
795
Sanitizer :: Address => "rustc_asan" ,
805
796
Sanitizer :: Leak => "rustc_lsan" ,
806
797
Sanitizer :: Memory => "rustc_msan" ,
807
798
Sanitizer :: Thread => "rustc_tsan" ,
808
- } ;
799
+ } ) ;
809
800
info ! ( "loading sanitizer: {}" , name) ;
810
801
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 ( ) ) ;
802
+ let data = self . resolve_crate ( name, DUMMY_SP , DepKind :: Explicit , None ) . 1 ;
817
803
818
804
// Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
819
805
if !data. root . sanitizer_runtime {
@@ -832,12 +818,8 @@ impl<'a> CrateLoader<'a> {
832
818
{
833
819
info ! ( "loading profiler" ) ;
834
820
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 ( ) ) ;
821
+ let name = Symbol :: intern ( "profiler_builtins" ) ;
822
+ let data = self . resolve_crate ( name, DUMMY_SP , DepKind :: Implicit , None ) . 1 ;
841
823
842
824
// Sanity check the loaded crate to ensure it is indeed a profiler runtime
843
825
if !data. root . profiler_runtime {
@@ -1004,7 +986,7 @@ impl<'a> CrateLoader<'a> {
1004
986
ast:: ItemKind :: ExternCrate ( orig_name) => {
1005
987
debug ! ( "resolving extern crate stmt. ident: {} orig_name: {:?}" ,
1006
988
item. ident, orig_name) ;
1007
- let orig_name = match orig_name {
989
+ let name = match orig_name {
1008
990
Some ( orig_name) => {
1009
991
crate :: validate_crate_name ( Some ( self . sess ) , & orig_name. as_str ( ) ,
1010
992
Some ( item. span ) ) ;
@@ -1018,10 +1000,7 @@ impl<'a> CrateLoader<'a> {
1018
1000
DepKind :: Explicit
1019
1001
} ;
1020
1002
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 ( ) ) ;
1003
+ let cnum = self . resolve_crate ( name, item. span , dep_kind, None ) . 0 ;
1025
1004
1026
1005
let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
1027
1006
let path_len = definitions. def_path ( def_id. index ) . data . len ( ) ;
@@ -1047,9 +1026,7 @@ impl<'a> CrateLoader<'a> {
1047
1026
name : Symbol ,
1048
1027
span : Span ,
1049
1028
) -> 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 ;
1029
+ let cnum = self . resolve_crate ( name, span, DepKind :: Explicit , None ) . 0 ;
1053
1030
1054
1031
self . update_extern_crate (
1055
1032
cnum,
@@ -1071,9 +1048,7 @@ impl<'a> CrateLoader<'a> {
1071
1048
name : Symbol ,
1072
1049
span : Span ,
1073
1050
) -> Option < CrateNum > {
1074
- let cnum = self . resolve_crate (
1075
- & None , name, name, None , None , span, PathKind :: Crate , DepKind :: Explicit
1076
- ) . ok ( ) ?. 0 ;
1051
+ let cnum = self . maybe_resolve_crate ( name, span, DepKind :: Explicit , None ) . ok ( ) ?. 0 ;
1077
1052
1078
1053
self . update_extern_crate (
1079
1054
cnum,
0 commit comments