From 203c90ba80c804d430f6a7b490256f15cbbc384d Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 21 Sep 2017 23:13:36 +0000 Subject: [PATCH] Convert the archive writer to use Error. This found one place in lld that was not checking the error. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313937 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ArchiveWriter.h | 9 +++++---- include/llvm/Object/COFFImportFile.h | 8 +++----- lib/Object/ArchiveWriter.cpp | 26 +++++++++++++------------- lib/Object/COFFImportFile.cpp | 11 +++++------ lib/ToolDrivers/llvm-lib/LibDriver.cpp | 14 +++++++------- tools/llvm-ar/llvm-ar.cpp | 4 ++-- 6 files changed, 35 insertions(+), 37 deletions(-) diff --git a/include/llvm/Object/ArchiveWriter.h b/include/llvm/Object/ArchiveWriter.h index 5fc1e1b1236..495b943d04c 100644 --- a/include/llvm/Object/ArchiveWriter.h +++ b/include/llvm/Object/ArchiveWriter.h @@ -16,6 +16,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Object/Archive.h" +#include "llvm/Support/Error.h" #include "llvm/Support/FileSystem.h" namespace llvm { @@ -37,10 +38,10 @@ struct NewArchiveMember { bool Deterministic); }; -std::error_code -writeArchive(StringRef ArcName, ArrayRef NewMembers, - bool WriteSymtab, object::Archive::Kind Kind, bool Deterministic, - bool Thin, std::unique_ptr OldArchiveBuf = nullptr); +Error writeArchive(StringRef ArcName, ArrayRef NewMembers, + bool WriteSymtab, object::Archive::Kind Kind, + bool Deterministic, bool Thin, + std::unique_ptr OldArchiveBuf = nullptr); } #endif diff --git a/include/llvm/Object/COFFImportFile.h b/include/llvm/Object/COFFImportFile.h index cf9c80a06f4..4b284de679b 100644 --- a/include/llvm/Object/COFFImportFile.h +++ b/include/llvm/Object/COFFImportFile.h @@ -96,11 +96,9 @@ struct COFFShortExport { } }; -std::error_code writeImportLibrary(StringRef ImportName, - StringRef Path, - ArrayRef Exports, - COFF::MachineTypes Machine, - bool MakeWeakAliases); +Error writeImportLibrary(StringRef ImportName, StringRef Path, + ArrayRef Exports, + COFF::MachineTypes Machine, bool MakeWeakAliases); } // namespace object } // namespace llvm diff --git a/lib/Object/ArchiveWriter.cpp b/lib/Object/ArchiveWriter.cpp index 293dbe6888c..015c24836fa 100644 --- a/lib/Object/ArchiveWriter.cpp +++ b/lib/Object/ArchiveWriter.cpp @@ -278,7 +278,7 @@ static sys::TimePoint now(bool Deterministic) { } // Returns the offset of the first reference to a member offset. -static ErrorOr +static Expected writeSymbolTable(raw_fd_ostream &Out, object::Archive::Kind Kind, ArrayRef Members, std::vector &MemberOffsetRefs, bool Deterministic) { @@ -320,8 +320,8 @@ writeSymbolTable(raw_fd_ostream &Out, object::Archive::Kind Kind, continue; unsigned NameOffset = NameOS.tell(); - if (auto EC = S.printName(NameOS)) - return EC; + if (std::error_code EC = S.printName(NameOS)) + return errorCodeToError(EC); NameOS << '\0'; MemberOffsetRefs.push_back(MemberNum); if (isBSDLike(Kind)) @@ -373,17 +373,17 @@ writeSymbolTable(raw_fd_ostream &Out, object::Archive::Kind Kind, return BodyStartOffset + 4; } -std::error_code -llvm::writeArchive(StringRef ArcName, ArrayRef NewMembers, - bool WriteSymtab, object::Archive::Kind Kind, - bool Deterministic, bool Thin, - std::unique_ptr OldArchiveBuf) { +Error llvm::writeArchive(StringRef ArcName, + ArrayRef NewMembers, + bool WriteSymtab, object::Archive::Kind Kind, + bool Deterministic, bool Thin, + std::unique_ptr OldArchiveBuf) { assert((!Thin || !isBSDLike(Kind)) && "Only the gnu format has a thin mode"); SmallString<128> TmpArchive; int TmpArchiveFD; if (auto EC = sys::fs::createUniqueFile(ArcName + ".temp-archive-%%%%%%%.a", TmpArchiveFD, TmpArchive)) - return EC; + return errorCodeToError(EC); tool_output_file Output(TmpArchive, TmpArchiveFD); raw_fd_ostream &Out = Output.os(); @@ -396,10 +396,10 @@ llvm::writeArchive(StringRef ArcName, ArrayRef NewMembers, unsigned MemberReferenceOffset = 0; if (WriteSymtab) { - ErrorOr MemberReferenceOffsetOrErr = writeSymbolTable( + Expected MemberReferenceOffsetOrErr = writeSymbolTable( Out, Kind, NewMembers, MemberOffsetRefs, Deterministic); - if (auto EC = MemberReferenceOffsetOrErr.getError()) - return EC; + if (auto E = MemberReferenceOffsetOrErr.takeError()) + return E; MemberReferenceOffset = MemberReferenceOffsetOrErr.get(); } @@ -461,5 +461,5 @@ llvm::writeArchive(StringRef ArcName, ArrayRef NewMembers, OldArchiveBuf.reset(); sys::fs::rename(TmpArchive, ArcName); - return std::error_code(); + return Error::success(); } diff --git a/lib/Object/COFFImportFile.cpp b/lib/Object/COFFImportFile.cpp index 5f4b8908837..acac1e6d56a 100644 --- a/lib/Object/COFFImportFile.cpp +++ b/lib/Object/COFFImportFile.cpp @@ -558,9 +558,9 @@ NewArchiveMember ObjectFactory::createWeakExternal(StringRef Sym, return {MemoryBufferRef(StringRef(Buf, Buffer.size()), ImportName)}; } -std::error_code writeImportLibrary(StringRef ImportName, StringRef Path, - ArrayRef Exports, - MachineTypes Machine, bool MakeWeakAliases) { +Error writeImportLibrary(StringRef ImportName, StringRef Path, + ArrayRef Exports, + MachineTypes Machine, bool MakeWeakAliases) { std::vector Members; ObjectFactory OF(llvm::sys::path::filename(ImportName), Machine); @@ -596,9 +596,8 @@ std::error_code writeImportLibrary(StringRef ImportName, StringRef Path, ? SymbolName : replace(SymbolName, E.Name, E.ExtName); - if (!Name) { - return errorToErrorCode(Name.takeError()); - } + if (!Name) + return Name.takeError(); Members.push_back( OF.createShortImport(*Name, E.Ordinal, ImportType, NameType)); diff --git a/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/lib/ToolDrivers/llvm-lib/LibDriver.cpp index a7268d048e3..f5cf848aa8c 100644 --- a/lib/ToolDrivers/llvm-lib/LibDriver.cpp +++ b/lib/ToolDrivers/llvm-lib/LibDriver.cpp @@ -157,13 +157,13 @@ int llvm::libDriverMain(ArrayRef ArgsArr) { // Create an archive file. std::string OutputPath = getOutputPath(&Args, Members[0]); - std::error_code EC = - writeArchive(OutputPath, Members, - /*WriteSymtab=*/true, object::Archive::K_GNU, - /*Deterministic*/ true, Args.hasArg(OPT_llvmlibthin)); - - if (EC) { - llvm::errs() << OutputPath << ": " << EC.message() << "\n"; + if (Error E = + writeArchive(OutputPath, Members, + /*WriteSymtab=*/true, object::Archive::K_GNU, + /*Deterministic*/ true, Args.hasArg(OPT_llvmlibthin))) { + handleAllErrors(std::move(E), [&](const ErrorInfoBase &EI) { + llvm::errs() << OutputPath << ": " << EI.message() << "\n"; + }); return 1; } diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index 03655cb4318..576265cfe59 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -681,10 +681,10 @@ performWriteOperation(ArchiveOperation Operation, break; } - std::error_code EC = + Error E = writeArchive(ArchiveName, NewMembersP ? *NewMembersP : NewMembers, Symtab, Kind, Deterministic, Thin, std::move(OldArchiveBuf)); - failIfError(EC, ArchiveName); + failIfError(std::move(E), ArchiveName); } static void createSymbolTable(object::Archive *OldArchive) { -- 2.40.0