@@ -231,6 +231,7 @@ use rustc_back::target::Target;
231
231
232
232
use std:: cmp;
233
233
use std:: collections:: HashMap ;
234
+ use std:: fmt;
234
235
use std:: fs;
235
236
use std:: io:: prelude:: * ;
236
237
use std:: io;
@@ -283,6 +284,21 @@ pub struct CratePaths {
283
284
284
285
pub const METADATA_FILENAME : & ' static str = "rust.metadata.bin" ;
285
286
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
+
286
302
impl CratePaths {
287
303
fn paths ( & self ) -> Vec < PathBuf > {
288
304
match ( & self . dylib , & self . rlib ) {
@@ -457,8 +473,8 @@ impl<'a> Context<'a> {
457
473
let mut libraries = Vec :: new ( ) ;
458
474
for ( _hash, ( rlibs, dylibs) ) in candidates {
459
475
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) ;
462
478
match metadata {
463
479
Some ( metadata) => {
464
480
libraries. push ( Library {
@@ -515,7 +531,7 @@ impl<'a> Context<'a> {
515
531
// read the metadata from it if `*slot` is `None`. If the metadata couldn't
516
532
// be read, it is assumed that the file isn't a valid rust library (no
517
533
// 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 ,
519
535
slot : & mut Option < MetadataBlob > ) -> Option < ( PathBuf , PathKind ) > {
520
536
let mut ret = None :: < ( PathBuf , PathKind ) > ;
521
537
let mut error = 0 ;
@@ -535,7 +551,7 @@ impl<'a> Context<'a> {
535
551
let mut err: Option < DiagnosticBuilder > = None ;
536
552
for ( lib, kind) in m {
537
553
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) {
539
555
Ok ( blob) => {
540
556
if self . crate_matches ( blob. as_slice ( ) , & lib) {
541
557
blob
@@ -702,8 +718,8 @@ impl<'a> Context<'a> {
702
718
703
719
// Extract the rlib/dylib pair.
704
720
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) ;
707
723
708
724
if rlib. is_none ( ) && dylib. is_none ( ) { return None }
709
725
match metadata {
@@ -746,21 +762,21 @@ impl ArchiveMetadata {
746
762
}
747
763
748
764
// 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 )
750
766
-> Result < MetadataBlob , String > {
751
767
let start = Instant :: now ( ) ;
752
- let ret = get_metadata_section_imp ( target, filename) ;
768
+ let ret = get_metadata_section_imp ( target, flavor , filename) ;
753
769
info ! ( "reading {:?} => {:?}" , filename. file_name( ) . unwrap( ) ,
754
770
start. elapsed( ) ) ;
755
771
return ret
756
772
}
757
773
758
- fn get_metadata_section_imp ( target : & Target , filename : & Path )
774
+ fn get_metadata_section_imp ( target : & Target , flavor : CrateFlavor , filename : & Path )
759
775
-> Result < MetadataBlob , String > {
760
776
if !filename. exists ( ) {
761
777
return Err ( format ! ( "no such file: '{}'" , filename. display( ) ) ) ;
762
778
}
763
- if filename . file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) . ends_with ( ".rlib" ) {
779
+ if flavor == CrateFlavor :: Rlib {
764
780
// Use ArchiveRO for speed here, it's backed by LLVM and uses mmap
765
781
// internally to read the file. We also avoid even using a memcpy by
766
782
// 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 {
864
880
// A diagnostic function for dumping crate metadata to an output stream
865
881
pub fn list_file_metadata ( target : & Target , path : & Path ,
866
882
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) {
868
886
Ok ( bytes) => decoder:: list_crate_metadata ( bytes. as_slice ( ) , out) ,
869
887
Err ( msg) => {
870
888
write ! ( out, "{}\n " , msg)
0 commit comments