@@ -20,6 +20,13 @@ struct RustArchiveMember {
20
20
~RustArchiveMember () {}
21
21
};
22
22
23
+ struct RustArchiveMemberBuffer {
24
+ MemoryBufferRef Buffer;
25
+
26
+ RustArchiveMemberBuffer () {}
27
+ ~RustArchiveMemberBuffer () {}
28
+ };
29
+
23
30
struct RustArchiveIterator {
24
31
bool First;
25
32
Archive::child_iterator Cur;
@@ -58,6 +65,7 @@ static Archive::Kind fromRust(LLVMRustArchiveKind Kind) {
58
65
59
66
typedef OwningBinary<Archive> *LLVMRustArchiveRef;
60
67
typedef RustArchiveMember *LLVMRustArchiveMemberRef;
68
+ typedef RustArchiveMemberBuffer *LLVMRustArchiveMemberBufferRef;
61
69
typedef Archive::Child *LLVMRustArchiveChildRef;
62
70
typedef Archive::Child const *LLVMRustArchiveChildConstRef;
63
71
typedef RustArchiveIterator *LLVMRustArchiveIteratorRef;
@@ -155,7 +163,7 @@ LLVMRustArchiveChildName(LLVMRustArchiveChildConstRef Child, size_t *Size) {
155
163
}
156
164
157
165
extern " C" LLVMRustArchiveMemberRef
158
- LLVMRustArchiveMemberNew (char *Filename, char *Name,
166
+ LLVMRustArchiveMemberNewFile (char *Filename, char *Name,
159
167
LLVMRustArchiveChildRef Child) {
160
168
RustArchiveMember *Member = new RustArchiveMember;
161
169
Member->Filename = Filename;
@@ -165,13 +173,26 @@ LLVMRustArchiveMemberNew(char *Filename, char *Name,
165
173
return Member;
166
174
}
167
175
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
+
168
183
extern " C" void LLVMRustArchiveMemberFree (LLVMRustArchiveMemberRef Member) {
169
184
delete Member;
170
185
}
171
186
187
+ extern " C" void LLVMRustArchiveMemberBufferFree (LLVMRustArchiveMemberBufferRef Member) {
188
+ delete Member;
189
+ }
190
+
172
191
extern " C" LLVMRustResult
173
192
LLVMRustWriteArchive (char *Dst, size_t NumMembers,
174
193
const LLVMRustArchiveMemberRef *NewMembers,
194
+ size_t NumMemberBuffers,
195
+ const LLVMRustArchiveMemberBufferRef *NewMemberBuffers,
175
196
bool WriteSymbtab, LLVMRustArchiveKind RustKind) {
176
197
177
198
std::vector<NewArchiveMember> Members;
@@ -181,6 +202,7 @@ LLVMRustWriteArchive(char *Dst, size_t NumMembers,
181
202
auto Member = NewMembers[I];
182
203
assert (Member->Name );
183
204
if (Member->Filename ) {
205
+ // file
184
206
Expected<NewArchiveMember> MOrErr =
185
207
NewArchiveMember::getFile (Member->Filename , true );
186
208
if (!MOrErr) {
@@ -190,6 +212,7 @@ LLVMRustWriteArchive(char *Dst, size_t NumMembers,
190
212
MOrErr->MemberName = sys::path::filename (MOrErr->MemberName );
191
213
Members.push_back (std::move (*MOrErr));
192
214
} else {
215
+ // archive
193
216
Expected<NewArchiveMember> MOrErr =
194
217
NewArchiveMember::getOldMember (Member->Child , true );
195
218
if (!MOrErr) {
@@ -199,6 +222,11 @@ LLVMRustWriteArchive(char *Dst, size_t NumMembers,
199
222
Members.push_back (std::move (*MOrErr));
200
223
}
201
224
}
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
+ }
202
230
203
231
auto Result = writeArchive (Dst, Members, WriteSymbtab, Kind, true , false );
204
232
if (!Result)
0 commit comments