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/lib/Object/MachOUniversal.cpp | |
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/lib/Object/MachOUniversal.cpp')
-rw-r--r-- | llvm/lib/Object/MachOUniversal.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/llvm/lib/Object/MachOUniversal.cpp b/llvm/lib/Object/MachOUniversal.cpp index e6880587cde..5c8501010c4 100644 --- a/llvm/lib/Object/MachOUniversal.cpp +++ b/llvm/lib/Object/MachOUniversal.cpp @@ -68,7 +68,8 @@ MachOUniversalBinary::ObjectForArch::ObjectForArch( Expected<std::unique_ptr<MachOObjectFile>> MachOUniversalBinary::ObjectForArch::getAsObjectFile() const { if (!Parent) - return errorCodeToError(object_error::parse_failed); + report_fatal_error("MachOUniversalBinary::ObjectForArch::getAsObjectFile() " + "called when Parent is a nullptr"); StringRef ParentData = Parent->getData(); StringRef ObjectData; @@ -81,10 +82,11 @@ MachOUniversalBinary::ObjectForArch::getAsObjectFile() const { return ObjectFile::createMachOObjectFile(ObjBuffer); } -ErrorOr<std::unique_ptr<Archive>> +Expected<std::unique_ptr<Archive>> MachOUniversalBinary::ObjectForArch::getAsArchive() const { if (!Parent) - return object_error::parse_failed; + report_fatal_error("MachOUniversalBinary::ObjectForArch::getAsArchive() " + "called when Parent is a nullptr"); StringRef ParentData = Parent->getData(); StringRef ObjectData; @@ -94,7 +96,7 @@ MachOUniversalBinary::ObjectForArch::getAsArchive() const { ObjectData = ParentData.substr(Header64.offset, Header64.size); StringRef ObjectName = Parent->getFileName(); MemoryBufferRef ObjBuffer(ObjectData, ObjectName); - return Archive::create(ObjBuffer); + return errorOrToExpected(Archive::create(ObjBuffer)); } void MachOUniversalBinary::anchor() { } @@ -145,11 +147,15 @@ MachOUniversalBinary::MachOUniversalBinary(MemoryBufferRef Source, Error &Err) Expected<std::unique_ptr<MachOObjectFile>> MachOUniversalBinary::getObjectForArch(StringRef ArchName) const { if (Triple(ArchName).getArch() == Triple::ArchType::UnknownArch) - return errorCodeToError(object_error::arch_not_found); + return make_error<GenericBinaryError>(std::move("Unknown architecture " + "named: " + ArchName), + object_error::arch_not_found); for (object_iterator I = begin_objects(), E = end_objects(); I != E; ++I) { if (I->getArchTypeName() == ArchName) return I->getAsObjectFile(); } - return errorCodeToError(object_error::arch_not_found); + return make_error<GenericBinaryError>(std::move("fat file does not " + "contain " + ArchName), + object_error::arch_not_found); } |