diff options
author | Kevin Enderby <enderby@apple.com> | 2016-06-28 23:16:13 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2016-06-28 23:16:13 +0000 |
commit | 42398051d8fb6fed821703280b1da4bc0694ceea (patch) | |
tree | 4c5ba4d9ec19e6b14129eeb31f620f68ed612f0b /llvm/tools/llvm-objdump | |
parent | 9c12639370c43d58d43f9a5a87128f1da5c93a1c (diff) | |
download | bcm5719-llvm-42398051d8fb6fed821703280b1da4bc0694ceea.tar.gz bcm5719-llvm-42398051d8fb6fed821703280b1da4bc0694ceea.zip |
Finish cleaning up most of the error handling in libObject’s MachOUniversalBinary
and its clients to use the new llvm::Error model for error handling.
Changed getAsArchive() from ErrorOr<...> to Expected<...> so now all
interfaces there use the new llvm::Error model for return values.
In the two places it had if (!Parent) this is actually a program error so changed
from returning errorCodeToError(object_error::parse_failed) to calling
report_fatal_error() with a message.
In getObjectForArch() added error messages to its two llvm::Error return values
instead of returning errorCodeToError(object_error::arch_not_found) with no
error message.
For the llvm-obdump, llvm-nm and llvm-size clients since the only binary files in
Mach-O Universal Binaries that are supported are Mach-O files or archives with
Mach-O objects, updated their logic to generate an error when a slice contains
something like an ELF binary instead of ignoring it. And added a test case for
that.
The last error stuff to be cleaned up for libObject’s MachOUniversalBinary is
the use of errorOrToExpected(Archive::create(ObjBuffer)) which needs
Archive::create() to be changed from ErrorOr<...> to Expected<...> first,
which I’ll work on next.
llvm-svn: 274079
Diffstat (limited to 'llvm/tools/llvm-objdump')
-rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 22 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 6 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.h | 1 |
3 files changed, 26 insertions, 3 deletions
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index b92599a02f8..82e7f8a258b 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -1621,7 +1621,7 @@ void llvm::ParseInputMachO(StringRef Filename) { report_error(Filename, StringRef(), std::move(E), ArchitectureName); continue; - } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = + } else if (Expected<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) { std::unique_ptr<Archive> &A = *AOrErr; outs() << "Archive : " << Filename; @@ -1646,6 +1646,11 @@ void llvm::ParseInputMachO(StringRef Filename) { dyn_cast<MachOObjectFile>(&*ChildOrErr.get())) ProcessMachO(Filename, O, O->getFileName(), ArchitectureName); } + } else { + consumeError(AOrErr.takeError()); + error("Mach-O universal file: " + Filename + " for " + + "architecture " + StringRef(I->getArchTypeName()) + + " is not a Mach-O file or an archive file"); } } } @@ -1676,7 +1681,7 @@ void llvm::ParseInputMachO(StringRef Filename) { ObjOrErr.takeError())) { report_error(Filename, std::move(E)); continue; - } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = + } else if (Expected<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) { std::unique_ptr<Archive> &A = *AOrErr; outs() << "Archive : " << Filename << "\n"; @@ -1698,6 +1703,11 @@ void llvm::ParseInputMachO(StringRef Filename) { dyn_cast<MachOObjectFile>(&*ChildOrErr.get())) ProcessMachO(Filename, O, O->getFileName()); } + } else { + consumeError(AOrErr.takeError()); + error("Mach-O universal file: " + Filename + " for architecture " + + StringRef(I->getArchTypeName()) + + " is not a Mach-O file or an archive file"); } return; } @@ -1721,7 +1731,8 @@ void llvm::ParseInputMachO(StringRef Filename) { ObjOrErr.takeError())) { report_error(StringRef(), Filename, std::move(E), ArchitectureName); continue; - } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) { + } else if (Expected<std::unique_ptr<Archive>> AOrErr = + I->getAsArchive()) { std::unique_ptr<Archive> &A = *AOrErr; outs() << "Archive : " << Filename; if (!ArchitectureName.empty()) @@ -1747,6 +1758,11 @@ void llvm::ParseInputMachO(StringRef Filename) { ArchitectureName); } } + } else { + consumeError(AOrErr.takeError()); + error("Mach-O universal file: " + Filename + " for architecture " + + StringRef(I->getArchTypeName()) + + " is not a Mach-O file or an archive file"); } } return; diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 3c536af5713..bb171ec3fc3 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -264,6 +264,12 @@ void llvm::error(std::error_code EC) { exit(1); } +LLVM_ATTRIBUTE_NORETURN void llvm::error(Twine Message) { + errs() << ToolName << ": " << Message << ".\n"; + errs().flush(); + exit(1); +} + LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef File, std::error_code EC) { assert(EC); diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 439018963cb..5b10ee87ca8 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -88,6 +88,7 @@ void PrintSectionHeaders(const object::ObjectFile *o); void PrintSectionContents(const object::ObjectFile *o); void PrintSymbolTable(const object::ObjectFile *o, StringRef ArchiveName, StringRef ArchitectureName = StringRef()); +LLVM_ATTRIBUTE_NORETURN void error(Twine Message); LLVM_ATTRIBUTE_NORETURN void report_error(StringRef File, std::error_code EC); LLVM_ATTRIBUTE_NORETURN void report_error(StringRef File, llvm::Error E); LLVM_ATTRIBUTE_NORETURN void report_error(StringRef FileName, |