diff options
author | Kevin Enderby <enderby@apple.com> | 2016-06-27 21:39:39 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2016-06-27 21:39:39 +0000 |
commit | 054620884ae562e844ed0a411c0e5d36efed0da0 (patch) | |
tree | d9df4c86a7d00282d81ffae3fa3cc2824a044cda /lib/Object/MachOUniversal.cpp | |
parent | aac123825eb12a40393679bf9ed9c3e3106f2640 (diff) |
Change all but the last ErrorOr<...> use for MachOUniversalBinary to Expected<...> to
allow a good error message to be produced.
I added the one test case that the object file tools could produce an error
message. The other two errors can’t be triggered if the input file is passed
through sys::fs::identify_magic(). But the malformedError("bad magic number")
does get triggered by the logic in llvm-dsymutil when dealing with a normal
Mach-O file. The other "File too small ..." error would take a logic error
currently to produce and is not tested for.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273946 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Object/MachOUniversal.cpp')
-rw-r--r-- | lib/Object/MachOUniversal.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/Object/MachOUniversal.cpp b/lib/Object/MachOUniversal.cpp index b3b0c251c10..e6880587cde 100644 --- a/lib/Object/MachOUniversal.cpp +++ b/lib/Object/MachOUniversal.cpp @@ -22,6 +22,13 @@ using namespace llvm; using namespace object; +static Error +malformedError(Twine Msg) { + std::string StringMsg = "truncated or malformed fat file (" + Msg.str() + ")"; + return make_error<GenericBinaryError>(std::move(StringMsg), + object_error::parse_failed); +} + template<typename T> static T getUniversalBinaryStruct(const char *Ptr) { T Res; @@ -92,22 +99,24 @@ MachOUniversalBinary::ObjectForArch::getAsArchive() const { void MachOUniversalBinary::anchor() { } -ErrorOr<std::unique_ptr<MachOUniversalBinary>> +Expected<std::unique_ptr<MachOUniversalBinary>> MachOUniversalBinary::create(MemoryBufferRef Source) { - std::error_code EC; + Error Err; std::unique_ptr<MachOUniversalBinary> Ret( - new MachOUniversalBinary(Source, EC)); - if (EC) - return EC; + new MachOUniversalBinary(Source, Err)); + if (Err) + return std::move(Err); return std::move(Ret); } -MachOUniversalBinary::MachOUniversalBinary(MemoryBufferRef Source, - std::error_code &ec) +MachOUniversalBinary::MachOUniversalBinary(MemoryBufferRef Source, Error &Err) : Binary(Binary::ID_MachOUniversalBinary, Source), Magic(0), NumberOfObjects(0) { + ErrorAsOutParameter ErrAsOutParam(Err); if (Data.getBufferSize() < sizeof(MachO::fat_header)) { - ec = object_error::invalid_file_type; + Err = make_error<GenericBinaryError>("File too small to be a Mach-O " + "universal file", + object_error::invalid_file_type); return; } // Check for magic value and sufficient header size. @@ -121,14 +130,16 @@ MachOUniversalBinary::MachOUniversalBinary(MemoryBufferRef Source, else if (Magic == MachO::FAT_MAGIC_64) MinSize += sizeof(MachO::fat_arch_64) * NumberOfObjects; else { - ec = object_error::parse_failed; + Err = malformedError("bad magic number"); return; } if (Buf.size() < MinSize) { - ec = object_error::parse_failed; + Err = malformedError("fat_arch" + + Twine(Magic == MachO::FAT_MAGIC ? "" : "_64") + + " structs would extend past the end of the file"); return; } - ec = std::error_code(); + Err = Error::success(); } Expected<std::unique_ptr<MachOObjectFile>> |