@@ -20,6 +20,13 @@ struct RustArchiveMember {
2020 ~RustArchiveMember () {}
2121};
2222
23+ struct RustArchiveMemberBuffer {
24+ MemoryBufferRef Buffer;
25+
26+ RustArchiveMemberBuffer () {}
27+ ~RustArchiveMemberBuffer () {}
28+ };
29+
2330struct RustArchiveIterator {
2431 bool First;
2532 Archive::child_iterator Cur;
@@ -58,6 +65,7 @@ static Archive::Kind fromRust(LLVMRustArchiveKind Kind) {
5865
5966typedef OwningBinary<Archive> *LLVMRustArchiveRef;
6067typedef RustArchiveMember *LLVMRustArchiveMemberRef;
68+ typedef RustArchiveMemberBuffer *LLVMRustArchiveMemberBufferRef;
6169typedef Archive::Child *LLVMRustArchiveChildRef;
6270typedef Archive::Child const *LLVMRustArchiveChildConstRef;
6371typedef RustArchiveIterator *LLVMRustArchiveIteratorRef;
@@ -155,7 +163,7 @@ LLVMRustArchiveChildName(LLVMRustArchiveChildConstRef Child, size_t *Size) {
155163}
156164
157165extern " C" LLVMRustArchiveMemberRef
158- LLVMRustArchiveMemberNew (char *Filename, char *Name,
166+ LLVMRustArchiveMemberNewFile (char *Filename, char *Name,
159167 LLVMRustArchiveChildRef Child) {
160168 RustArchiveMember *Member = new RustArchiveMember;
161169 Member->Filename = Filename;
@@ -165,13 +173,26 @@ LLVMRustArchiveMemberNew(char *Filename, char *Name,
165173 return Member;
166174}
167175
176+ extern " C" LLVMRustArchiveMemberBufferRef
177+ LLVMRustArchiveMemberNewBuffer (const char * Name, const char * BufferStart, size_t BufferSize) {
178+ RustArchiveMemberBuffer *Member = new RustArchiveMemberBuffer;
179+ Member->Buffer = MemoryBufferRef (StringRef (BufferStart, BufferSize), StringRef (Name));
180+ return Member;
181+ }
182+
168183extern " C" void LLVMRustArchiveMemberFree (LLVMRustArchiveMemberRef Member) {
169184 delete Member;
170185}
171186
187+ extern " C" void LLVMRustArchiveMemberBufferFree (LLVMRustArchiveMemberBufferRef Member) {
188+ delete Member;
189+ }
190+
172191extern " C" LLVMRustResult
173192LLVMRustWriteArchive (char *Dst, size_t NumMembers,
174193 const LLVMRustArchiveMemberRef *NewMembers,
194+ size_t NumMemberBuffers,
195+ const LLVMRustArchiveMemberBufferRef *NewMemberBuffers,
175196 bool WriteSymbtab, LLVMRustArchiveKind RustKind) {
176197
177198 std::vector<NewArchiveMember> Members;
@@ -181,6 +202,7 @@ LLVMRustWriteArchive(char *Dst, size_t NumMembers,
181202 auto Member = NewMembers[I];
182203 assert (Member->Name );
183204 if (Member->Filename ) {
205+ // file
184206 Expected<NewArchiveMember> MOrErr =
185207 NewArchiveMember::getFile (Member->Filename , true );
186208 if (!MOrErr) {
@@ -190,6 +212,7 @@ LLVMRustWriteArchive(char *Dst, size_t NumMembers,
190212 MOrErr->MemberName = sys::path::filename (MOrErr->MemberName );
191213 Members.push_back (std::move (*MOrErr));
192214 } else {
215+ // archive
193216 Expected<NewArchiveMember> MOrErr =
194217 NewArchiveMember::getOldMember (Member->Child , true );
195218 if (!MOrErr) {
@@ -199,6 +222,11 @@ LLVMRustWriteArchive(char *Dst, size_t NumMembers,
199222 Members.push_back (std::move (*MOrErr));
200223 }
201224 }
225+ for (size_t I = 0 ; I < NumMemberBuffers; I++) {
226+ auto Member = NewMemberBuffers[I];
227+ auto M = NewArchiveMember (Member->Buffer );
228+ Members.push_back (std::move (M));
229+ }
202230
203231 auto Result = writeArchive (Dst, Members, WriteSymbtab, Kind, true , false );
204232 if (!Result)
0 commit comments