diff options
author | Lang Hames <lhames@gmail.com> | 2016-03-25 21:59:14 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2016-03-25 21:59:14 +0000 |
commit | 82627648692657751d762e702f78a7901725cd24 (patch) | |
tree | 2282f49c42f86473b84dc8ba851bf8662a17aef2 /llvm/lib/Object/MachOObjectFile.cpp | |
parent | 3c110dd6b40dff4e46b391878112a874e03f12a6 (diff) | |
download | bcm5719-llvm-82627648692657751d762e702f78a7901725cd24.tar.gz bcm5719-llvm-82627648692657751d762e702f78a7901725cd24.zip |
[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<std::unique_ptr<MachOObjectFile>>.
llvm-svn: 264469
Diffstat (limited to 'llvm/lib/Object/MachOObjectFile.cpp')
-rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 55 |
1 files changed, 26 insertions, 29 deletions
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; } |