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