26
26
#include " llvm/Support/ErrorHandling.h"
27
27
#include " llvm/Support/Format.h"
28
28
#include " llvm/Support/Path.h"
29
+ #include " llvm/Support/SmallVectorMemoryBuffer.h"
29
30
#include " llvm/Support/ToolOutputFile.h"
30
31
#include " llvm/Support/raw_ostream.h"
31
32
@@ -552,10 +553,10 @@ Expected<std::string> computeArchiveRelativePath(StringRef From, StringRef To) {
552
553
return std::string (Relative.str ());
553
554
}
554
555
555
- Error writeArchive (StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers ,
556
- bool WriteSymtab, object::Archive::Kind Kind ,
557
- bool Deterministic, bool Thin ,
558
- std::unique_ptr<MemoryBuffer> OldArchiveBuf ) {
556
+ static Error writeArchiveToStream (raw_ostream &Out ,
557
+ ArrayRef<NewArchiveMember> NewMembers ,
558
+ bool WriteSymtab, object::Archive::Kind Kind ,
559
+ bool Deterministic, bool Thin ) {
559
560
assert ((!Thin || !isBSDLike (Kind)) && " Only the gnu format has a thin mode" );
560
561
561
562
SmallString<0 > SymNamesBuf;
@@ -608,12 +609,6 @@ Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers,
608
609
}
609
610
}
610
611
611
- Expected<sys::fs::TempFile> Temp =
612
- sys::fs::TempFile::create (ArcName + " .temp-archive-%%%%%%%.a" );
613
- if (!Temp)
614
- return Temp.takeError ();
615
-
616
- raw_fd_ostream Out (Temp->FD , false );
617
612
if (Thin)
618
613
Out << " !<thin>\n " ;
619
614
else
@@ -626,6 +621,25 @@ Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers,
626
621
Out << M.Header << M.Data << M.Padding ;
627
622
628
623
Out.flush ();
624
+ return Error::success ();
625
+ }
626
+
627
+ Error writeArchive (StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers,
628
+ bool WriteSymtab, object::Archive::Kind Kind,
629
+ bool Deterministic, bool Thin,
630
+ std::unique_ptr<MemoryBuffer> OldArchiveBuf) {
631
+ Expected<sys::fs::TempFile> Temp =
632
+ sys::fs::TempFile::create (ArcName + " .temp-archive-%%%%%%%.a" );
633
+ if (!Temp)
634
+ return Temp.takeError ();
635
+ raw_fd_ostream Out (Temp->FD , false );
636
+
637
+ if (Error E = writeArchiveToStream (Out, NewMembers, WriteSymtab, Kind,
638
+ Deterministic, Thin)) {
639
+ if (Error DiscardError = Temp->discard ())
640
+ return joinErrors (std::move (E), std::move (DiscardError));
641
+ return E;
642
+ }
629
643
630
644
// At this point, we no longer need whatever backing memory
631
645
// was used to generate the NewMembers. On Windows, this buffer
@@ -642,4 +656,19 @@ Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers,
642
656
return Temp->keep (ArcName);
643
657
}
644
658
659
+ Expected<std::unique_ptr<MemoryBuffer>>
660
+ writeArchiveToBuffer (ArrayRef<NewArchiveMember> NewMembers, bool WriteSymtab,
661
+ object::Archive::Kind Kind, bool Deterministic,
662
+ bool Thin) {
663
+ SmallVector<char , 0 > ArchiveBufferVector;
664
+ raw_svector_ostream ArchiveStream (ArchiveBufferVector);
665
+
666
+ if (Error E = writeArchiveToStream (ArchiveStream, NewMembers, WriteSymtab,
667
+ Kind, Deterministic, Thin))
668
+ return std::move (E);
669
+
670
+ return std::make_unique<SmallVectorMemoryBuffer>(
671
+ std::move (ArchiveBufferVector));
672
+ }
673
+
645
674
} // namespace llvm
0 commit comments