@@ -17,6 +17,7 @@ use cstore::{self, CStore, CrateSource, MetadataBlob};
1717use decoder;
1818use loader:: { self , CratePaths } ;
1919
20+ use rustc:: hir:: def_id:: DefIndex ;
2021use rustc:: hir:: svh:: Svh ;
2122use rustc:: dep_graph:: { DepGraph , DepNode } ;
2223use rustc:: session:: { config, Session } ;
@@ -610,9 +611,10 @@ impl<'a> CrateReader<'a> {
610611 macros
611612 }
612613
613- /// Look for a plugin registrar. Returns library path and symbol name.
614+ /// Look for a plugin registrar. Returns library path, crate
615+ /// SVH and DefIndex of the registrar function.
614616 pub fn find_plugin_registrar ( & mut self , span : Span , name : & str )
615- -> Option < ( PathBuf , String ) > {
617+ -> Option < ( PathBuf , Svh , DefIndex ) > {
616618 let ekrate = self . read_extension_crate ( span, & CrateInfo {
617619 name : name. to_string ( ) ,
618620 ident : name. to_string ( ) ,
@@ -630,12 +632,14 @@ impl<'a> CrateReader<'a> {
630632 span_fatal ! ( self . sess, span, E0456 , "{}" , & message[ ..] ) ;
631633 }
632634
635+ let svh = decoder:: get_crate_hash ( ekrate. metadata . as_slice ( ) ) ;
633636 let registrar =
634- decoder:: get_plugin_registrar_fn ( ekrate. metadata . as_slice ( ) )
635- . map ( |id| decoder:: get_symbol_from_buf ( ekrate. metadata . as_slice ( ) , id) ) ;
637+ decoder:: get_plugin_registrar_fn ( ekrate. metadata . as_slice ( ) ) ;
636638
637639 match ( ekrate. dylib . as_ref ( ) , registrar) {
638- ( Some ( dylib) , Some ( reg) ) => Some ( ( dylib. to_path_buf ( ) , reg) ) ,
640+ ( Some ( dylib) , Some ( reg) ) => {
641+ Some ( ( dylib. to_path_buf ( ) , svh, reg) )
642+ }
639643 ( None , Some ( _) ) => {
640644 span_err ! ( self . sess, span, E0457 ,
641645 "plugin `{}` only found in rlib format, but must be available \
0 commit comments