[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
Fri Oct 27 16:39:31 PDT 2017
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
-
-# 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
More information about the llvm-commits
mailing list