From da785374d9d0cbea3b912f3523a3dd92f97959d9 Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Wed, 21 Oct 2015 17:13:20 +0000 Subject: [PATCH] Backing out commit r250906 as it broke lld. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250908 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/Archive.h | 38 ++--- include/llvm/Support/ErrorOr.h | 18 --- lib/ExecutionEngine/MCJIT/MCJIT.cpp | 4 +- lib/ExecutionEngine/Orc/OrcMCJITReplacement.h | 4 +- lib/Object/Archive.cpp | 144 +++++------------- lib/Object/ArchiveWriter.cpp | 17 +-- .../Inputs/malformed-archives/libbogus1.a | 13 -- .../Inputs/malformed-archives/libbogus2.a | 13 -- .../Inputs/malformed-archives/libbogus3.a | 16 -- .../llvm-objdump/malformed-archives.test | 20 --- tools/dsymutil/BinaryHolder.cpp | 5 +- tools/llvm-ar/llvm-ar.cpp | 32 +--- tools/llvm-cxxdump/llvm-cxxdump.cpp | 7 +- tools/llvm-nm/llvm-nm.cpp | 27 +--- tools/llvm-objdump/MachODump.cpp | 37 ++--- tools/llvm-objdump/llvm-objdump.cpp | 7 +- tools/llvm-readobj/llvm-readobj.cpp | 7 +- tools/llvm-size/llvm-size.cpp | 32 +--- 18 files changed, 92 insertions(+), 349 deletions(-) delete mode 100644 test/tools/llvm-objdump/Inputs/malformed-archives/libbogus1.a delete mode 100644 test/tools/llvm-objdump/Inputs/malformed-archives/libbogus2.a delete mode 100644 test/tools/llvm-objdump/Inputs/malformed-archives/libbogus3.a delete mode 100644 test/tools/llvm-objdump/malformed-archives.test diff --git a/include/llvm/Object/Archive.h b/include/llvm/Object/Archive.h index 356393cce2d..32c72a0cc3d 100644 --- a/include/llvm/Object/Archive.h +++ b/include/llvm/Object/Archive.h @@ -65,10 +65,7 @@ public: bool isThinMember() const; public: - Child(const Archive *Parent, const char *Start, - std::error_code *EC); - static ErrorOr> create(const Archive *Parent, - const char *Start); + Child(const Archive *Parent, const char *Start); bool operator ==(const Child &other) const { assert(Parent == other.Parent); @@ -80,7 +77,7 @@ public: } const Archive *getParent() const { return Parent; } - ErrorOr getNext() const; + Child getNext() const; ErrorOr getName() const; StringRef getRawName() const { return getHeader()->getName(); } @@ -96,9 +93,9 @@ public: return getHeader()->getAccessMode(); } /// \return the size of the archive member without the header or padding. - ErrorOr getSize() const; + uint64_t getSize() const; /// \return the size in the archive header for this member. - ErrorOr getRawSize() const; + uint64_t getRawSize() const; ErrorOr getBuffer() const; uint64_t getChildOffset() const; @@ -110,35 +107,28 @@ public: }; class child_iterator { - ErrorOr child; + Child child; public: - child_iterator() : child(Child(nullptr, nullptr, nullptr)) {} + child_iterator() : child(Child(nullptr, nullptr)) {} child_iterator(const Child &c) : child(c) {} - child_iterator(std::error_code EC) : child(EC) {} - const ErrorOr *operator->() const { return &child; } - const ErrorOr &operator*() const { return child; } + const Child *operator->() const { return &child; } + const Child &operator*() const { return child; } bool operator==(const child_iterator &other) const { - if ((*this)->getError()) - return false; - if (other->getError()) - return false; - return (*this)->get() == other->get(); + return child == other.child; } bool operator!=(const child_iterator &other) const { return !(*this == other); } - // No operator< as we can't do less than compares with iterators that - // contain errors. + bool operator<(const child_iterator &other) const { + return child < other.child; + } - // Code in loops with child_iterators must check for errors on each loop - // iteration. And if there is an error break out of the loop. child_iterator &operator++() { // Preincrement - assert(child && "Can't increment iterator with error"); - child = child->getNext(); + child = child.getNext(); return *this; } }; @@ -222,7 +212,7 @@ public: StringRef getSymbolTable() const { // We know that the symbol table is not an external file, // so we just assert there is no error. - return *(*SymbolTable)->getBuffer(); + return *SymbolTable->getBuffer(); } uint32_t getNumberOfSymbols() const; diff --git a/include/llvm/Support/ErrorOr.h b/include/llvm/Support/ErrorOr.h index 5021468b4da..46b61921775 100644 --- a/include/llvm/Support/ErrorOr.h +++ b/include/llvm/Support/ErrorOr.h @@ -91,7 +91,6 @@ private: typedef typename std::remove_reference::type &reference; typedef const typename std::remove_reference::type &const_reference; typedef typename std::remove_reference::type *pointer; - typedef const typename std::remove_reference::type *const_pointer; public: template @@ -184,18 +183,10 @@ public: return toPointer(getStorage()); } - const_pointer operator ->() const { - return toPointer(getStorage()); - } - reference operator *() { return *getStorage(); } - const_reference operator *() const { - return *getStorage(); - } - private: template void copyConstruct(const ErrorOr &Other) { @@ -255,19 +246,10 @@ private: return Val; } - const_pointer toPointer(const_pointer Val) const { - return Val; - } - pointer toPointer(wrap *Val) { return &Val->get(); } - const_pointer toPointer(const wrap *Val) const { - return &Val->get(); - } - - storage_type *getStorage() { assert(!HasError && "Cannot get value when an error exists!"); return reinterpret_cast(TStorage.buffer); diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/lib/ExecutionEngine/MCJIT/MCJIT.cpp index a7238e4ebc3..bbe4432d36b 100644 --- a/lib/ExecutionEngine/MCJIT/MCJIT.cpp +++ b/lib/ExecutionEngine/MCJIT/MCJIT.cpp @@ -318,10 +318,10 @@ RuntimeDyld::SymbolInfo MCJIT::findSymbol(const std::string &Name, object::Archive *A = OB.getBinary(); // Look for our symbols in each Archive object::Archive::child_iterator ChildIt = A->findSym(Name); - if (*ChildIt && ChildIt != A->child_end()) { + if (ChildIt != A->child_end()) { // FIXME: Support nested archives? ErrorOr> ChildBinOrErr = - (*ChildIt)->getAsBinary(); + ChildIt->getAsBinary(); if (ChildBinOrErr.getError()) continue; std::unique_ptr &ChildBin = ChildBinOrErr.get(); diff --git a/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h b/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h index e52df2db79f..951993f75e4 100644 --- a/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h +++ b/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h @@ -253,10 +253,10 @@ private: object::Archive *A = OB.getBinary(); // Look for our symbols in each Archive object::Archive::child_iterator ChildIt = A->findSym(Name); - if (*ChildIt && ChildIt != A->child_end()) { + if (ChildIt != A->child_end()) { // FIXME: Support nested archives? ErrorOr> ChildBinOrErr = - (*ChildIt)->getAsBinary(); + ChildIt->getAsBinary(); if (ChildBinOrErr.getError()) continue; std::unique_ptr &ChildBin = ChildBinOrErr.get(); diff --git a/lib/Object/Archive.cpp b/lib/Object/Archive.cpp index 1cc3c48c6c3..667732baa27 100644 --- a/lib/Object/Archive.cpp +++ b/lib/Object/Archive.cpp @@ -46,7 +46,7 @@ StringRef ArchiveMemberHeader::getName() const { ErrorOr ArchiveMemberHeader::getSize() const { uint32_t Ret; if (llvm::StringRef(Size, sizeof(Size)).rtrim(" ").getAsInteger(10, Ret)) - return object_error::parse_failed; // Size is not a decimal number. + return object_error::parse_failed; return Ret; } @@ -82,8 +82,7 @@ unsigned ArchiveMemberHeader::getGID() const { return Ret; } -Archive::Child::Child(const Archive *Parent, const char *Start, - std::error_code *EC) +Archive::Child::Child(const Archive *Parent, const char *Start) : Parent(Parent) { if (!Start) return; @@ -91,13 +90,7 @@ Archive::Child::Child(const Archive *Parent, const char *Start, uint64_t Size = sizeof(ArchiveMemberHeader); Data = StringRef(Start, Size); if (!isThinMember()) { - ErrorOr MemberSize = getRawSize(); - if (MemberSize.getError()) { - assert (EC && "Error must be caught"); - *EC = MemberSize.getError(); - return; - } - Size += MemberSize.get(); + Size += getRawSize(); Data = StringRef(Start, Size); } @@ -107,38 +100,26 @@ Archive::Child::Child(const Archive *Parent, const char *Start, StringRef Name = getRawName(); if (Name.startswith("#1/")) { uint64_t NameSize; - if (Name.substr(3).rtrim(" ").getAsInteger(10, NameSize)) { - if (EC) - *EC = object_error::parse_failed; // Long name offset is not an integer. - return; - } + if (Name.substr(3).rtrim(" ").getAsInteger(10, NameSize)) + llvm_unreachable("Long name length is not an integer"); StartOfFile += NameSize; } } -ErrorOr> Archive::Child::create( - const Archive *Parent, const char *Start) { - std::error_code EC; - std::unique_ptr Ret(new Archive::Child(Parent, Start, &EC)); - if (EC) - return EC; - return std::move(Ret); -} - -ErrorOr Archive::Child::getSize() const { +uint64_t Archive::Child::getSize() const { if (Parent->IsThin) { ErrorOr Size = getHeader()->getSize(); - if (std::error_code EC = Size.getError()) - return EC; + if (Size.getError()) + return 0; return Size.get(); } return Data.size() - StartOfFile; } -ErrorOr Archive::Child::getRawSize() const { +uint64_t Archive::Child::getRawSize() const { ErrorOr Size = getHeader()->getSize(); - if (std::error_code EC = Size.getError()) - return EC; + if (Size.getError()) + return 0; return Size.get(); } @@ -148,12 +129,8 @@ bool Archive::Child::isThinMember() const { } ErrorOr Archive::Child::getBuffer() const { - if (!isThinMember()) { - ErrorOr Size = getSize(); - if (std::error_code EC = Size.getError()) - return EC; - return StringRef(Data.data() + StartOfFile, Size.get()); - } + if (!isThinMember()) + return StringRef(Data.data() + StartOfFile, getSize()); ErrorOr Name = getName(); if (std::error_code EC = Name.getError()) return EC; @@ -167,28 +144,19 @@ ErrorOr Archive::Child::getBuffer() const { return Parent->ThinBuffers.back()->getBuffer(); } -ErrorOr Archive::Child::getNext() const { +Archive::Child Archive::Child::getNext() const { size_t SpaceToSkip = Data.size(); // If it's odd, add 1 to make it even. - size_t Pad = 0; if (SpaceToSkip & 1) - Pad++; + ++SpaceToSkip; - const char *NextLoc = Data.data() + SpaceToSkip + Pad; - - // Check to see if this is at the end of the archive. - if (NextLoc == Parent->Data.getBufferEnd() || - NextLoc == Parent->Data.getBufferEnd() - Pad ) - return Child(Parent, nullptr, nullptr); + const char *NextLoc = Data.data() + SpaceToSkip; // Check to see if this is past the end of the archive. - if (NextLoc > Parent->Data.getBufferEnd()) - return object_error::parse_failed; + if (NextLoc >= Parent->Data.getBufferEnd()) + return Child(Parent, nullptr); - auto ChildOrErr = Child::create(Parent, NextLoc); - if (std::error_code EC = ChildOrErr.getError()) - return EC; - return std::move(*ChildOrErr.get()); + return Child(Parent, NextLoc); } uint64_t Archive::Child::getChildOffset() const { @@ -210,23 +178,17 @@ ErrorOr Archive::Child::getName() const { // Get the offset. std::size_t offset; if (name.substr(1).rtrim(" ").getAsInteger(10, offset)) - return object_error::parse_failed; // Long name offset is not an integer. - // Check for bad stringtable iterator. - if (std::error_code EC = Parent->StringTable->getError()) - return EC; - const char *addr = (*Parent->StringTable)->Data.begin() + llvm_unreachable("Long name offset is not an integer"); + const char *addr = Parent->StringTable->Data.begin() + sizeof(ArchiveMemberHeader) + offset; // Verify it. - auto Size = (*Parent->StringTable)->getSize(); - if (std::error_code EC = Size.getError()) - return EC; if (Parent->StringTable == Parent->child_end() - || addr < ((*Parent->StringTable)->Data.begin() + || addr < (Parent->StringTable->Data.begin() + sizeof(ArchiveMemberHeader)) - || addr > ((*Parent->StringTable)->Data.begin() + || addr > (Parent->StringTable->Data.begin() + sizeof(ArchiveMemberHeader) - + Size.get())) + + Parent->StringTable->getSize())) return object_error::parse_failed; // GNU long file names end with a "/\n". @@ -238,7 +200,7 @@ ErrorOr Archive::Child::getName() const { } else if (name.startswith("#1/")) { uint64_t name_size; if (name.substr(3).rtrim(" ").getAsInteger(10, name_size)) - return object_error::parse_failed; // Long name offset is not an integer. + llvm_unreachable("Long name length is not an ingeter"); return Data.substr(sizeof(ArchiveMemberHeader), name_size) .rtrim(StringRef("\0", 1)); } @@ -294,12 +256,12 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) child_iterator i = child_begin(false); child_iterator e = child_end(); - if (!*i || i == e) { - ec = i->getError(); + if (i == e) { + ec = std::error_code(); return; } - StringRef Name = (*i)->getRawName(); + StringRef Name = i->getRawName(); // Below is the pattern that is used to figure out the archive format // GNU archive format @@ -324,11 +286,6 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) Format = K_BSD; SymbolTable = i; ++i; - if (!*i) { - ec = i->getError(); - return; - } - FirstRegular = i; ec = std::error_code(); return; @@ -337,7 +294,7 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) if (Name.startswith("#1/")) { Format = K_BSD; // We know this is BSD, so getName will work since there is no string table. - ErrorOr NameOrErr = (*i)->getName(); + ErrorOr NameOrErr = i->getName(); ec = NameOrErr.getError(); if (ec) return; @@ -345,10 +302,6 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) if (Name == "__.SYMDEF SORTED" || Name == "__.SYMDEF") { SymbolTable = i; ++i; - if (!*i) { - ec = i->getError(); - return; - } } FirstRegular = i; return; @@ -366,21 +319,17 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) has64SymTable = true; ++i; - if (!*i || i == e) { - ec = i->getError(); + if (i == e) { + ec = std::error_code(); return; } - Name = (*i)->getRawName(); + Name = i->getRawName(); } if (Name == "//") { Format = has64SymTable ? K_MIPS64 : K_GNU; StringTable = i; ++i; - if (!*i) { - ec = i->getError(); - return; - } FirstRegular = i; ec = std::error_code(); return; @@ -402,25 +351,17 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) SymbolTable = i; ++i; - if (!*i) { - ec = i->getError(); - return; - } if (i == e) { FirstRegular = i; ec = std::error_code(); return; } - Name = (*i)->getRawName(); + Name = i->getRawName(); if (Name == "//") { StringTable = i; ++i; - if (!*i) { - ec = i->getError(); - return; - } } FirstRegular = i; @@ -435,20 +376,12 @@ Archive::child_iterator Archive::child_begin(bool SkipInternal) const { return FirstRegular; const char *Loc = Data.getBufferStart() + strlen(Magic); - auto ChildOrErr = Child::create(this, Loc); - if (std::error_code EC = ChildOrErr.getError()) - return child_iterator(EC); - Child c = *(ChildOrErr.get()); - return child_iterator(c); + Child c(this, Loc); + return c; } Archive::child_iterator Archive::child_end() const { - // This with a second argument of nullptr can't return an Error. - auto ChildOrErr = Child::create(this, nullptr); - if (ChildOrErr.getError()) - llvm_unreachable("Can't create Archive::child_end()."); - Child c = *(ChildOrErr.get()); - return child_iterator(c); + return Child(this, nullptr); } StringRef Archive::Symbol::getName() const { @@ -500,10 +433,7 @@ ErrorOr Archive::Symbol::getMember() const { } const char *Loc = Parent->getData().begin() + Offset; - auto ChildOrErr = Child::create(Parent, Loc); - if (std::error_code EC = ChildOrErr.getError()) - return EC; - child_iterator Iter(std::move(*ChildOrErr.get())); + child_iterator Iter(Child(Parent, Loc)); return Iter; } diff --git a/lib/Object/ArchiveWriter.cpp b/lib/Object/ArchiveWriter.cpp index 1f304ccfb75..dae0188a21e 100644 --- a/lib/Object/ArchiveWriter.cpp +++ b/lib/Object/ArchiveWriter.cpp @@ -347,10 +347,10 @@ llvm::writeArchive(StringRef ArcName, MemberRef = Buffers.back()->getMemBufferRef(); } else { object::Archive::child_iterator OldMember = Member.getOld(); - assert((!Thin || (*OldMember && (*OldMember)->getParent()->isThin())) && + assert((!Thin || OldMember->getParent()->isThin()) && "Thin archives cannot refers to member of other archives"); ErrorOr MemberBufferOrErr = - (*OldMember)->getMemoryBufferRef(); + OldMember->getMemoryBufferRef(); if (auto EC = MemberBufferOrErr.getError()) return std::make_pair("", EC); MemberRef = MemberBufferOrErr.get(); @@ -398,10 +398,10 @@ llvm::writeArchive(StringRef ArcName, Perms = Status.permissions(); } else { object::Archive::child_iterator OldMember = I.getOld(); - ModTime = (*OldMember)->getLastModified(); - UID = (*OldMember)->getUID(); - GID = (*OldMember)->getGID(); - Perms = (*OldMember)->getAccessMode(); + ModTime = OldMember->getLastModified(); + UID = OldMember->getUID(); + GID = OldMember->getGID(); + Perms = OldMember->getAccessMode(); } if (I.isNewMember()) { @@ -412,11 +412,8 @@ llvm::writeArchive(StringRef ArcName, Status.getSize()); } else { object::Archive::child_iterator OldMember = I.getOld(); - ErrorOr Size = (*OldMember)->getSize(); - if (std::error_code EC = Size.getError()) - return std::make_pair("", EC); printMemberHeader(Out, Kind, Thin, I.getName(), StringMapIndexIter, - ModTime, UID, GID, Perms, Size.get()); + ModTime, UID, GID, Perms, OldMember->getSize()); } if (!Thin) diff --git a/test/tools/llvm-objdump/Inputs/malformed-archives/libbogus1.a b/test/tools/llvm-objdump/Inputs/malformed-archives/libbogus1.a deleted file mode 100644 index 510c1455527..00000000000 --- a/test/tools/llvm-objdump/Inputs/malformed-archives/libbogus1.a +++ /dev/null @@ -1,13 +0,0 @@ -! -hello.c 1444941273 124 0 100644 10% ` -#include -#include -int -main() -{ - printf("Hello World\n"); - return EXIT_SUCCESS; -} -foo.c 1444941645 124 0 100644 1% ` -void foo(void){} - diff --git a/test/tools/llvm-objdump/Inputs/malformed-archives/libbogus2.a b/test/tools/llvm-objdump/Inputs/malformed-archives/libbogus2.a deleted file mode 100644 index 2ccb7f31c09..00000000000 --- a/test/tools/llvm-objdump/Inputs/malformed-archives/libbogus2.a +++ /dev/null @@ -1,13 +0,0 @@ -! -hello.c 1444941273 124 0 100644 102 ` -#include -#include -int -main() -{ - printf("Hello World\n"); - return EXIT_SUCCESS; -} -foo.c 1444941645 124 0 100644 1% ` -void foo(void){} - diff --git a/test/tools/llvm-objdump/Inputs/malformed-archives/libbogus3.a b/test/tools/llvm-objdump/Inputs/malformed-archives/libbogus3.a deleted file mode 100644 index f15a7329f9f..00000000000 --- a/test/tools/llvm-objdump/Inputs/malformed-archives/libbogus3.a +++ /dev/null @@ -1,16 +0,0 @@ -! -hello.c 1444941273 124 0 100644 102 ` -#include -#include -int -main() -{ - printf("Hello World\n"); - return EXIT_SUCCESS; -} -foo.c 1444941645 124 0 100644 171 ` -void foo(void){} - -bar.c 1445026190 124 0 100644 17 ` -void foo(void){} - diff --git a/test/tools/llvm-objdump/malformed-archives.test b/test/tools/llvm-objdump/malformed-archives.test deleted file mode 100644 index 5066cb543b4..00000000000 --- a/test/tools/llvm-objdump/malformed-archives.test +++ /dev/null @@ -1,20 +0,0 @@ -// These test checks that llvm-objdump will not crash with malformed Archive -// files. So the check line is not all that important but the bug fixes to -// make sure llvm-objdump is robust is what matters. -# RUN: llvm-objdump -macho -archive-headers \ -# RUN: %p/Inputs/malformed-archives/libbogus1.a \ -# RUN: 2>&1 | FileCheck -check-prefix=bogus1 %s - -# bogus1: Invalid data was encountered while parsing the file - -# RUN: llvm-objdump -macho -archive-headers \ -# RUN: %p/Inputs/malformed-archives/libbogus2.a \ -# RUN: 2>&1 | FileCheck -check-prefix=bogus2 %s - -# bogus2: hello.c - -# RUN: llvm-objdump -macho -archive-headers \ -# RUN: %p/Inputs/malformed-archives/libbogus3.a \ -# RUN: 2>&1 | FileCheck -check-prefix=bogus3 %s - -# bogus3: foo.c diff --git a/tools/dsymutil/BinaryHolder.cpp b/tools/dsymutil/BinaryHolder.cpp index 01a49c9b1ee..7ff4fd69957 100644 --- a/tools/dsymutil/BinaryHolder.cpp +++ b/tools/dsymutil/BinaryHolder.cpp @@ -109,10 +109,7 @@ BinaryHolder::GetArchiveMemberBuffers(StringRef Filename, Buffers.reserve(CurrentArchives.size()); for (const auto &CurrentArchive : CurrentArchives) { - for (auto ChildOrErr : CurrentArchive->children()) { - if (auto Err = ChildOrErr.getError()) - return Err; - const auto &Child = *ChildOrErr; + for (const auto &Child : CurrentArchive->children()) { if (auto NameOrErr = Child.getName()) { if (*NameOrErr == Filename) { if (Timestamp != sys::TimeValue::PosixZeroTime() && diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index ec81421b4ae..ec3cfcb5cad 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -338,11 +338,7 @@ static void doDisplayTable(StringRef Name, const object::Archive::Child &C) { printMode(Mode & 007); outs() << ' ' << C.getUID(); outs() << '/' << C.getGID(); - ErrorOr Size = C.getSize(); - if (Size.getError()) - outs() << ' ' << "bad size"; - else - outs() << ' ' << format("%6llu", Size.get()); + outs() << ' ' << format("%6llu", C.getSize()); outs() << ' ' << C.getLastModified().str(); outs() << ' '; } @@ -407,14 +403,7 @@ static void performReadOperation(ArchiveOperation Operation, } bool Filter = !Members.empty(); - for (auto &ChildOrErr : OldArchive->children()) { - if (ChildOrErr.getError()) { - errs() << ToolName << ": error reading '" << ArchiveName - << "': " << ChildOrErr.getError().message() << "!\n"; - return; - } - const object::Archive::Child &C = *ChildOrErr; - + for (const object::Archive::Child &C : OldArchive->children()) { ErrorOr NameOrErr = C.getName(); failIfError(NameOrErr.getError()); StringRef Name = NameOrErr.get(); @@ -459,9 +448,7 @@ void addMember(std::vector &Members, StringRef FileName, void addMember(std::vector &Members, object::Archive::child_iterator I, StringRef Name, int Pos = -1) { - if (I->getError()) - fail("New member is not valid: " + I->getError().message()); - if (Thin && !(*I)->getParent()->isThin()) + if (Thin && !I->getParent()->isThin()) fail("Cannot convert a regular archive to a thin one"); NewArchiveIterator NI(I, Name); if (Pos == -1) @@ -482,9 +469,6 @@ static InsertAction computeInsertAction(ArchiveOperation Operation, object::Archive::child_iterator I, StringRef Name, std::vector::iterator &Pos) { - if (I->getError()) - fail("Invalid member: " + I->getError().message()); - if (Operation == QuickAppend || Members.empty()) return IA_AddOldMember; @@ -516,7 +500,7 @@ static InsertAction computeInsertAction(ArchiveOperation Operation, // operation. sys::fs::file_status Status; failIfError(sys::fs::status(*MI, Status), *MI); - if (Status.getLastModificationTime() < (*I)->getLastModified()) { + if (Status.getLastModificationTime() < I->getLastModified()) { if (PosName.empty()) return IA_AddOldMember; return IA_MoveOldMember; @@ -539,9 +523,7 @@ computeNewArchiveMembers(ArchiveOperation Operation, int InsertPos = -1; StringRef PosName = sys::path::filename(RelPos); if (OldArchive) { - for (auto &ChildOrErr : OldArchive->children()) { - failIfError(ChildOrErr.getError()); - auto &Child = ChildOrErr.get(); + for (auto &Child : OldArchive->children()) { int Pos = Ret.size(); ErrorOr NameOrErr = Child.getName(); failIfError(NameOrErr.getError()); @@ -744,9 +726,7 @@ static void runMRIScript() { failIfError(LibOrErr.getError(), "Could not parse library"); Archives.push_back(std::move(*LibOrErr)); object::Archive &Lib = *Archives.back(); - for (auto &MemberOrErr : Lib.children()) { - failIfError(MemberOrErr.getError()); - auto &Member = MemberOrErr.get(); + for (auto &Member : Lib.children()) { ErrorOr NameOrErr = Member.getName(); failIfError(NameOrErr.getError()); addMember(NewMembers, Member, *NameOrErr); diff --git a/tools/llvm-cxxdump/llvm-cxxdump.cpp b/tools/llvm-cxxdump/llvm-cxxdump.cpp index 96526c4ea45..d45a28a3b0f 100644 --- a/tools/llvm-cxxdump/llvm-cxxdump.cpp +++ b/tools/llvm-cxxdump/llvm-cxxdump.cpp @@ -482,12 +482,7 @@ static void dumpCXXData(const ObjectFile *Obj) { } static void dumpArchive(const Archive *Arc) { - for (auto &ErrorOrChild : Arc->children()) { - if (std::error_code EC = ErrorOrChild.getError()) { - reportError(Arc->getFileName(), EC.message()); - break; - } - const Archive::Child &ArcC = *ErrorOrChild; + for (const Archive::Child &ArcC : Arc->children()) { ErrorOr> ChildOrErr = ArcC.getAsBinary(); if (std::error_code EC = ChildOrErr.getError()) { // Ignore non-object files. diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index fad9e582df0..a0b5e9b4eaa 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -945,11 +945,10 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { if (I != E) { outs() << "Archive map\n"; for (; I != E; ++I) { - ErrorOr ErrorOrChild = I->getMember(); - if (error(ErrorOrChild.getError())) + ErrorOr C = I->getMember(); + if (error(C.getError())) return; - auto &C = *(ErrorOrChild.get()); - ErrorOr FileNameOrErr = C.get().getName(); + ErrorOr FileNameOrErr = C.get()->getName(); if (error(FileNameOrErr.getError())) return; StringRef SymName = I->getName(); @@ -961,10 +960,7 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { for (Archive::child_iterator I = A->child_begin(), E = A->child_end(); I != E; ++I) { - if (I->getError()) - break; - auto &C = I->get(); - ErrorOr> ChildOrErr = C.getAsBinary(&Context); + ErrorOr> ChildOrErr = I->getAsBinary(&Context); if (ChildOrErr.getError()) continue; if (SymbolicFile *O = dyn_cast(&*ChildOrErr.get())) { @@ -1019,11 +1015,8 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end(); AI != AE; ++AI) { - if(AI->getError()) - break; - auto &C = AI->get(); ErrorOr> ChildOrErr = - C.getAsBinary(&Context); + AI->getAsBinary(&Context); if (ChildOrErr.getError()) continue; if (SymbolicFile *O = @@ -1076,11 +1069,8 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end(); AI != AE; ++AI) { - if(AI->getError()) - break; - auto &C = AI->get(); ErrorOr> ChildOrErr = - C.getAsBinary(&Context); + AI->getAsBinary(&Context); if (ChildOrErr.getError()) continue; if (SymbolicFile *O = @@ -1128,11 +1118,8 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { std::unique_ptr &A = *AOrErr; for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end(); AI != AE; ++AI) { - if(AI->getError()) - continue; - auto &C = AI->get(); ErrorOr> ChildOrErr = - C.getAsBinary(&Context); + AI->getAsBinary(&Context); if (ChildOrErr.getError()) continue; if (SymbolicFile *O = dyn_cast(&*ChildOrErr.get())) { diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index 95869f2b952..6b70c011c02 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -1417,11 +1417,8 @@ static void printArchiveChild(Archive::Child &C, bool verbose, outs() << format("%3d/", UID); unsigned GID = C.getGID(); outs() << format("%-3d ", GID); - ErrorOr Size = C.getRawSize(); - if (Size.getError()) - outs() << "bad size" << " "; - else - outs() << format("%5" PRId64, Size.get()) << " "; + uint64_t Size = C.getRawSize(); + outs() << format("%5" PRId64, Size) << " "; StringRef RawLastModified = C.getRawLastModified(); if (verbose) { @@ -1457,16 +1454,12 @@ static void printArchiveChild(Archive::Child &C, bool verbose, static void printArchiveHeaders(Archive *A, bool verbose, bool print_offset) { if (A->hasSymbolTable()) { Archive::child_iterator S = A->getSymbolTableChild(); - if (!S->getError()) { - Archive::Child C = S->get(); - printArchiveChild(C, verbose, print_offset); - } + Archive::Child C = *S; + printArchiveChild(C, verbose, print_offset); } for (Archive::child_iterator I = A->child_begin(), E = A->child_end(); I != E; ++I) { - if(I->getError()) - break; - Archive::Child C = I->get(); + Archive::Child C = *I; printArchiveChild(C, verbose, print_offset); } } @@ -1503,10 +1496,7 @@ void llvm::ParseInputMachO(StringRef Filename) { printArchiveHeaders(A, !NonVerbose, ArchiveMemberOffsets); for (Archive::child_iterator I = A->child_begin(), E = A->child_end(); I != E; ++I) { - if (I->getError()) - break; - auto &C = I->get(); - ErrorOr> ChildOrErr = C.getAsBinary(); + ErrorOr> ChildOrErr = I->getAsBinary(); if (ChildOrErr.getError()) continue; if (MachOObjectFile *O = dyn_cast(&*ChildOrErr.get())) { @@ -1554,10 +1544,7 @@ void llvm::ParseInputMachO(StringRef Filename) { for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end(); AI != AE; ++AI) { - if (AI->getError()) - break; - auto &C = AI->get(); - ErrorOr> ChildOrErr = C.getAsBinary(); + ErrorOr> ChildOrErr = AI->getAsBinary(); if (ChildOrErr.getError()) continue; if (MachOObjectFile *O = @@ -1599,10 +1586,7 @@ void llvm::ParseInputMachO(StringRef Filename) { for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end(); AI != AE; ++AI) { - if (AI->getError()) - break; - auto &C = AI->get(); - ErrorOr> ChildOrErr = C.getAsBinary(); + ErrorOr> ChildOrErr = AI->getAsBinary(); if (ChildOrErr.getError()) continue; if (MachOObjectFile *O = @@ -1638,10 +1622,7 @@ void llvm::ParseInputMachO(StringRef Filename) { printArchiveHeaders(A.get(), !NonVerbose, ArchiveMemberOffsets); for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end(); AI != AE; ++AI) { - if (AI->getError()) - break; - auto &C = AI->get(); - ErrorOr> ChildOrErr = C.getAsBinary(); + ErrorOr> ChildOrErr = AI->getAsBinary(); if (ChildOrErr.getError()) continue; if (MachOObjectFile *O = diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 34401937bd8..7292841c55a 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -1536,12 +1536,7 @@ static void DumpObject(const ObjectFile *o) { /// @brief Dump each object file in \a a; static void DumpArchive(const Archive *a) { - for (auto &ErrorOrChild : a->children()) { - if (std::error_code EC = ErrorOrChild.getError()) { - report_error(a->getFileName(), EC); - break; - } - const Archive::Child &C = *ErrorOrChild; + for (const Archive::Child &C : a->children()) { ErrorOr> ChildOrErr = C.getAsBinary(); if (std::error_code EC = ChildOrErr.getError()) if (EC != object_error::invalid_file_type) diff --git a/tools/llvm-readobj/llvm-readobj.cpp b/tools/llvm-readobj/llvm-readobj.cpp index b59579de49d..cb0c9c6418e 100644 --- a/tools/llvm-readobj/llvm-readobj.cpp +++ b/tools/llvm-readobj/llvm-readobj.cpp @@ -377,12 +377,7 @@ static void dumpObject(const ObjectFile *Obj) { /// @brief Dumps each object file in \a Arc; static void dumpArchive(const Archive *Arc) { - for (auto &ErrorOrChild : Arc->children()) { - if (std::error_code EC = ErrorOrChild.getError()) { - reportError(Arc->getFileName(), EC.message()); - break; - } - const auto &Child = *ErrorOrChild; + for (const auto &Child : Arc->children()) { ErrorOr> ChildOrErr = Child.getAsBinary(); if (std::error_code EC = ChildOrErr.getError()) { // Ignore non-object files. diff --git a/tools/llvm-size/llvm-size.cpp b/tools/llvm-size/llvm-size.cpp index cc857624548..de2b0450523 100644 --- a/tools/llvm-size/llvm-size.cpp +++ b/tools/llvm-size/llvm-size.cpp @@ -427,13 +427,7 @@ static void PrintFileSectionSizes(StringRef file) { for (object::Archive::child_iterator i = a->child_begin(), e = a->child_end(); i != e; ++i) { - if (i->getError()) { - errs() << ToolName << ": " << file << ": " << i->getError().message() - << ".\n"; - break; - } - auto &c = i->get(); - ErrorOr> ChildOrErr = c.getAsBinary(); + ErrorOr> ChildOrErr = i->getAsBinary(); if (std::error_code EC = ChildOrErr.getError()) { errs() << ToolName << ": " << file << ": " << EC.message() << ".\n"; continue; @@ -495,13 +489,7 @@ static void PrintFileSectionSizes(StringRef file) { for (object::Archive::child_iterator i = UA->child_begin(), e = UA->child_end(); i != e; ++i) { - if (std::error_code EC = i->getError()) { - errs() << ToolName << ": " << file << ": " << EC.message() - << ".\n"; - break; - } - auto &c = i->get(); - ErrorOr> ChildOrErr = c.getAsBinary(); + ErrorOr> ChildOrErr = i->getAsBinary(); if (std::error_code EC = ChildOrErr.getError()) { errs() << ToolName << ": " << file << ": " << EC.message() << ".\n"; @@ -578,13 +566,7 @@ static void PrintFileSectionSizes(StringRef file) { for (object::Archive::child_iterator i = UA->child_begin(), e = UA->child_end(); i != e; ++i) { - if (std::error_code EC = i->getError()) { - errs() << ToolName << ": " << file << ": " << EC.message() - << ".\n"; - break; - } - auto &c = i->get(); - ErrorOr> ChildOrErr = c.getAsBinary(); + ErrorOr> ChildOrErr = i->getAsBinary(); if (std::error_code EC = ChildOrErr.getError()) { errs() << ToolName << ": " << file << ": " << EC.message() << ".\n"; @@ -648,13 +630,7 @@ static void PrintFileSectionSizes(StringRef file) { for (object::Archive::child_iterator i = UA->child_begin(), e = UA->child_end(); i != e; ++i) { - if (std::error_code EC = i->getError()) { - errs() << ToolName << ": " << file << ": " << EC.message() - << ".\n"; - break; - } - auto &c = i->get(); - ErrorOr> ChildOrErr = c.getAsBinary(); + ErrorOr> ChildOrErr = i->getAsBinary(); if (std::error_code EC = ChildOrErr.getError()) { errs() << ToolName << ": " << file << ": " << EC.message() << ".\n"; continue; -- 2.34.1