diff options
-rw-r--r-- | llvm/include/llvm/Object/MachO.h | 8 | ||||
-rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 55 |
2 files changed, 32 insertions, 31 deletions
diff --git a/llvm/include/llvm/Object/MachO.h b/llvm/include/llvm/Object/MachO.h index e5fdcc99538..24c0ffe56c0 100644 --- a/llvm/include/llvm/Object/MachO.h +++ b/llvm/include/llvm/Object/MachO.h @@ -193,8 +193,8 @@ public: typedef SmallVector<LoadCommandInfo, 4> LoadCommandList; typedef LoadCommandList::const_iterator load_command_iterator; - MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian, bool Is64Bits, - Error &Err); + static Expected<std::unique_ptr<MachOObjectFile>> + create(MemoryBufferRef Object, bool IsLittleEndian, bool Is64Bits); void moveSymbolNext(DataRefImpl &Symb) const override; @@ -442,6 +442,10 @@ public: } private: + + MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian, bool Is64Bits, + Error &Err); + uint64_t getSymbolValueImpl(DataRefImpl Symb) const override; union { diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 26aa5164710..50f0dd3dc4e 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -243,6 +243,18 @@ static Error parseSegmentLoadCommand( return Error::success(); } +Expected<std::unique_ptr<MachOObjectFile>> +MachOObjectFile::create(MemoryBufferRef Object, bool IsLittleEndian, + bool Is64Bits) { + Error Err = Error::errorForOutParameter(); + std::unique_ptr<MachOObjectFile> Obj( + new MachOObjectFile(std::move(Object), IsLittleEndian, + Is64Bits, Err)); + if (Err) + return std::move(Err); + return std::move(Obj); +} + MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian, bool Is64bits, Error &Err) : ObjectFile(getMachOType(IsLittleEndian, Is64bits), Object), @@ -251,10 +263,6 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian, DyldInfoLoadCmd(nullptr), UuidLoadCmd(nullptr), HasPageZeroSegment(false) { - // We have to check Err before it's assigned to. - if (Err) - llvm_unreachable("Err should be in success state at entry to constructor."); - if (is64Bit()) parseHeader(this, Header64, Err); else @@ -2416,29 +2424,18 @@ bool MachOObjectFile::isRelocatableObject() const { ErrorOr<std::unique_ptr<MachOObjectFile>> ObjectFile::createMachOObjectFile(MemoryBufferRef Buffer) { StringRef Magic = Buffer.getBuffer().slice(0, 4); - std::unique_ptr<MachOObjectFile> Ret; - if (Magic == "\xFE\xED\xFA\xCE") { - Error Err; - Ret.reset(new MachOObjectFile(Buffer, false, false, Err)); - if (Err) - return errorToErrorCode(std::move(Err)); - } else if (Magic == "\xCE\xFA\xED\xFE") { - Error Err; - Ret.reset(new MachOObjectFile(Buffer, true, false, Err)); - if (Err) - return errorToErrorCode(std::move(Err)); - } else if (Magic == "\xFE\xED\xFA\xCF") { - Error Err; - Ret.reset(new MachOObjectFile(Buffer, false, true, Err)); - if (Err) - return errorToErrorCode(std::move(Err)); - } else if (Magic == "\xCF\xFA\xED\xFE") { - Error Err; - Ret.reset(new MachOObjectFile(Buffer, true, true, Err)); - if (Err) - return errorToErrorCode(std::move(Err)); - } else - return object_error::parse_failed; - - return std::move(Ret); + if (Magic == "\xFE\xED\xFA\xCE") + return expectedToErrorOr( + MachOObjectFile::create(Buffer, false, false)); + else if (Magic == "\xCE\xFA\xED\xFE") + return expectedToErrorOr( + MachOObjectFile::create(Buffer, true, false)); + else if (Magic == "\xFE\xED\xFA\xCF") + return expectedToErrorOr( + MachOObjectFile::create(Buffer, false, true)); + else if (Magic == "\xCF\xFA\xED\xFE") + return expectedToErrorOr( + MachOObjectFile::create(Buffer, true, true)); + //else + return object_error::parse_failed; } |