@@ -299,17 +299,17 @@ impl<'a> Context<'a> {
299
299
300
300
let lib = m. move_iter ( ) . next ( ) . unwrap ( ) ;
301
301
if slot. is_none ( ) {
302
- info ! ( "{} reading meatadata from: {}" , flavor, lib. display( ) ) ;
302
+ info ! ( "{} reading metadata from: {}" , flavor, lib. display( ) ) ;
303
303
match get_metadata_section ( self . os , & lib) {
304
- Some ( blob) => {
304
+ Ok ( blob) => {
305
305
if self . crate_matches ( blob. as_slice ( ) ) {
306
306
* slot = Some ( blob) ;
307
307
} else {
308
308
info ! ( "metadata mismatch" ) ;
309
309
return None ;
310
310
}
311
311
}
312
- None => {
312
+ Err ( _ ) => {
313
313
info ! ( "no metadata found" ) ;
314
314
return None
315
315
}
@@ -388,15 +388,18 @@ impl ArchiveMetadata {
388
388
}
389
389
390
390
// Just a small wrapper to time how long reading metadata takes.
391
- fn get_metadata_section ( os : Os , filename : & Path ) -> Option < MetadataBlob > {
391
+ fn get_metadata_section ( os : Os , filename : & Path ) -> Result < MetadataBlob , ~ str > {
392
392
let start = time:: precise_time_ns ( ) ;
393
393
let ret = get_metadata_section_imp ( os, filename) ;
394
394
info ! ( "reading {} => {}ms" , filename. filename_display( ) ,
395
395
( time:: precise_time_ns( ) - start) / 1000000 ) ;
396
396
return ret;
397
397
}
398
398
399
- fn get_metadata_section_imp ( os : Os , filename : & Path ) -> Option < MetadataBlob > {
399
+ fn get_metadata_section_imp ( os : Os , filename : & Path ) -> Result < MetadataBlob , ~str > {
400
+ if !filename. exists ( ) {
401
+ return Err ( format ! ( "no such file: '{}'" , filename. display( ) ) ) ;
402
+ }
400
403
if filename. filename_str ( ) . unwrap ( ) . ends_with ( ".rlib" ) {
401
404
// Use ArchiveRO for speed here, it's backed by LLVM and uses mmap
402
405
// internally to read the file. We also avoid even using a memcpy by
@@ -405,19 +408,26 @@ fn get_metadata_section_imp(os: Os, filename: &Path) -> Option<MetadataBlob> {
405
408
Some ( ar) => ar,
406
409
None => {
407
410
debug ! ( "llvm didn't like `{}`" , filename. display( ) ) ;
408
- return None ;
411
+ return Err ( format ! ( "failed to read rlib metadata: '{}'" ,
412
+ filename. display( ) ) ) ;
409
413
}
410
414
} ;
411
- return ArchiveMetadata :: new ( archive) . map ( |ar| MetadataArchive ( ar) ) ;
415
+ return match ArchiveMetadata :: new ( archive) . map ( |ar| MetadataArchive ( ar) ) {
416
+ None => return Err ( format ! ( "failed to read rlib metadata: '{}'" ,
417
+ filename. display( ) ) ) ,
418
+ Some ( blob) => return Ok ( blob)
419
+ }
412
420
}
413
421
unsafe {
414
422
let mb = filename. with_c_str ( |buf| {
415
423
llvm:: LLVMRustCreateMemoryBufferWithContentsOfFile ( buf)
416
424
} ) ;
417
- if mb as int == 0 { return None }
425
+ if mb as int == 0 {
426
+ return Err ( format ! ( "error reading library: '{}'" , filename. display( ) ) )
427
+ }
418
428
let of = match ObjectFile :: new ( mb) {
419
429
Some ( of) => of,
420
- _ => return None
430
+ _ => return Err ( format ! ( "provided path not an object file: '{}'" , filename . display ( ) ) )
421
431
} ;
422
432
let si = mk_section_iter ( of. llof ) ;
423
433
while llvm:: LLVMIsSectionIteratorAtEnd ( of. llof , si. llsi ) == False {
@@ -427,30 +437,31 @@ fn get_metadata_section_imp(os: Os, filename: &Path) -> Option<MetadataBlob> {
427
437
if read_meta_section_name ( os) == name {
428
438
let cbuf = llvm:: LLVMGetSectionContents ( si. llsi ) ;
429
439
let csz = llvm:: LLVMGetSectionSize ( si. llsi ) as uint ;
430
- let mut found = None ;
440
+ let mut found = Err ( format ! ( "metadata not found: '{}'" , filename . display ( ) ) ) ;
431
441
let cvbuf: * u8 = cast:: transmute ( cbuf) ;
432
442
let vlen = encoder:: metadata_encoding_version. len ( ) ;
433
443
debug ! ( "checking {} bytes of metadata-version stamp" ,
434
444
vlen) ;
435
445
let minsz = cmp:: min ( vlen, csz) ;
436
446
let version_ok = vec:: raw:: buf_as_slice ( cvbuf, minsz,
437
447
|buf0| buf0 == encoder:: metadata_encoding_version) ;
438
- if !version_ok { return None ; }
448
+ if !version_ok { return Err ( format ! ( "incompatible metadata version found: '{}'" ,
449
+ filename. display( ) ) ) ; }
439
450
440
451
let cvbuf1 = cvbuf. offset ( vlen as int ) ;
441
452
debug ! ( "inflating {} bytes of compressed metadata" ,
442
453
csz - vlen) ;
443
454
vec:: raw:: buf_as_slice ( cvbuf1, csz-vlen, |bytes| {
444
455
let inflated = flate:: inflate_bytes ( bytes) ;
445
- found = Some ( MetadataVec ( inflated) ) ;
456
+ found = Ok ( MetadataVec ( inflated) ) ;
446
457
} ) ;
447
- if found. is_some ( ) {
458
+ if found. is_ok ( ) {
448
459
return found;
449
460
}
450
461
}
451
462
llvm:: LLVMMoveToNextSection ( si. llsi ) ;
452
463
}
453
- return None ;
464
+ return Err ( format ! ( "metadata not found: '{}'" , filename . display ( ) ) ) ;
454
465
}
455
466
}
456
467
@@ -478,9 +489,9 @@ pub fn read_meta_section_name(os: Os) -> &'static str {
478
489
pub fn list_file_metadata ( os : Os , path : & Path ,
479
490
out : & mut io:: Writer ) -> io:: IoResult < ( ) > {
480
491
match get_metadata_section ( os, path) {
481
- Some ( bytes) => decoder:: list_crate_metadata ( bytes. as_slice ( ) , out) ,
482
- None => {
483
- write ! ( out, "could not find metadata in {}. \n " , path . display ( ) )
492
+ Ok ( bytes) => decoder:: list_crate_metadata ( bytes. as_slice ( ) , out) ,
493
+ Err ( msg ) => {
494
+ write ! ( out, "{} \n " , msg )
484
495
}
485
496
}
486
497
}
0 commit comments