diff --git a/include/llvm/Object/MachOUniversal.h b/include/llvm/Object/MachOUniversal.h index 74448f973b2..94fe99deec5 100644 --- a/include/llvm/Object/MachOUniversal.h +++ b/include/llvm/Object/MachOUniversal.h @@ -57,7 +57,7 @@ public: return Triple::getArchTypeName(MachOObjectFile::getArch(Header.cputype)); } - std::error_code getAsObjectFile(std::unique_ptr &Result) const; + ErrorOr> getAsObjectFile() const; std::error_code getAsArchive(std::unique_ptr &Result) const; }; @@ -100,8 +100,8 @@ public: return V->isMachOUniversalBinary(); } - std::error_code getObjectForArch(Triple::ArchType Arch, - std::unique_ptr &Result) const; + ErrorOr> + getObjectForArch(Triple::ArchType Arch) const; }; } diff --git a/lib/Object/MachOUniversal.cpp b/lib/Object/MachOUniversal.cpp index 887e2bd0a34..1f867046eba 100644 --- a/lib/Object/MachOUniversal.cpp +++ b/lib/Object/MachOUniversal.cpp @@ -67,19 +67,15 @@ MachOUniversalBinary::ObjectForArch::ObjectForArch( } } -std::error_code MachOUniversalBinary::ObjectForArch::getAsObjectFile( - std::unique_ptr &Result) const { +ErrorOr> +MachOUniversalBinary::ObjectForArch::getAsObjectFile() const { if (Parent) { StringRef ParentData = Parent->getData(); StringRef ObjectData = ParentData.substr(Header.offset, Header.size); std::string ObjectName = Parent->getFileName().str(); MemoryBuffer *ObjBuffer = MemoryBuffer::getMemBuffer( ObjectData, ObjectName, false); - ErrorOr Obj = ObjectFile::createMachOObjectFile(ObjBuffer); - if (std::error_code EC = Obj.getError()) - return EC; - Result.reset(Obj.get()); - return object_error::success; + return ObjectFile::createMachOObjectFile(ObjBuffer); } return object_error::parse_failed; } @@ -145,14 +141,14 @@ static bool getCTMForArch(Triple::ArchType Arch, MachO::CPUType &CTM) { } } -std::error_code MachOUniversalBinary::getObjectForArch( - Triple::ArchType Arch, std::unique_ptr &Result) const { +ErrorOr> +MachOUniversalBinary::getObjectForArch(Triple::ArchType Arch) const { MachO::CPUType CTM; if (!getCTMForArch(Arch, CTM)) return object_error::arch_not_found; for (object_iterator I = begin_objects(), E = end_objects(); I != E; ++I) { if (I->getCPUType() == static_cast(CTM)) - return I->getAsObjectFile(Result); + return I->getAsObjectFile(); } return object_error::arch_not_found; } diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index f706bcdc2b3..aeb7ba10724 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -773,9 +773,10 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { for (MachOUniversalBinary::object_iterator I = UB->begin_objects(), E = UB->end_objects(); I != E; ++I) { - std::unique_ptr Obj; + ErrorOr> ObjOrErr = I->getAsObjectFile(); std::unique_ptr A; - if (!I->getAsObjectFile(Obj)) { + if (ObjOrErr) { + std::unique_ptr Obj = std::move(ObjOrErr.get()); if (moreThanOneArch) outs() << "\n"; outs() << Obj->getFileName(); diff --git a/tools/llvm-size/llvm-size.cpp b/tools/llvm-size/llvm-size.cpp index b71380dcaa4..48614d8176b 100644 --- a/tools/llvm-size/llvm-size.cpp +++ b/tools/llvm-size/llvm-size.cpp @@ -466,9 +466,9 @@ static void PrintFileSectionSizes(StringRef file) { for (MachOUniversalBinary::object_iterator I = UB->begin_objects(), E = UB->end_objects(); I != E; ++I) { - std::unique_ptr UO; + ErrorOr> UO = I->getAsObjectFile(); std::unique_ptr UA; - if (!I->getAsObjectFile(UO)) { + if (UO) { if (ObjectFile *o = dyn_cast(&*UO.get())) { MachOObjectFile *MachO = dyn_cast(o); if (OutputFormat == sysv) diff --git a/tools/llvm-symbolizer/LLVMSymbolize.cpp b/tools/llvm-symbolizer/LLVMSymbolize.cpp index dd9ffc1fb8e..ebbae39a57a 100644 --- a/tools/llvm-symbolizer/LLVMSymbolize.cpp +++ b/tools/llvm-symbolizer/LLVMSymbolize.cpp @@ -349,10 +349,11 @@ LLVMSymbolizer::getObjectFileFromBinary(Binary *Bin, const std::string &ArchName std::make_pair(UB, ArchName)); if (I != ObjectFileForArch.end()) return I->second; - std::unique_ptr ParsedObj; - if (!UB->getObjectForArch(Triple(ArchName).getArch(), ParsedObj)) { - Res = ParsedObj.get(); - ParsedBinariesAndObjects.push_back(std::move(ParsedObj)); + ErrorOr> ParsedObj = + UB->getObjectForArch(Triple(ArchName).getArch()); + if (ParsedObj) { + Res = ParsedObj.get().get(); + ParsedBinariesAndObjects.push_back(std::move(ParsedObj.get())); } ObjectFileForArch[std::make_pair(UB, ArchName)] = Res; } else if (Bin->isObject()) {