@@ -14,13 +14,12 @@ use rustc::session::{Session, CrateDisambiguator};
1414use rustc:: session:: config:: { Sanitizer , self } ;
1515use rustc_target:: spec:: { PanicStrategy , TargetTriple } ;
1616use rustc:: session:: search_paths:: PathKind ;
17- use rustc:: middle:: cstore:: { CrateSource , ExternCrate , ExternCrateSource } ;
17+ use rustc:: middle:: cstore:: { CrateSource , ExternCrate , ExternCrateSource , MetadataLoader } ;
1818use rustc:: util:: common:: record_time;
1919use rustc:: util:: nodemap:: FxHashSet ;
2020use rustc:: hir:: map:: Definitions ;
2121use rustc:: hir:: def_id:: LOCAL_CRATE ;
2222
23- use std:: ops:: Deref ;
2423use std:: path:: { Path , PathBuf } ;
2524use std:: { cmp, fs} ;
2625
@@ -58,29 +57,6 @@ fn dump_crates(cstore: &CStore) {
5857 } ) ;
5958}
6059
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-
8460enum LoadResult {
8561 Previous ( CrateNum ) ,
8662 Loaded ( Library ) ,
@@ -495,21 +471,27 @@ impl<'a> CrateLoader<'a> {
495471 self . resolve_crate ( dep. name , span, dep_kind, Some ( ( root, & dep) ) ) . 0
496472 } ) ) . collect ( )
497473 }
474+ }
498475
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 ) {
500482 info ! ( "read extension crate `{}`" , name) ;
501- let target_triple = self . sess . opts . target_triple . clone ( ) ;
483+ let target_triple = sess. opts . target_triple . clone ( ) ;
502484 let host_triple = TargetTriple :: from_triple ( config:: host_triple ( ) ) ;
503485 let is_cross = target_triple != host_triple;
504486 let mut target_only = false ;
505487 let mut locate_ctxt = locator:: Context {
506- sess : self . sess ,
488+ sess,
507489 span,
508490 crate_name : name,
509491 hash : None ,
510492 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 ,
513495 triple : host_triple,
514496 root : None ,
515497 rejected_via_hash : vec ! [ ] ,
@@ -519,46 +501,32 @@ impl<'a> CrateLoader<'a> {
519501 rejected_via_filename : vec ! [ ] ,
520502 should_match_name : true ,
521503 is_proc_macro : None ,
522- metadata_loader : & * self . cstore . metadata_loader ,
504+ metadata_loader,
523505 } ;
524- let library = self . load ( & mut locate_ctxt) . or_else ( || {
506+
507+ let library = locate_ctxt. maybe_load_library_crate ( ) . or_else ( || {
525508 if !is_cross {
526509 return None
527510 }
528511 // Try loading from target crates. This will abort later if we
529512 // try to load a plugin registrar function,
530513 target_only = true ;
531514
532- locate_ctxt. target = & self . sess . target . target ;
515+ locate_ctxt. target = & sess. target . target ;
533516 locate_ctxt. triple = target_triple;
534- locate_ctxt. filesearch = self . sess . target_filesearch ( PathKind :: Crate ) ;
517+ locate_ctxt. filesearch = sess. target_filesearch ( PathKind :: Crate ) ;
535518
536- self . load ( & mut locate_ctxt )
519+ locate_ctxt . maybe_load_library_crate ( )
537520 } ) ;
538521 let library = match library {
539522 Some ( l) => l,
540523 None => locate_ctxt. report_errs ( ) ,
541524 } ;
542525
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)
560527 }
561528
529+ impl < ' a > CrateLoader < ' a > {
562530 fn dlsym_proc_macros ( & self ,
563531 path : & Path ,
564532 disambiguator : CrateDisambiguator ,
@@ -589,32 +557,33 @@ impl<'a> CrateLoader<'a> {
589557
590558 decls
591559 }
560+ }
592561
593562 /// Look for a plugin registrar. Returns library path, crate
594563 /// 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 ,
596566 span : Span ,
597567 name : Symbol )
598568 -> 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) ;
600570
601- if ekrate . target_only {
571+ if target_only {
602572 // Need to abort before syntax expansion.
603573 let message = format ! ( "plugin `{}` is not available for triple `{}` \
604574 (only found {})",
605575 name,
606576 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) ;
609579 }
610580
611- let root = ekrate. metadata . get_root ( ) ;
612- match ekrate. dylib . as_ref ( ) {
581+ match library. source . dylib {
613582 Some ( dylib) => {
614- Some ( ( dylib. to_path_buf ( ) , root . disambiguator ) )
583+ Some ( ( dylib. 0 , library . metadata . get_root ( ) . disambiguator ) )
615584 }
616585 None => {
617- span_err ! ( self . sess, span, E0457 ,
586+ span_err ! ( sess, span, E0457 ,
618587 "plugin `{}` only found in rlib format, but must be available \
619588 in dylib format",
620589 name) ;
@@ -625,6 +594,7 @@ impl<'a> CrateLoader<'a> {
625594 }
626595 }
627596
597+ impl < ' a > CrateLoader < ' a > {
628598 fn inject_panic_runtime ( & self , krate : & ast:: Crate ) {
629599 // If we're only compiling an rlib, then there's no need to select a
630600 // panic runtime, so we just skip this section entirely.
@@ -957,9 +927,7 @@ impl<'a> CrateLoader<'a> {
957927 data. dependencies . borrow_mut ( ) . push ( krate) ;
958928 } ) ;
959929 }
960- }
961930
962- impl < ' a > CrateLoader < ' a > {
963931 pub fn postprocess ( & self , krate : & ast:: Crate ) {
964932 self . inject_sanitizer_runtime ( ) ;
965933 self . inject_profiler_runtime ( ) ;
0 commit comments