[llvm] r316813 - Revert "Add support for writing 64-bit symbol tables for archives when offsets become too large for 32-bit"

Jake Ehrlich via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 31 17:27:24 PDT 2017


Sorry about that. I'm working on solving the problem. Basically the test
was causing out of memory errors on various systems. I think restricting to
64-bit linux bots should solve the problem. Unfortunately I need to add
some features to llvm-lit to make that work.

On Fri, Oct 27, 2017 at 5:04 PM Rafael Avila de Espindola <
rafael.espindola at gmail.com> wrote:

> It is common practice to say in the commit message why something is
> being reverted.
>
> Cheers,
> Rafael
>
> Jake Ehrlich via llvm-commits <llvm-commits at lists.llvm.org> writes:
>
> > Author: jakehehrlich
> > Date: Fri Oct 27 16:39:31 2017
> > New Revision: 316813
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=316813&view=rev
> > Log:
> > Revert "Add support for writing 64-bit symbol tables for archives when
> offsets become too large for 32-bit"
> >
> > This reverts commit r316805.
> >
> > Removed:
> >     llvm/trunk/test/Object/archive-SYM64-write.test
> > Modified:
> >     llvm/trunk/lib/Object/ArchiveWriter.cpp
> >
> > Modified: llvm/trunk/lib/Object/ArchiveWriter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ArchiveWriter.cpp?rev=316813&r1=316812&r2=316813&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Object/ArchiveWriter.cpp (original)
> > +++ llvm/trunk/lib/Object/ArchiveWriter.cpp Fri Oct 27 16:39:31 2017
> > @@ -122,11 +122,11 @@ static void printWithSpacePadding(raw_os
> >  static bool isBSDLike(object::Archive::Kind Kind) {
> >    switch (Kind) {
> >    case object::Archive::K_GNU:
> > -  case object::Archive::K_GNU64:
> >      return false;
> >    case object::Archive::K_BSD:
> >    case object::Archive::K_DARWIN:
> >      return true;
> > +  case object::Archive::K_GNU64:
> >    case object::Archive::K_DARWIN64:
> >    case object::Archive::K_COFF:
> >      break;
> > @@ -134,8 +134,8 @@ static bool isBSDLike(object::Archive::K
> >    llvm_unreachable("not supported for writting");
> >  }
> >
> > -template <class T>
> > -static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val) {
> > +static void print32(raw_ostream &Out, object::Archive::Kind Kind,
> > +                    uint32_t Val) {
> >    if (isBSDLike(Kind))
> >      support::endian::Writer<support::little>(Out).write(Val);
> >    else
> > @@ -216,20 +216,6 @@ static std::string computeRelativePath(S
> >    return Relative.str();
> >  }
> >
> > -static bool is64BitKind(object::Archive::Kind Kind) {
> > -  switch (Kind) {
> > -  case object::Archive::K_GNU:
> > -  case object::Archive::K_BSD:
> > -  case object::Archive::K_DARWIN:
> > -  case object::Archive::K_COFF:
> > -    return false;
> > -  case object::Archive::K_DARWIN64:
> > -  case object::Archive::K_GNU64:
> > -    return true;
> > -  }
> > -  llvm_unreachable("not supported for writting");
> > -}
> > -
> >  static void addToStringTable(raw_ostream &Out, StringRef ArcName,
> >                               const NewArchiveMember &M, bool Thin) {
> >    StringRef ID = M.Buf->getBufferIdentifier();
> > @@ -302,14 +288,6 @@ static bool isArchiveSymbol(const object
> >    return true;
> >  }
> >
> > -static void printNBits(raw_ostream &Out, object::Archive::Kind Kind,
> > -                       uint64_t Val) {
> > -  if (is64BitKind(Kind))
> > -    print<uint64_t>(Out, Kind, Val);
> > -  else
> > -    print<uint32_t>(Out, Kind, Val);
> > -}
> > -
> >  static void writeSymbolTable(raw_ostream &Out, object::Archive::Kind
> Kind,
> >                               bool Deterministic, ArrayRef<MemberData>
> Members,
> >                               StringRef StringTable) {
> > @@ -321,11 +299,9 @@ static void writeSymbolTable(raw_ostream
> >      NumSyms += M.Symbols.size();
> >
> >    unsigned Size = 0;
> > -  Size += is64BitKind(Kind) ? 8 : 4; // Number of entries
> > +  Size += 4; // Number of entries
> >    if (isBSDLike(Kind))
> >      Size += NumSyms * 8; // Table
> > -  else if (is64BitKind(Kind))
> > -    Size += NumSyms * 8; // Table
> >    else
> >      Size += NumSyms * 4; // Table
> >    if (isBSDLike(Kind))
> > @@ -342,30 +318,27 @@ static void writeSymbolTable(raw_ostream
> >    if (isBSDLike(Kind))
> >      printBSDMemberHeader(Out, Out.tell(), "__.SYMDEF",
> now(Deterministic), 0, 0,
> >                           0, Size);
> > -  else if (is64BitKind(Kind))
> > -    printGNUSmallMemberHeader(Out, "/SYM64", now(Deterministic), 0, 0,
> 0, Size);
> >    else
> >      printGNUSmallMemberHeader(Out, "", now(Deterministic), 0, 0, 0,
> Size);
> >
> >    uint64_t Pos = Out.tell() + Size;
> >
> >    if (isBSDLike(Kind))
> > -    print<uint32_t>(Out, Kind, NumSyms * 8);
> > +    print32(Out, Kind, NumSyms * 8);
> >    else
> > -    printNBits(Out, Kind, NumSyms);
> > +    print32(Out, Kind, NumSyms);
> >
> >    for (const MemberData &M : Members) {
> >      for (unsigned StringOffset : M.Symbols) {
> >        if (isBSDLike(Kind))
> > -        print<uint32_t>(Out, Kind, StringOffset);
> > -      printNBits(Out, Kind, Pos); // member offset
> > +        print32(Out, Kind, StringOffset);
> > +      print32(Out, Kind, Pos); // member offset
> >      }
> >      Pos += M.Header.size() + M.Data.size() + M.Padding.size();
> >    }
> >
> >    if (isBSDLike(Kind))
> > -    // byte count of the string table
> > -    print<uint32_t>(Out, Kind, StringTable.size());
> > +    print32(Out, Kind, StringTable.size()); // byte count of the string
> table
> >    Out << StringTable;
> >
> >    while (Pad--)
> > @@ -469,25 +442,6 @@ Error llvm::writeArchive(StringRef ArcNa
> >    if (!StringTableBuf.empty())
> >      Data.insert(Data.begin(), computeStringTable(StringTableBuf));
> >
> > -  // We would like to detect if we need to switch to a 64-bit symbol
> table.
> > -  if (WriteSymtab) {
> > -    uint64_t MaxOffset = 0;
> > -    uint64_t LastOffset = MaxOffset;
> > -    for (const auto& M : Data) {
> > -      // Record the start of the member's offset
> > -      LastOffset = MaxOffset;
> > -      // Account for the size of each part associated with the member.
> > -      MaxOffset += M.Header.size() + M.Data.size() + M.Padding.size();
> > -      // We assume 32-bit symbols to see if 32-bit symbols are possible
> or not.
> > -      MaxOffset += M.Symbols.size() * 4;
> > -    }
> > -    // If LastOffset isn't going to fit in a 32-bit varible we need to
> switch
> > -    // to 64-bit. Note that the file can be larger than 4GB as long as
> the last
> > -    // member starts before the 4GB offset.
> > -    if (LastOffset >> 32 != 0)
> > -      Kind = object::Archive::K_GNU64;
> > -  }
> > -
> >    SmallString<128> TmpArchive;
> >    int TmpArchiveFD;
> >    if (auto EC = sys::fs::createUniqueFile(ArcName +
> ".temp-archive-%%%%%%%.a",
> >
> > Removed: llvm/trunk/test/Object/archive-SYM64-write.test
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/archive-SYM64-write.test?rev=316812&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/Object/archive-SYM64-write.test (original)
> > +++ llvm/trunk/test/Object/archive-SYM64-write.test (removed)
> > @@ -1,31 +0,0 @@
> > -# RUN: yaml2obj %s > %t
> > -# RUN: rm -f %t.lib
> > -# RUN: cp %t %t2
> > -# RUN: llvm-ar cr %t.lib %t %t2 %p/Inputs/trivial-object-test.elf-x86-64
> > -# RUN: llvm-nm --print-armap %t.lib | FileCheck %s
> > -
> > -!ELF
> > -FileHeader:
> > -  Class:           ELFCLASS64
> > -  Data:            ELFDATA2LSB
> > -  Type:            ET_EXEC
> > -  Machine:         EM_X86_64
> > -Sections:
> > -  - Name:            .data
> > -    Type:            SHT_PROGBITS
> > -    Flags:           [ SHF_ALLOC ]
> > -    AddressAlign:    0x0000000000000001
> > -    Content:         "00"
> > -    Size:            2147483648 <(214)%20748-3648>
> > -
> > -# CHECK:      Archive map
> > -# CHECK-NEXT: main in trivial-object-test.elf-x86-64
> > -
> > -# CHECK:    archive-SYM64-write.test.tmp:
> > -
> > -# CHECK:    archive-SYM64-write.test.tmp2:
> > -
> > -# CHECK:    trivial-object-test.elf-x86-64:
> > -# CHECK-NEXT:                     U SomeOtherFunction
> > -# CHECK-NEXT:    0000000000000000 T main
> > -# CHECK-NEXT:                     U puts
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171101/2378314a/attachment.html>


More information about the llvm-commits mailing list