diff options
| author | Kevin Enderby <enderby@apple.com> | 2016-07-19 20:47:07 +0000 |
|---|---|---|
| committer | Kevin Enderby <enderby@apple.com> | 2016-07-19 20:47:07 +0000 |
| commit | 6524bd8c00a3c7339171cdcebda0ad95116c5f81 (patch) | |
| tree | 0d5e7e7cf894908332813f9999bf0fe6542ed253 /llvm/tools/llvm-objdump | |
| parent | 47c04f9543c3d4c3c4d30bd8942a0bd99d4c712b (diff) | |
| download | bcm5719-llvm-6524bd8c00a3c7339171cdcebda0ad95116c5f81.tar.gz bcm5719-llvm-6524bd8c00a3c7339171cdcebda0ad95116c5f81.zip | |
Next step along the way to getting good error messages for bad archives.
This step builds on Lang Hames work to change Archive::child_iterator
for better interoperation with Error/Expected. Building on that it is now
possible to return an error message when the size field of an archive
contains non-decimal characters.
llvm-svn: 276025
Diffstat (limited to 'llvm/tools/llvm-objdump')
| -rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 4d950f1d7bd..10cd407e377 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -1472,8 +1472,9 @@ static void printMachOUniversalHeaders(const object::MachOUniversalBinary *UB, } } -static void printArchiveChild(const Archive::Child &C, bool verbose, - bool print_offset) { +static void printArchiveChild(StringRef Filename, const Archive::Child &C, + bool verbose, bool print_offset, + StringRef ArchitectureName = StringRef()) { if (print_offset) outs() << C.getChildOffset() << "\t"; sys::fs::perms Mode = C.getAccessMode(); @@ -1498,9 +1499,9 @@ static void printArchiveChild(const Archive::Child &C, bool verbose, outs() << format("%3d/", UID); unsigned GID = C.getGID(); outs() << format("%-3d ", GID); - ErrorOr<uint64_t> Size = C.getRawSize(); - if (std::error_code EC = Size.getError()) - report_fatal_error(EC.message()); + Expected<uint64_t> Size = C.getRawSize(); + if (!Size) + report_error(Filename, C, Size.takeError(), ArchitectureName); outs() << format("%5" PRId64, Size.get()) << " "; StringRef RawLastModified = C.getRawLastModified(); @@ -1534,12 +1535,15 @@ static void printArchiveChild(const Archive::Child &C, bool verbose, } } -static void printArchiveHeaders(Archive *A, bool verbose, bool print_offset) { +static void printArchiveHeaders(StringRef Filename, Archive *A, bool verbose, + bool print_offset, + StringRef ArchitectureName = StringRef()) { Error Err; for (const auto &C : A->children(Err, false)) - printArchiveChild(C, verbose, print_offset); + printArchiveChild(Filename, C, verbose, print_offset, ArchitectureName); + if (Err) - report_fatal_error(std::move(Err)); + report_error(Filename, std::move(Err)); } // ParseInputMachO() parses the named Mach-O file in Filename and handles the @@ -1569,7 +1573,8 @@ void llvm::ParseInputMachO(StringRef Filename) { if (Archive *A = dyn_cast<Archive>(&Bin)) { outs() << "Archive : " << Filename << "\n"; if (ArchiveHeaders) - printArchiveHeaders(A, !NonVerbose, ArchiveMemberOffsets); + printArchiveHeaders(Filename, A, !NonVerbose, ArchiveMemberOffsets); + Error Err; for (auto &C : A->children(Err)) { Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(); @@ -1626,7 +1631,8 @@ void llvm::ParseInputMachO(StringRef Filename) { outs() << " (architecture " << ArchitectureName << ")"; outs() << "\n"; if (ArchiveHeaders) - printArchiveHeaders(A.get(), !NonVerbose, ArchiveMemberOffsets); + printArchiveHeaders(Filename, A.get(), !NonVerbose, + ArchiveMemberOffsets, ArchitectureName); Error Err; for (auto &C : A->children(Err)) { Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(); @@ -1681,7 +1687,8 @@ void llvm::ParseInputMachO(StringRef Filename) { std::unique_ptr<Archive> &A = *AOrErr; outs() << "Archive : " << Filename << "\n"; if (ArchiveHeaders) - printArchiveHeaders(A.get(), !NonVerbose, ArchiveMemberOffsets); + printArchiveHeaders(Filename, A.get(), !NonVerbose, + ArchiveMemberOffsets); Error Err; for (auto &C : A->children(Err)) { Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(); @@ -1732,7 +1739,8 @@ void llvm::ParseInputMachO(StringRef Filename) { outs() << " (architecture " << ArchitectureName << ")"; outs() << "\n"; if (ArchiveHeaders) - printArchiveHeaders(A.get(), !NonVerbose, ArchiveMemberOffsets); + printArchiveHeaders(Filename, A.get(), !NonVerbose, + ArchiveMemberOffsets, ArchitectureName); Error Err; for (auto &C : A->children(Err)) { Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(); |

