[llvm] r241721 - Start adding support for writing archives in BSD format.
Kevin Enderby
enderby at apple.com
Wed Jul 8 18:02:41 PDT 2015
Hi Rafael,
I had been working on the same support and noticed your changes today when I updated just now. I am heading out for the day but haven’t resolved my conflicts. I have the support for the symbol table done but if you get to that that and want to use yours that is fine.
I my version also had a separate darwin format which is BSD with 8 byte alignment. But if you see no need for that that is fine too.
Didn’t know I was duplicating your work. Catch up with you tomorrow,
Kev
> On Jul 8, 2015, at 1:47 PM, Rafael Espindola <rafael.espindola at gmail.com> wrote:
>
> Author: rafael
> Date: Wed Jul 8 15:47:32 2015
> New Revision: 241721
>
> URL: http://llvm.org/viewvc/llvm-project?rev=241721&view=rev
> Log:
> Start adding support for writing archives in BSD format.
>
> No support for the symbol table yet (but will hopefully add it today).
> We always use the long filename format so that we can align the member,
> which is an advantage of the BSD format.
>
> Modified:
> llvm/trunk/include/llvm/Object/ArchiveWriter.h
> llvm/trunk/lib/LibDriver/LibDriver.cpp
> llvm/trunk/lib/Object/ArchiveWriter.cpp
> llvm/trunk/test/Object/archive-format.test
> llvm/trunk/tools/llvm-ar/llvm-ar.cpp
>
> Modified: llvm/trunk/include/llvm/Object/ArchiveWriter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ArchiveWriter.h?rev=241721&r1=241720&r2=241721&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/ArchiveWriter.h (original)
> +++ llvm/trunk/include/llvm/Object/ArchiveWriter.h Wed Jul 8 15:47:32 2015
> @@ -44,8 +44,7 @@ public:
>
> std::pair<StringRef, std::error_code>
> writeArchive(StringRef ArcName, std::vector<NewArchiveIterator> &NewMembers,
> - bool WriteSymtab);
> -
> + bool WriteSymtab, object::Archive::Kind Kind);
> }
>
> #endif
>
> Modified: llvm/trunk/lib/LibDriver/LibDriver.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LibDriver/LibDriver.cpp?rev=241721&r1=241720&r2=241721&view=diff
> ==============================================================================
> --- llvm/trunk/lib/LibDriver/LibDriver.cpp (original)
> +++ llvm/trunk/lib/LibDriver/LibDriver.cpp Wed Jul 8 15:47:32 2015
> @@ -139,8 +139,10 @@ int llvm::libDriverMain(llvm::ArrayRef<c
> llvm::sys::path::filename(Arg->getValue()));
> }
>
> - std::pair<StringRef, std::error_code> Result = llvm::writeArchive(
> - getOutputPath(&Args, Members[0]), Members, /*WriteSymtab=*/true);
> + std::pair<StringRef, std::error_code> Result =
> + llvm::writeArchive(getOutputPath(&Args, Members[0]), Members,
> + /*WriteSymtab=*/true, object::Archive::K_GNU);
> +
> if (Result.second) {
> if (Result.first.empty())
> Result.first = ArgsArr[0];
>
> Modified: llvm/trunk/lib/Object/ArchiveWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ArchiveWriter.cpp?rev=241721&r1=241720&r2=241721&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/ArchiveWriter.cpp (original)
> +++ llvm/trunk/lib/Object/ArchiveWriter.cpp Wed Jul 8 15:47:32 2015
> @@ -117,10 +117,25 @@ static void printMemberHeader(raw_fd_ost
> }
>
> static void
> -printMemberHeader(raw_fd_ostream &Out, StringRef Name,
> +printMemberHeader(raw_fd_ostream &Out, object::Archive::Kind Kind,
> + StringRef Name,
> std::vector<unsigned>::iterator &StringMapIndexIter,
> const sys::TimeValue &ModTime, unsigned UID, unsigned GID,
> unsigned Perms, unsigned Size) {
> + if (Kind == object::Archive::K_BSD) {
> + uint64_t PosAfterHeader = Out.tell() + 60 + Name.size();
> + // Pad so that even 64 bit object files are aligned.
> + unsigned Pad = OffsetToAlignment(PosAfterHeader, 8);
> + unsigned NameWithPadding = Name.size() + Pad;
> + printWithSpacePadding(Out, Twine("#1/") + Twine(NameWithPadding), 16);
> + printRestOfMemberHeader(Out, ModTime, UID, GID, Perms,
> + NameWithPadding + Size);
> + Out << Name;
> + assert(PosAfterHeader == Out.tell());
> + while (Pad--)
> + Out.write(uint8_t(0));
> + return;
> + }
> if (Name.size() < 16) {
> printMemberHeader(Out, Name, ModTime, UID, GID, Perms, Size);
> return;
> @@ -160,9 +175,13 @@ static void writeStringTable(raw_fd_ostr
>
> // Returns the offset of the first reference to a member offset.
> static ErrorOr<unsigned>
> -writeSymbolTable(raw_fd_ostream &Out, ArrayRef<NewArchiveIterator> Members,
> +writeSymbolTable(raw_fd_ostream &Out, object::Archive::Kind Kind,
> + ArrayRef<NewArchiveIterator> Members,
> ArrayRef<MemoryBufferRef> Buffers,
> std::vector<unsigned> &MemberOffsetRefs) {
> + if (Kind != object::Archive::K_GNU)
> + return 0;
> +
> unsigned StartOffset = 0;
> unsigned MemberNum = 0;
> std::string NameBuf;
> @@ -222,7 +241,7 @@ writeSymbolTable(raw_fd_ostream &Out, Ar
> std::pair<StringRef, std::error_code>
> llvm::writeArchive(StringRef ArcName,
> std::vector<NewArchiveIterator> &NewMembers,
> - bool WriteSymtab) {
> + bool WriteSymtab, object::Archive::Kind Kind) {
> SmallString<128> TmpArchive;
> int TmpArchiveFD;
> if (auto EC = sys::fs::createUniqueFile(ArcName + ".temp-archive-%%%%%%%.a",
> @@ -274,14 +293,15 @@ llvm::writeArchive(StringRef ArcName,
> unsigned MemberReferenceOffset = 0;
> if (WriteSymtab) {
> ErrorOr<unsigned> MemberReferenceOffsetOrErr =
> - writeSymbolTable(Out, NewMembers, Members, MemberOffsetRefs);
> + writeSymbolTable(Out, Kind, NewMembers, Members, MemberOffsetRefs);
> if (auto EC = MemberReferenceOffsetOrErr.getError())
> return std::make_pair(ArcName, EC);
> MemberReferenceOffset = MemberReferenceOffsetOrErr.get();
> }
>
> std::vector<unsigned> StringMapIndexes;
> - writeStringTable(Out, NewMembers, StringMapIndexes);
> + if (Kind != object::Archive::K_BSD)
> + writeStringTable(Out, NewMembers, StringMapIndexes);
>
> unsigned MemberNum = 0;
> unsigned NewMemberNum = 0;
> @@ -296,13 +316,13 @@ llvm::writeArchive(StringRef ArcName,
> if (I.isNewMember()) {
> StringRef FileName = I.getNew();
> const sys::fs::file_status &Status = NewMemberStatus[NewMemberNum++];
> - printMemberHeader(Out, sys::path::filename(FileName), StringMapIndexIter,
> - Status.getLastModificationTime(), Status.getUser(),
> - Status.getGroup(), Status.permissions(),
> - Status.getSize());
> + printMemberHeader(Out, Kind, sys::path::filename(FileName),
> + StringMapIndexIter, Status.getLastModificationTime(),
> + Status.getUser(), Status.getGroup(),
> + Status.permissions(), Status.getSize());
> } else {
> object::Archive::child_iterator OldMember = I.getOld();
> - printMemberHeader(Out, I.getName(), StringMapIndexIter,
> + printMemberHeader(Out, Kind, I.getName(), StringMapIndexIter,
> OldMember->getLastModified(), OldMember->getUID(),
> OldMember->getGID(), OldMember->getAccessMode(),
> OldMember->getSize());
>
> Modified: llvm/trunk/test/Object/archive-format.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/archive-format.test?rev=241721&r1=241720&r2=241721&view=diff
> ==============================================================================
> --- llvm/trunk/test/Object/archive-format.test (original)
> +++ llvm/trunk/test/Object/archive-format.test Wed Jul 8 15:47:32 2015
> @@ -17,3 +17,13 @@ CHECK-NEXT: 0123456789abcdef/
> CHECK-NEXT: 0123456789abcde/{{................................}}4 `
> CHECK-NEXT: bar./0 {{................................}}4 `
> CHECK-NEXT: zed.
> +
> +RUN: rm -f test-bsd.a
> +RUN: llvm-ar --format=bsd rc test-bsd.a 0123456789abcde 0123456789abcdef
> +RUN: cat test-bsd.a | FileCheck -strict-whitespace --check-prefix=BSD %s
> +
> +BSD: !<arch>
> +BSD-NEXT: #1/20 {{..............................}} 24 `
> +BSD-NEXT: 0123456789abcde{{.....}}bar.
> +BSD-SAME: #1/16 {{..............................}} 20 `
> +BSD-NEXT: 0123456789abcdefzed.
>
> Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=241721&r1=241720&r2=241721&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-ar/llvm-ar.cpp (original)
> +++ llvm/trunk/tools/llvm-ar/llvm-ar.cpp Wed Jul 8 15:47:32 2015
> @@ -70,6 +70,16 @@ static cl::list<std::string>
>
> static cl::opt<bool> MRI("M", cl::desc(""));
>
> +namespace {
> +enum Format { Default, GNU, BSD };
> +}
> +
> +static cl::opt<Format>
> + FormatOpt("format", cl::desc("Archive format to create"),
> + cl::values(clEnumValN(Default, "defalut", "default"),
> + clEnumValN(GNU, "gnu", "gnu"),
> + clEnumValN(BSD, "bsd", "bsd"), clEnumValEnd));
> +
> std::string Options;
>
> // Provide additional help output explaining the operations and modifiers of
> @@ -539,15 +549,27 @@ computeNewArchiveMembers(ArchiveOperatio
> static void
> performWriteOperation(ArchiveOperation Operation, object::Archive *OldArchive,
> std::vector<NewArchiveIterator> *NewMembersP) {
> + object::Archive::Kind Kind;
> + switch (FormatOpt) {
> + case Default:
> + // FIXME: change as the support for other formats improve.
> + Kind = object::Archive::K_GNU;
> + case GNU:
> + Kind = object::Archive::K_GNU;
> + break;
> + case BSD:
> + Kind = object::Archive::K_BSD;
> + break;
> + }
> if (NewMembersP) {
> std::pair<StringRef, std::error_code> Result =
> - writeArchive(ArchiveName, *NewMembersP, Symtab);
> + writeArchive(ArchiveName, *NewMembersP, Symtab, Kind);
> failIfError(Result.second, Result.first);
> return;
> }
> std::vector<NewArchiveIterator> NewMembers =
> computeNewArchiveMembers(Operation, OldArchive);
> - auto Result = writeArchive(ArchiveName, NewMembers, Symtab);
> + auto Result = writeArchive(ArchiveName, NewMembers, Symtab, Kind);
> failIfError(Result.second, Result.first);
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list