@@ -231,6 +231,7 @@ use rustc_back::target::Target;
231231
232232use std:: cmp;
233233use std:: collections:: HashMap ;
234+ use std:: fmt;
234235use std:: fs;
235236use std:: io:: prelude:: * ;
236237use std:: io;
@@ -283,6 +284,21 @@ pub struct CratePaths {
283284
284285pub const METADATA_FILENAME : & ' static str = "rust.metadata.bin" ;
285286
287+ #[ derive( Copy , Clone , PartialEq ) ]
288+ enum CrateFlavor {
289+ Rlib ,
290+ Dylib
291+ }
292+
293+ impl fmt:: Display for CrateFlavor {
294+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
295+ f. write_str ( match * self {
296+ CrateFlavor :: Rlib => "rlib" ,
297+ CrateFlavor :: Dylib => "dylib"
298+ } )
299+ }
300+ }
301+
286302impl CratePaths {
287303 fn paths ( & self ) -> Vec < PathBuf > {
288304 match ( & self . dylib , & self . rlib ) {
@@ -457,8 +473,8 @@ impl<'a> Context<'a> {
457473 let mut libraries = Vec :: new ( ) ;
458474 for ( _hash, ( rlibs, dylibs) ) in candidates {
459475 let mut metadata = None ;
460- let rlib = self . extract_one ( rlibs, "rlib" , & mut metadata) ;
461- let dylib = self . extract_one ( dylibs, "dylib" , & mut metadata) ;
476+ let rlib = self . extract_one ( rlibs, CrateFlavor :: Rlib , & mut metadata) ;
477+ let dylib = self . extract_one ( dylibs, CrateFlavor :: Dylib , & mut metadata) ;
462478 match metadata {
463479 Some ( metadata) => {
464480 libraries. push ( Library {
@@ -515,7 +531,7 @@ impl<'a> Context<'a> {
515531 // read the metadata from it if `*slot` is `None`. If the metadata couldn't
516532 // be read, it is assumed that the file isn't a valid rust library (no
517533 // errors are emitted).
518- fn extract_one ( & mut self , m : HashMap < PathBuf , PathKind > , flavor : & str ,
534+ fn extract_one ( & mut self , m : HashMap < PathBuf , PathKind > , flavor : CrateFlavor ,
519535 slot : & mut Option < MetadataBlob > ) -> Option < ( PathBuf , PathKind ) > {
520536 let mut ret = None :: < ( PathBuf , PathKind ) > ;
521537 let mut error = 0 ;
@@ -535,7 +551,7 @@ impl<'a> Context<'a> {
535551 let mut err: Option < DiagnosticBuilder > = None ;
536552 for ( lib, kind) in m {
537553 info ! ( "{} reading metadata from: {}" , flavor, lib. display( ) ) ;
538- let metadata = match get_metadata_section ( self . target , & lib) {
554+ let metadata = match get_metadata_section ( self . target , flavor , & lib) {
539555 Ok ( blob) => {
540556 if self . crate_matches ( blob. as_slice ( ) , & lib) {
541557 blob
@@ -702,8 +718,8 @@ impl<'a> Context<'a> {
702718
703719 // Extract the rlib/dylib pair.
704720 let mut metadata = None ;
705- let rlib = self . extract_one ( rlibs, "rlib" , & mut metadata) ;
706- let dylib = self . extract_one ( dylibs, "dylib" , & mut metadata) ;
721+ let rlib = self . extract_one ( rlibs, CrateFlavor :: Rlib , & mut metadata) ;
722+ let dylib = self . extract_one ( dylibs, CrateFlavor :: Dylib , & mut metadata) ;
707723
708724 if rlib. is_none ( ) && dylib. is_none ( ) { return None }
709725 match metadata {
@@ -746,21 +762,21 @@ impl ArchiveMetadata {
746762}
747763
748764// Just a small wrapper to time how long reading metadata takes.
749- fn get_metadata_section ( target : & Target , filename : & Path )
765+ fn get_metadata_section ( target : & Target , flavor : CrateFlavor , filename : & Path )
750766 -> Result < MetadataBlob , String > {
751767 let start = Instant :: now ( ) ;
752- let ret = get_metadata_section_imp ( target, filename) ;
768+ let ret = get_metadata_section_imp ( target, flavor , filename) ;
753769 info ! ( "reading {:?} => {:?}" , filename. file_name( ) . unwrap( ) ,
754770 start. elapsed( ) ) ;
755771 return ret
756772}
757773
758- fn get_metadata_section_imp ( target : & Target , filename : & Path )
774+ fn get_metadata_section_imp ( target : & Target , flavor : CrateFlavor , filename : & Path )
759775 -> Result < MetadataBlob , String > {
760776 if !filename. exists ( ) {
761777 return Err ( format ! ( "no such file: '{}'" , filename. display( ) ) ) ;
762778 }
763- if filename . file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) . ends_with ( ".rlib" ) {
779+ if flavor == CrateFlavor :: Rlib {
764780 // Use ArchiveRO for speed here, it's backed by LLVM and uses mmap
765781 // internally to read the file. We also avoid even using a memcpy by
766782 // just keeping the archive along while the metadata is in use.
@@ -864,7 +880,9 @@ pub fn read_meta_section_name(target: &Target) -> &'static str {
864880// A diagnostic function for dumping crate metadata to an output stream
865881pub fn list_file_metadata ( target : & Target , path : & Path ,
866882 out : & mut io:: Write ) -> io:: Result < ( ) > {
867- match get_metadata_section ( target, path) {
883+ let filename = path. file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) ;
884+ let flavor = if filename. ends_with ( ".rlib" ) { CrateFlavor :: Rlib } else { CrateFlavor :: Dylib } ;
885+ match get_metadata_section ( target, flavor, path) {
868886 Ok ( bytes) => decoder:: list_crate_metadata ( bytes. as_slice ( ) , out) ,
869887 Err ( msg) => {
870888 write ! ( out, "{}\n " , msg)
0 commit comments