diff --git a/llvm/include/llvm/Object/ArchiveWriter.h b/llvm/include/llvm/Object/ArchiveWriter.h --- a/llvm/include/llvm/Object/ArchiveWriter.h +++ b/llvm/include/llvm/Object/ArchiveWriter.h @@ -39,6 +39,13 @@ bool WriteSymtab, object::Archive::Kind Kind, bool Deterministic, bool Thin, std::unique_ptr OldArchiveBuf = nullptr); + +Error writeArchiveBuffer(StringRef ArcName, + ArrayRef NewMembers, + bool WriteSymtab, object::Archive::Kind Kind, + bool Deterministic, bool Thin, + std::unique_ptr &ReturnBuffer, + std::unique_ptr OldArchiveBuf = nullptr); } #endif diff --git a/llvm/lib/Object/ArchiveWriter.cpp b/llvm/lib/Object/ArchiveWriter.cpp --- a/llvm/lib/Object/ArchiveWriter.cpp +++ b/llvm/lib/Object/ArchiveWriter.cpp @@ -552,10 +552,11 @@ return std::string(Relative.str()); } -Error writeArchive(StringRef ArcName, ArrayRef NewMembers, - bool WriteSymtab, object::Archive::Kind Kind, - bool Deterministic, bool Thin, - std::unique_ptr OldArchiveBuf) { +static Expected +writeArchiveInFD(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<0> SymNamesBuf; @@ -566,7 +567,7 @@ Expected> DataOrErr = computeMemberData( StringTable, SymNames, Kind, Thin, Deterministic, NewMembers); if (Error E = DataOrErr.takeError()) - return E; + return std::move(E); std::vector &Data = *DataOrErr; if (!StringTableBuf.empty()) @@ -639,7 +640,43 @@ // closed before we attempt to rename. OldArchiveBuf.reset(); + return Temp; +} + +Error writeArchive(StringRef ArcName, ArrayRef NewMembers, + bool WriteSymtab, object::Archive::Kind Kind, + bool Deterministic, bool Thin, + std::unique_ptr OldArchiveBuf) { + + Expected Temp = + writeArchiveInFD(ArcName, NewMembers, WriteSymtab, Kind, Deterministic, + Thin, std::move(OldArchiveBuf)); + if (!Temp) + return Temp.takeError(); + return Temp->keep(ArcName); } +Error writeArchiveBuffer(StringRef ArcName, + ArrayRef NewMembers, + bool WriteSymtab, object::Archive::Kind Kind, + bool Deterministic, bool Thin, + std::unique_ptr &ReturnBuffer, + std::unique_ptr OldArchiveBuf) { + + Expected Temp = + writeArchiveInFD(ArcName, NewMembers, WriteSymtab, Kind, Deterministic, + Thin, std::move(OldArchiveBuf)); + if (!Temp) + return Temp.takeError(); + + ErrorOr> Ret = + MemoryBuffer::getOpenFile(Temp->FD, ArcName, -1); + if (std::error_code EC = Ret.getError()) + return errorCodeToError(EC); + + ReturnBuffer = std::move(Ret.get()); + return Temp->discard(); +} + } // namespace llvm