From 82627648692657751d762e702f78a7901725cd24 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Fri, 25 Mar 2016 21:59:14 +0000 Subject: [PATCH] [Object] Make MachOObjectFile's constructor private, provide a static create method instead. This is not quite a named constructor: Construction may fail, and MachOObjectFiles are usually passed by unique_ptr anyway, so create returns an Expected>. llvm-svn: 264469 --- llvm/include/llvm/Object/MachO.h | 8 ++++-- 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 e5fdcc9..24c0ffe 100644 --- a/llvm/include/llvm/Object/MachO.h +++ b/llvm/include/llvm/Object/MachO.h @@ -193,8 +193,8 @@ public: typedef SmallVector LoadCommandList; typedef LoadCommandList::const_iterator load_command_iterator; - MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian, bool Is64Bits, - Error &Err); + static Expected> + 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 26aa516..50f0dd3 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -243,6 +243,18 @@ static Error parseSegmentLoadCommand( return Error::success(); } +Expected> +MachOObjectFile::create(MemoryBufferRef Object, bool IsLittleEndian, + bool Is64Bits) { + Error Err = Error::errorForOutParameter(); + std::unique_ptr 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> ObjectFile::createMachOObjectFile(MemoryBufferRef Buffer) { StringRef Magic = Buffer.getBuffer().slice(0, 4); - std::unique_ptr 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; } -- 2.7.4