diff options
author | Sameer Arora <sameerarora101@fb.com> | 2020-07-29 07:40:11 -0700 |
---|---|---|
committer | Sameer Arora <sameerarora101@fb.com> | 2020-08-13 10:56:30 -0700 |
commit | 8d58eb11f9dabacc37f1f5e2cc83149b24868180 (patch) | |
tree | 40c31c82daefd54aa5ed5052d8e095cae644f0e7 /llvm/lib/Object/ArchiveWriter.cpp | |
parent | 50c743fa713002fe4e0c76d23043e6c1f9e9fe6f (diff) | |
download | llvm-8d58eb11f9dabacc37f1f5e2cc83149b24868180.zip llvm-8d58eb11f9dabacc37f1f5e2cc83149b24868180.tar.gz llvm-8d58eb11f9dabacc37f1f5e2cc83149b24868180.tar.bz2 |
[llvm-libtool-darwin] Refactor ArchiveWriter
Refactoring function `writeArchive` in ArchiveWriter. Added a new
function `writeArchiveBuffer` that returns the archive in a memory
buffer instead of writing it out to the disk. This refactor is necessary
so as to allow `llvm-libtool-darwin` to write universal files containing
archives.
Reviewed by jhenderson, MaskRay, smeenai
Differential Revision: https://reviews.llvm.org/D84858
Diffstat (limited to 'llvm/lib/Object/ArchiveWriter.cpp')
-rw-r--r-- | llvm/lib/Object/ArchiveWriter.cpp | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/llvm/lib/Object/ArchiveWriter.cpp b/llvm/lib/Object/ArchiveWriter.cpp index 6f92c54..ca8ffa7 100644 --- a/llvm/lib/Object/ArchiveWriter.cpp +++ b/llvm/lib/Object/ArchiveWriter.cpp @@ -26,6 +26,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/Format.h" #include "llvm/Support/Path.h" +#include "llvm/Support/SmallVectorMemoryBuffer.h" #include "llvm/Support/ToolOutputFile.h" #include "llvm/Support/raw_ostream.h" @@ -552,10 +553,10 @@ Expected<std::string> computeArchiveRelativePath(StringRef From, StringRef To) { return std::string(Relative.str()); } -Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers, - bool WriteSymtab, object::Archive::Kind Kind, - bool Deterministic, bool Thin, - std::unique_ptr<MemoryBuffer> OldArchiveBuf) { +static Error writeArchiveToStream(raw_ostream &Out, + ArrayRef<NewArchiveMember> NewMembers, + bool WriteSymtab, object::Archive::Kind Kind, + bool Deterministic, bool Thin) { assert((!Thin || !isBSDLike(Kind)) && "Only the gnu format has a thin mode"); SmallString<0> SymNamesBuf; @@ -608,12 +609,6 @@ Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers, } } - Expected<sys::fs::TempFile> Temp = - sys::fs::TempFile::create(ArcName + ".temp-archive-%%%%%%%.a"); - if (!Temp) - return Temp.takeError(); - - raw_fd_ostream Out(Temp->FD, false); if (Thin) Out << "!<thin>\n"; else @@ -626,6 +621,25 @@ Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers, Out << M.Header << M.Data << M.Padding; Out.flush(); + return Error::success(); +} + +Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers, + bool WriteSymtab, object::Archive::Kind Kind, + bool Deterministic, bool Thin, + std::unique_ptr<MemoryBuffer> OldArchiveBuf) { + Expected<sys::fs::TempFile> Temp = + sys::fs::TempFile::create(ArcName + ".temp-archive-%%%%%%%.a"); + if (!Temp) + return Temp.takeError(); + raw_fd_ostream Out(Temp->FD, false); + + if (Error E = writeArchiveToStream(Out, NewMembers, WriteSymtab, Kind, + Deterministic, Thin)) { + if (Error DiscardError = Temp->discard()) + return joinErrors(std::move(E), std::move(DiscardError)); + return E; + } // At this point, we no longer need whatever backing memory // was used to generate the NewMembers. On Windows, this buffer @@ -642,4 +656,19 @@ Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers, return Temp->keep(ArcName); } +Expected<std::unique_ptr<MemoryBuffer>> +writeArchiveToBuffer(ArrayRef<NewArchiveMember> NewMembers, bool WriteSymtab, + object::Archive::Kind Kind, bool Deterministic, + bool Thin) { + SmallVector<char, 0> ArchiveBufferVector; + raw_svector_ostream ArchiveStream(ArchiveBufferVector); + + if (Error E = writeArchiveToStream(ArchiveStream, NewMembers, WriteSymtab, + Kind, Deterministic, Thin)) + return std::move(E); + + return std::make_unique<SmallVectorMemoryBuffer>( + std::move(ArchiveBufferVector)); +} + } // namespace llvm |