@@ -14,13 +14,12 @@ use rustc::session::{Session, CrateDisambiguator};
14
14
use rustc:: session:: config:: { Sanitizer , self } ;
15
15
use rustc_target:: spec:: { PanicStrategy , TargetTriple } ;
16
16
use rustc:: session:: search_paths:: PathKind ;
17
- use rustc:: middle:: cstore:: { CrateSource , ExternCrate , ExternCrateSource } ;
17
+ use rustc:: middle:: cstore:: { CrateSource , ExternCrate , ExternCrateSource , MetadataLoader } ;
18
18
use rustc:: util:: common:: record_time;
19
19
use rustc:: util:: nodemap:: FxHashSet ;
20
20
use rustc:: hir:: map:: Definitions ;
21
21
use rustc:: hir:: def_id:: LOCAL_CRATE ;
22
22
23
- use std:: ops:: Deref ;
24
23
use std:: path:: { Path , PathBuf } ;
25
24
use std:: { cmp, fs} ;
26
25
@@ -58,29 +57,6 @@ fn dump_crates(cstore: &CStore) {
58
57
} ) ;
59
58
}
60
59
61
- // Extra info about a crate loaded for plugins or exported macros.
62
- struct ExtensionCrate {
63
- metadata : PMDSource ,
64
- dylib : Option < PathBuf > ,
65
- target_only : bool ,
66
- }
67
-
68
- enum PMDSource {
69
- Registered ( Lrc < cstore:: CrateMetadata > ) ,
70
- Owned ( Library ) ,
71
- }
72
-
73
- impl Deref for PMDSource {
74
- type Target = MetadataBlob ;
75
-
76
- fn deref ( & self ) -> & MetadataBlob {
77
- match * self {
78
- PMDSource :: Registered ( ref cmd) => & cmd. blob ,
79
- PMDSource :: Owned ( ref lib) => & lib. metadata
80
- }
81
- }
82
- }
83
-
84
60
enum LoadResult {
85
61
Previous ( CrateNum ) ,
86
62
Loaded ( Library ) ,
@@ -495,21 +471,27 @@ impl<'a> CrateLoader<'a> {
495
471
self . resolve_crate ( dep. name , span, dep_kind, Some ( ( root, & dep) ) ) . 0
496
472
} ) ) . collect ( )
497
473
}
474
+ }
498
475
499
- fn read_extension_crate ( & self , name : Symbol , span : Span ) -> ExtensionCrate {
476
+ fn read_extension_crate (
477
+ sess : & Session ,
478
+ metadata_loader : & dyn MetadataLoader ,
479
+ name : Symbol ,
480
+ span : Span ,
481
+ ) -> ( Library , bool ) {
500
482
info ! ( "read extension crate `{}`" , name) ;
501
- let target_triple = self . sess . opts . target_triple . clone ( ) ;
483
+ let target_triple = sess. opts . target_triple . clone ( ) ;
502
484
let host_triple = TargetTriple :: from_triple ( config:: host_triple ( ) ) ;
503
485
let is_cross = target_triple != host_triple;
504
486
let mut target_only = false ;
505
487
let mut locate_ctxt = locator:: Context {
506
- sess : self . sess ,
488
+ sess,
507
489
span,
508
490
crate_name : name,
509
491
hash : None ,
510
492
extra_filename : None ,
511
- filesearch : self . sess . host_filesearch ( PathKind :: Crate ) ,
512
- target : & self . sess . host ,
493
+ filesearch : sess. host_filesearch ( PathKind :: Crate ) ,
494
+ target : & sess. host ,
513
495
triple : host_triple,
514
496
root : None ,
515
497
rejected_via_hash : vec ! [ ] ,
@@ -519,46 +501,32 @@ impl<'a> CrateLoader<'a> {
519
501
rejected_via_filename : vec ! [ ] ,
520
502
should_match_name : true ,
521
503
is_proc_macro : None ,
522
- metadata_loader : & * self . cstore . metadata_loader ,
504
+ metadata_loader,
523
505
} ;
524
- let library = self . load ( & mut locate_ctxt) . or_else ( || {
506
+
507
+ let library = locate_ctxt. maybe_load_library_crate ( ) . or_else ( || {
525
508
if !is_cross {
526
509
return None
527
510
}
528
511
// Try loading from target crates. This will abort later if we
529
512
// try to load a plugin registrar function,
530
513
target_only = true ;
531
514
532
- locate_ctxt. target = & self . sess . target . target ;
515
+ locate_ctxt. target = & sess. target . target ;
533
516
locate_ctxt. triple = target_triple;
534
- locate_ctxt. filesearch = self . sess . target_filesearch ( PathKind :: Crate ) ;
517
+ locate_ctxt. filesearch = sess. target_filesearch ( PathKind :: Crate ) ;
535
518
536
- self . load ( & mut locate_ctxt )
519
+ locate_ctxt . maybe_load_library_crate ( )
537
520
} ) ;
538
521
let library = match library {
539
522
Some ( l) => l,
540
523
None => locate_ctxt. report_errs ( ) ,
541
524
} ;
542
525
543
- let ( dylib, metadata) = match library {
544
- LoadResult :: Previous ( cnum) => {
545
- let data = self . cstore . get_crate_data ( cnum) ;
546
- ( data. source . dylib . clone ( ) , PMDSource :: Registered ( data) )
547
- }
548
- LoadResult :: Loaded ( library) => {
549
- let dylib = library. source . dylib . clone ( ) ;
550
- let metadata = PMDSource :: Owned ( library) ;
551
- ( dylib, metadata)
552
- }
553
- } ;
554
-
555
- ExtensionCrate {
556
- metadata,
557
- dylib : dylib. map ( |p| p. 0 ) ,
558
- target_only,
559
- }
526
+ ( library, target_only)
560
527
}
561
528
529
+ impl < ' a > CrateLoader < ' a > {
562
530
fn dlsym_proc_macros ( & self ,
563
531
path : & Path ,
564
532
disambiguator : CrateDisambiguator ,
@@ -589,32 +557,33 @@ impl<'a> CrateLoader<'a> {
589
557
590
558
decls
591
559
}
560
+ }
592
561
593
562
/// Look for a plugin registrar. Returns library path, crate
594
563
/// SVH and DefIndex of the registrar function.
595
- pub fn find_plugin_registrar ( & self ,
564
+ pub fn find_plugin_registrar ( sess : & Session ,
565
+ metadata_loader : & dyn MetadataLoader ,
596
566
span : Span ,
597
567
name : Symbol )
598
568
-> Option < ( PathBuf , CrateDisambiguator ) > {
599
- let ekrate = self . read_extension_crate ( name, span) ;
569
+ let ( library , target_only ) = read_extension_crate ( sess , metadata_loader , name, span) ;
600
570
601
- if ekrate . target_only {
571
+ if target_only {
602
572
// Need to abort before syntax expansion.
603
573
let message = format ! ( "plugin `{}` is not available for triple `{}` \
604
574
(only found {})",
605
575
name,
606
576
config:: host_triple( ) ,
607
- self . sess. opts. target_triple) ;
608
- span_fatal ! ( self . sess, span, E0456 , "{}" , & message) ;
577
+ sess. opts. target_triple) ;
578
+ span_fatal ! ( sess, span, E0456 , "{}" , & message) ;
609
579
}
610
580
611
- let root = ekrate. metadata . get_root ( ) ;
612
- match ekrate. dylib . as_ref ( ) {
581
+ match library. source . dylib {
613
582
Some ( dylib) => {
614
- Some ( ( dylib. to_path_buf ( ) , root . disambiguator ) )
583
+ Some ( ( dylib. 0 , library . metadata . get_root ( ) . disambiguator ) )
615
584
}
616
585
None => {
617
- span_err ! ( self . sess, span, E0457 ,
586
+ span_err ! ( sess, span, E0457 ,
618
587
"plugin `{}` only found in rlib format, but must be available \
619
588
in dylib format",
620
589
name) ;
@@ -625,6 +594,7 @@ impl<'a> CrateLoader<'a> {
625
594
}
626
595
}
627
596
597
+ impl < ' a > CrateLoader < ' a > {
628
598
fn inject_panic_runtime ( & self , krate : & ast:: Crate ) {
629
599
// If we're only compiling an rlib, then there's no need to select a
630
600
// panic runtime, so we just skip this section entirely.
@@ -957,9 +927,7 @@ impl<'a> CrateLoader<'a> {
957
927
data. dependencies . borrow_mut ( ) . push ( krate) ;
958
928
} ) ;
959
929
}
960
- }
961
930
962
- impl < ' a > CrateLoader < ' a > {
963
931
pub fn postprocess ( & self , krate : & ast:: Crate ) {
964
932
self . inject_sanitizer_runtime ( ) ;
965
933
self . inject_profiler_runtime ( ) ;
0 commit comments