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,38 @@ 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 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)
241
238
} ) ;
242
239
243
240
let interpret_alloc_index: Vec < u32 > = crate_root. interpret_alloc_index
@@ -254,8 +251,6 @@ impl<'a> CrateLoader<'a> {
254
251
} ) ;
255
252
256
253
let cmeta = cstore:: CrateMetadata {
257
- name : crate_root. name ,
258
- imported_name : ident,
259
254
extern_crate : Lock :: new ( None ) ,
260
255
def_path_table : Lrc :: new ( def_path_table) ,
261
256
trait_impls,
@@ -274,7 +269,6 @@ impl<'a> CrateLoader<'a> {
274
269
} ,
275
270
private_dep,
276
271
span,
277
- host_lib,
278
272
raw_proc_macros
279
273
} ;
280
274
@@ -340,24 +334,34 @@ impl<'a> CrateLoader<'a> {
340
334
341
335
fn resolve_crate < ' b > (
342
336
& ' b mut self ,
343
- root : & ' b Option < CratePaths > ,
344
- ident : Symbol ,
345
337
name : Symbol ,
346
- hash : Option < & ' b Svh > ,
347
- extra_filename : Option < & ' b str > ,
348
338
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 ,
350
349
mut dep_kind : DepKind ,
350
+ dep : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
351
351
) -> 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
+ } ;
353
358
let result = if let Some ( cnum) = self . existing_match ( name, hash, path_kind) {
354
359
( LoadResult :: Previous ( cnum) , None )
355
360
} else {
356
361
info ! ( "falling back to a load" ) ;
357
362
let mut locate_ctxt = locator:: Context {
358
363
sess : self . sess ,
359
364
span,
360
- ident,
361
365
crate_name : name,
362
366
hash,
363
367
extra_filename,
@@ -393,7 +397,7 @@ impl<'a> CrateLoader<'a> {
393
397
Ok ( ( cnum, data) )
394
398
}
395
399
( 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) )
397
401
}
398
402
_ => panic ! ( )
399
403
}
@@ -469,7 +473,7 @@ impl<'a> CrateLoader<'a> {
469
473
470
474
// Go through the crate metadata and load any crates that it references
471
475
fn resolve_crate_deps ( & mut self ,
472
- root : & Option < CratePaths > ,
476
+ root : & CratePaths ,
473
477
crate_root : & CrateRoot < ' _ > ,
474
478
metadata : & MetadataBlob ,
475
479
krate : CrateNum ,
@@ -484,9 +488,7 @@ impl<'a> CrateLoader<'a> {
484
488
// The map from crate numbers in the crate we're resolving to local crate numbers.
485
489
// We map 0 and all other holes in the map to our parent crate. The "additional"
486
490
// 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| {
490
492
info ! ( "resolving dep crate {} hash: `{}` extra filename: `{}`" , dep. name, dep. hash,
491
493
dep. extra_filename) ;
492
494
if dep. kind == DepKind :: UnexportedMacrosOnly {
@@ -496,32 +498,26 @@ impl<'a> CrateLoader<'a> {
496
498
DepKind :: MacrosOnly => DepKind :: MacrosOnly ,
497
499
_ => dep. kind ,
498
500
} ;
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
504
502
} ) ) . collect ( )
505
503
}
506
504
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) ;
510
507
let target_triple = self . sess . opts . target_triple . clone ( ) ;
511
508
let host_triple = TargetTriple :: from_triple ( config:: host_triple ( ) ) ;
512
509
let is_cross = target_triple != host_triple;
513
510
let mut target_only = false ;
514
511
let mut locate_ctxt = locator:: Context {
515
512
sess : self . sess ,
516
513
span,
517
- ident : orig_name,
518
- crate_name : rename,
514
+ crate_name : name,
519
515
hash : None ,
520
516
extra_filename : None ,
521
517
filesearch : self . sess . host_filesearch ( PathKind :: Crate ) ,
522
518
target : & self . sess . host ,
523
519
triple : host_triple,
524
- root : & None ,
520
+ root : None ,
525
521
rejected_via_hash : vec ! [ ] ,
526
522
rejected_via_triple : vec ! [ ] ,
527
523
rejected_via_kind : vec ! [ ] ,
@@ -570,25 +566,21 @@ impl<'a> CrateLoader<'a> {
570
566
}
571
567
572
568
fn dlsym_proc_macros ( & self ,
573
- dylib : Option < PathBuf > ,
574
- root : & CrateRoot < ' _ > ,
569
+ path : & Path ,
570
+ disambiguator : CrateDisambiguator ,
575
571
span : Span
576
572
) -> & ' static [ ProcMacro ] {
577
573
use std:: env;
578
574
use crate :: dynamic_lib:: DynamicLibrary ;
579
575
580
- let path = match dylib {
581
- Some ( dylib) => dylib,
582
- None => span_bug ! ( span, "proc-macro crate not dylib" ) ,
583
- } ;
584
576
// Make sure the path contains a / or the linker will search for it.
585
577
let path = env:: current_dir ( ) . unwrap ( ) . join ( path) ;
586
578
let lib = match DynamicLibrary :: open ( Some ( & path) ) {
587
579
Ok ( lib) => lib,
588
580
Err ( err) => self . sess . span_fatal ( span, & err) ,
589
581
} ;
590
582
591
- let sym = self . sess . generate_proc_macro_decls_symbol ( root . disambiguator ) ;
583
+ let sym = self . sess . generate_proc_macro_decls_symbol ( disambiguator) ;
592
584
let decls = unsafe {
593
585
let sym = match lib. symbol ( & sym) {
594
586
Ok ( f) => f,
@@ -610,7 +602,7 @@ impl<'a> CrateLoader<'a> {
610
602
span : Span ,
611
603
name : Symbol )
612
604
-> Option < ( PathBuf , CrateDisambiguator ) > {
613
- let ekrate = self . read_extension_crate ( span , name, name ) ;
605
+ let ekrate = self . read_extension_crate ( name, span ) ;
614
606
615
607
if ekrate. target_only {
616
608
// Need to abort before syntax expansion.
@@ -701,10 +693,7 @@ impl<'a> CrateLoader<'a> {
701
693
} ;
702
694
info ! ( "panic runtime not found -- loading {}" , name) ;
703
695
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 ) ;
708
697
709
698
// Sanity check the loaded crate to ensure it is indeed a panic runtime
710
699
// and the panic strategy is indeed what we thought it was.
@@ -794,26 +783,21 @@ impl<'a> CrateLoader<'a> {
794
783
795
784
let mut uses_std = false ;
796
785
self . cstore . iter_crate_data ( |_, data| {
797
- if data. name == sym:: std {
786
+ if data. root . name == sym:: std {
798
787
uses_std = true ;
799
788
}
800
789
} ) ;
801
790
802
791
if uses_std {
803
- let name = match * sanitizer {
792
+ let name = Symbol :: intern ( match sanitizer {
804
793
Sanitizer :: Address => "rustc_asan" ,
805
794
Sanitizer :: Leak => "rustc_lsan" ,
806
795
Sanitizer :: Memory => "rustc_msan" ,
807
796
Sanitizer :: Thread => "rustc_tsan" ,
808
- } ;
797
+ } ) ;
809
798
info ! ( "loading sanitizer: {}" , name) ;
810
799
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 ;
817
801
818
802
// Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
819
803
if !data. root . sanitizer_runtime {
@@ -832,12 +816,8 @@ impl<'a> CrateLoader<'a> {
832
816
{
833
817
info ! ( "loading profiler" ) ;
834
818
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 ;
841
821
842
822
// Sanity check the loaded crate to ensure it is indeed a profiler runtime
843
823
if !data. root . profiler_runtime {
@@ -1004,7 +984,7 @@ impl<'a> CrateLoader<'a> {
1004
984
ast:: ItemKind :: ExternCrate ( orig_name) => {
1005
985
debug ! ( "resolving extern crate stmt. ident: {} orig_name: {:?}" ,
1006
986
item. ident, orig_name) ;
1007
- let orig_name = match orig_name {
987
+ let name = match orig_name {
1008
988
Some ( orig_name) => {
1009
989
crate :: validate_crate_name ( Some ( self . sess ) , & orig_name. as_str ( ) ,
1010
990
Some ( item. span ) ) ;
@@ -1018,10 +998,7 @@ impl<'a> CrateLoader<'a> {
1018
998
DepKind :: Explicit
1019
999
} ;
1020
1000
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 ;
1025
1002
1026
1003
let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
1027
1004
let path_len = definitions. def_path ( def_id. index ) . data . len ( ) ;
@@ -1047,9 +1024,7 @@ impl<'a> CrateLoader<'a> {
1047
1024
name : Symbol ,
1048
1025
span : Span ,
1049
1026
) -> 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 ;
1053
1028
1054
1029
self . update_extern_crate (
1055
1030
cnum,
@@ -1071,9 +1046,7 @@ impl<'a> CrateLoader<'a> {
1071
1046
name : Symbol ,
1072
1047
span : Span ,
1073
1048
) -> 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 ;
1077
1050
1078
1051
self . update_extern_crate (
1079
1052
cnum,
0 commit comments