summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/MachOObjectFile.cpp
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2016-03-25 21:59:14 +0000
committerLang Hames <lhames@gmail.com>2016-03-25 21:59:14 +0000
commit82627648692657751d762e702f78a7901725cd24 (patch)
tree2282f49c42f86473b84dc8ba851bf8662a17aef2 /llvm/lib/Object/MachOObjectFile.cpp
parent3c110dd6b40dff4e46b391878112a874e03f12a6 (diff)
downloadbcm5719-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.cpp55
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;
}
OpenPOWER on IntegriCloud