@@ -117,10 +117,25 @@ static void printMemberHeader(raw_fd_ostream &Out, StringRef Name,
117
117
}
118
118
119
119
static void
120
- printMemberHeader (raw_fd_ostream &Out, StringRef Name,
120
+ printMemberHeader (raw_fd_ostream &Out, object::Archive::Kind Kind,
121
+ StringRef Name,
121
122
std::vector<unsigned >::iterator &StringMapIndexIter,
122
123
const sys::TimeValue &ModTime, unsigned UID, unsigned GID,
123
124
unsigned Perms, unsigned Size ) {
125
+ if (Kind == object::Archive::K_BSD) {
126
+ uint64_t PosAfterHeader = Out.tell () + 60 + Name.size ();
127
+ // Pad so that even 64 bit object files are aligned.
128
+ unsigned Pad = OffsetToAlignment (PosAfterHeader, 8 );
129
+ unsigned NameWithPadding = Name.size () + Pad;
130
+ printWithSpacePadding (Out, Twine (" #1/" ) + Twine (NameWithPadding), 16 );
131
+ printRestOfMemberHeader (Out, ModTime, UID, GID, Perms,
132
+ NameWithPadding + Size );
133
+ Out << Name;
134
+ assert (PosAfterHeader == Out.tell ());
135
+ while (Pad--)
136
+ Out.write (uint8_t (0 ));
137
+ return ;
138
+ }
124
139
if (Name.size () < 16 ) {
125
140
printMemberHeader (Out, Name, ModTime, UID, GID, Perms, Size );
126
141
return ;
@@ -160,9 +175,13 @@ static void writeStringTable(raw_fd_ostream &Out,
160
175
161
176
// Returns the offset of the first reference to a member offset.
162
177
static ErrorOr<unsigned >
163
- writeSymbolTable (raw_fd_ostream &Out, ArrayRef<NewArchiveIterator> Members,
178
+ writeSymbolTable (raw_fd_ostream &Out, object::Archive::Kind Kind,
179
+ ArrayRef<NewArchiveIterator> Members,
164
180
ArrayRef<MemoryBufferRef> Buffers,
165
181
std::vector<unsigned > &MemberOffsetRefs) {
182
+ if (Kind != object::Archive::K_GNU)
183
+ return 0 ;
184
+
166
185
unsigned StartOffset = 0 ;
167
186
unsigned MemberNum = 0 ;
168
187
std::string NameBuf;
@@ -222,7 +241,7 @@ writeSymbolTable(raw_fd_ostream &Out, ArrayRef<NewArchiveIterator> Members,
222
241
std::pair<StringRef, std::error_code>
223
242
llvm::writeArchive (StringRef ArcName,
224
243
std::vector<NewArchiveIterator> &NewMembers,
225
- bool WriteSymtab) {
244
+ bool WriteSymtab, object::Archive::Kind Kind ) {
226
245
SmallString<128 > TmpArchive;
227
246
int TmpArchiveFD;
228
247
if (auto EC = sys::fs::createUniqueFile (ArcName + " .temp-archive-%%%%%%%.a" ,
@@ -274,14 +293,15 @@ llvm::writeArchive(StringRef ArcName,
274
293
unsigned MemberReferenceOffset = 0 ;
275
294
if (WriteSymtab) {
276
295
ErrorOr<unsigned > MemberReferenceOffsetOrErr =
277
- writeSymbolTable (Out, NewMembers, Members, MemberOffsetRefs);
296
+ writeSymbolTable (Out, Kind, NewMembers, Members, MemberOffsetRefs);
278
297
if (auto EC = MemberReferenceOffsetOrErr.getError ())
279
298
return std::make_pair (ArcName, EC);
280
299
MemberReferenceOffset = MemberReferenceOffsetOrErr.get ();
281
300
}
282
301
283
302
std::vector<unsigned > StringMapIndexes;
284
- writeStringTable (Out, NewMembers, StringMapIndexes);
303
+ if (Kind != object::Archive::K_BSD)
304
+ writeStringTable (Out, NewMembers, StringMapIndexes);
285
305
286
306
unsigned MemberNum = 0 ;
287
307
unsigned NewMemberNum = 0 ;
@@ -296,13 +316,13 @@ llvm::writeArchive(StringRef ArcName,
296
316
if (I.isNewMember ()) {
297
317
StringRef FileName = I.getNew ();
298
318
const sys::fs::file_status &Status = NewMemberStatus[NewMemberNum++];
299
- printMemberHeader (Out, sys::path::filename (FileName), StringMapIndexIter ,
300
- Status. getLastModificationTime () , Status.getUser (),
301
- Status.getGroup (), Status.permissions (),
302
- Status.getSize ());
319
+ printMemberHeader (Out, Kind, sys::path::filename (FileName),
320
+ StringMapIndexIter , Status.getLastModificationTime (),
321
+ Status.getUser (), Status.getGroup (),
322
+ Status.permissions (), Status. getSize ());
303
323
} else {
304
324
object::Archive::child_iterator OldMember = I.getOld ();
305
- printMemberHeader (Out, I.getName (), StringMapIndexIter,
325
+ printMemberHeader (Out, Kind, I.getName (), StringMapIndexIter,
306
326
OldMember->getLastModified (), OldMember->getUID (),
307
327
OldMember->getGID (), OldMember->getAccessMode (),
308
328
OldMember->getSize ());
0 commit comments