diff options
-rw-r--r-- | llvm/include/llvm/Object/Archive.h | 4 | ||||
-rw-r--r-- | llvm/lib/Object/Archive.cpp | 43 | ||||
-rw-r--r-- | llvm/lib/Object/Binary.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Object/MachOUniversal.cpp | 2 | ||||
-rw-r--r-- | llvm/tools/dsymutil/BinaryHolder.cpp | 4 | ||||
-rw-r--r-- | llvm/tools/lli/lli.cpp | 10 | ||||
-rw-r--r-- | llvm/tools/llvm-ar/llvm-ar.cpp | 7 |
7 files changed, 43 insertions, 29 deletions
diff --git a/llvm/include/llvm/Object/Archive.h b/llvm/include/llvm/Object/Archive.h index 231d56a6b5f..77538cb5323 100644 --- a/llvm/include/llvm/Object/Archive.h +++ b/llvm/include/llvm/Object/Archive.h @@ -176,8 +176,8 @@ public: } }; - Archive(MemoryBufferRef Source, std::error_code &EC); - static ErrorOr<std::unique_ptr<Archive>> create(MemoryBufferRef Source); + Archive(MemoryBufferRef Source, Error &Err); + static Expected<std::unique_ptr<Archive>> create(MemoryBufferRef Source); enum Kind { K_GNU, diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index 3267d24a61e..4e9a18ee40c 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -263,11 +263,11 @@ Archive::Child::getAsBinary(LLVMContext *Context) const { return BinaryOrErr.takeError(); } -ErrorOr<std::unique_ptr<Archive>> Archive::create(MemoryBufferRef Source) { - std::error_code EC; - std::unique_ptr<Archive> Ret(new Archive(Source, EC)); - if (EC) - return EC; +Expected<std::unique_ptr<Archive>> Archive::create(MemoryBufferRef Source) { + Error Err; + std::unique_ptr<Archive> Ret(new Archive(Source, Err)); + if (Err) + return std::move(Err); return std::move(Ret); } @@ -276,8 +276,9 @@ void Archive::setFirstRegular(const Child &C) { FirstRegularStartOfFile = C.StartOfFile; } -Archive::Archive(MemoryBufferRef Source, std::error_code &ec) +Archive::Archive(MemoryBufferRef Source, Error &Err) : Binary(Binary::ID_Archive, Source) { + ErrorAsOutParameter ErrAsOutParam(Err); StringRef Buffer = Data.getBuffer(); // Check for sufficient magic. if (Buffer.startswith(ThinMagic)) { @@ -285,14 +286,18 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) } else if (Buffer.startswith(Magic)) { IsThin = false; } else { - ec = object_error::invalid_file_type; + Err = make_error<GenericBinaryError>("File too small to be an archive", + object_error::invalid_file_type); return; } // Get the special members. child_iterator I = child_begin(false); - if ((ec = I->getError())) + std::error_code ec; + if ((ec = I->getError())) { + Err = errorCodeToError(ec); return; + } child_iterator E = child_end(); // This is at least a valid empty archive. Since an empty archive is the @@ -301,14 +306,14 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) Format = K_GNU; if (I == E) { - ec = std::error_code(); + Err = Error::success(); return; } const Child *C = &**I; auto Increment = [&]() { ++I; - if ((ec = I->getError())) + if ((Err = errorCodeToError(I->getError()))) return true; C = &**I; return false; @@ -347,7 +352,7 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) return; setFirstRegular(*C); - ec = std::error_code(); + Err = Error::success(); return; } @@ -356,8 +361,10 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) // We know this is BSD, so getName will work since there is no string table. ErrorOr<StringRef> NameOrErr = C->getName(); ec = NameOrErr.getError(); - if (ec) + if (ec) { + Err = errorCodeToError(ec); return; + } Name = NameOrErr.get(); if (Name == "__.SYMDEF SORTED" || Name == "__.SYMDEF") { // We know that the symbol table is not an external file, so we just @@ -394,7 +401,7 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) if (Increment()) return; if (I == E) { - ec = std::error_code(); + Err = Error::success(); return; } Name = C->getRawName(); @@ -408,19 +415,19 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) if (Increment()) return; setFirstRegular(*C); - ec = std::error_code(); + Err = Error::success(); return; } if (Name[0] != '/') { Format = has64SymTable ? K_MIPS64 : K_GNU; setFirstRegular(*C); - ec = std::error_code(); + Err = Error::success(); return; } if (Name != "/") { - ec = object_error::parse_failed; + Err = errorCodeToError(object_error::parse_failed); return; } @@ -434,7 +441,7 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) if (I == E) { setFirstRegular(*C); - ec = std::error_code(); + Err = Error::success(); return; } @@ -449,7 +456,7 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) } setFirstRegular(*C); - ec = std::error_code(); + Err = Error::success(); } Archive::child_iterator Archive::child_begin(bool SkipInternal) const { diff --git a/llvm/lib/Object/Binary.cpp b/llvm/lib/Object/Binary.cpp index 8d03a2a976b..ec051fec375 100644 --- a/llvm/lib/Object/Binary.cpp +++ b/llvm/lib/Object/Binary.cpp @@ -42,7 +42,7 @@ Expected<std::unique_ptr<Binary>> object::createBinary(MemoryBufferRef Buffer, switch (Type) { case sys::fs::file_magic::archive: - return errorOrToExpected(Archive::create(Buffer)); + return Archive::create(Buffer); case sys::fs::file_magic::elf: case sys::fs::file_magic::elf_relocatable: case sys::fs::file_magic::elf_executable: diff --git a/llvm/lib/Object/MachOUniversal.cpp b/llvm/lib/Object/MachOUniversal.cpp index 8f5d56b90cb..66c9151eb69 100644 --- a/llvm/lib/Object/MachOUniversal.cpp +++ b/llvm/lib/Object/MachOUniversal.cpp @@ -96,7 +96,7 @@ MachOUniversalBinary::ObjectForArch::getAsArchive() const { ObjectData = ParentData.substr(Header64.offset, Header64.size); StringRef ObjectName = Parent->getFileName(); MemoryBufferRef ObjBuffer(ObjectData, ObjectName); - return errorOrToExpected(Archive::create(ObjBuffer)); + return Archive::create(ObjBuffer); } void MachOUniversalBinary::anchor() { } diff --git a/llvm/tools/dsymutil/BinaryHolder.cpp b/llvm/tools/dsymutil/BinaryHolder.cpp index 8f33657dd55..5b92bba1193 100644 --- a/llvm/tools/dsymutil/BinaryHolder.cpp +++ b/llvm/tools/dsymutil/BinaryHolder.cpp @@ -159,8 +159,8 @@ BinaryHolder::MapArchiveAndGetMemberBuffers(StringRef Filename, for (auto MemRef : ArchiveBuffers) { auto ErrOrArchive = object::Archive::create(MemRef); - if (auto Err = ErrOrArchive.getError()) - return Err; + if (!ErrOrArchive) + return errorToErrorCode(ErrOrArchive.takeError()); CurrentArchives.push_back(std::move(*ErrOrArchive)); } return GetArchiveMemberBuffers(Filename, Timestamp); diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp index 14e03fb5a93..92de5da4721 100644 --- a/llvm/tools/lli/lli.cpp +++ b/llvm/tools/lli/lli.cpp @@ -511,10 +511,14 @@ int main(int argc, char **argv, char * const *envp) { } std::unique_ptr<MemoryBuffer> &ArBuf = ArBufOrErr.get(); - ErrorOr<std::unique_ptr<object::Archive>> ArOrErr = + Expected<std::unique_ptr<object::Archive>> ArOrErr = object::Archive::create(ArBuf->getMemBufferRef()); - if (std::error_code EC = ArOrErr.getError()) { - errs() << EC.message(); + if (!ArOrErr) { + std::string Buf; + raw_string_ostream OS(Buf); + logAllUnhandledErrors(ArOrErr.takeError(), OS, ""); + OS.flush(); + errs() << Buf; return 1; } std::unique_ptr<object::Archive> &Ar = ArOrErr.get(); diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp index c8e241e2bf6..f918a3e5136 100644 --- a/llvm/tools/llvm-ar/llvm-ar.cpp +++ b/llvm/tools/llvm-ar/llvm-ar.cpp @@ -713,7 +713,9 @@ static int performOperation(ArchiveOperation Operation, fail("error opening '" + ArchiveName + "': " + EC.message() + "!"); if (!EC) { - object::Archive Archive(Buf.get()->getMemBufferRef(), EC); + Error Err; + object::Archive Archive(Buf.get()->getMemBufferRef(), Err); + EC = errorToErrorCode(std::move(Err)); failIfError(EC, "error loading '" + ArchiveName + "': " + EC.message() + "!"); performOperation(Operation, &Archive, std::move(Buf.get()), NewMembers); @@ -768,7 +770,8 @@ static void runMRIScript() { ArchiveBuffers.push_back(std::move(*BufOrErr)); auto LibOrErr = object::Archive::create(ArchiveBuffers.back()->getMemBufferRef()); - failIfError(LibOrErr.getError(), "Could not parse library"); + failIfError(errorToErrorCode(LibOrErr.takeError()), + "Could not parse library"); Archives.push_back(std::move(*LibOrErr)); object::Archive &Lib = *Archives.back(); for (auto &MemberOrErr : Lib.children()) { |