From f0ad811b54b5234d038522c5e1592dc056069351 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Wed, 19 Dec 2018 16:15:05 +0000 Subject: [Object] Deduplicate long archive member names Summary: Import libraries as created by llvm-dlltool always use the same archive member name for every object file (namely, the DLL library name). Ensure that long names are not repeatedly stored in the string table. Reviewed By: ruiu Differential Revision: https://reviews.llvm.org/D55860 llvm-svn: 349637 --- llvm/lib/Object/ArchiveWriter.cpp | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'llvm/lib/Object/ArchiveWriter.cpp') diff --git a/llvm/lib/Object/ArchiveWriter.cpp b/llvm/lib/Object/ArchiveWriter.cpp index 767205390e0..4de5871c7ec 100644 --- a/llvm/lib/Object/ArchiveWriter.cpp +++ b/llvm/lib/Object/ArchiveWriter.cpp @@ -250,6 +250,7 @@ static void addToStringTable(raw_ostream &Out, StringRef ArcName, static void printMemberHeader(raw_ostream &Out, uint64_t Pos, raw_ostream &StringTable, + StringMap &MemberNames, object::Archive::Kind Kind, bool Thin, StringRef ArcName, const NewArchiveMember &M, sys::TimePoint ModTime, @@ -262,8 +263,20 @@ static void printMemberHeader(raw_ostream &Out, uint64_t Pos, return printGNUSmallMemberHeader(Out, M.MemberName, ModTime, M.UID, M.GID, M.Perms, Size); Out << '/'; - uint64_t NamePos = StringTable.tell(); - addToStringTable(StringTable, ArcName, M, Thin); + uint64_t NamePos; + if (Thin) { + NamePos = StringTable.tell(); + addToStringTable(StringTable, ArcName, M, Thin); + } else { + StringMap::const_iterator it = MemberNames.find(M.MemberName); + if (it == MemberNames.end()) { + NamePos = StringTable.tell(); + addToStringTable(StringTable, ArcName, M, Thin); + MemberNames[M.MemberName] = NamePos; + } else { + NamePos = it->second; + } + } printWithSpacePadding(Out, NamePos, 15); printRestOfMemberHeader(Out, ModTime, M.UID, M.GID, M.Perms, Size); } @@ -433,6 +446,11 @@ computeMemberData(raw_ostream &StringTable, raw_ostream &SymNames, std::vector Ret; bool HasObject = false; + // Deduplicate long member names in the string table and reuse earlier name + // offsets. This especially saves space for COFF Import libraries where all + // members have the same name. + StringMap MemberNames; + // UniqueTimestamps is a special case to improve debugging on Darwin: // // The Darwin linker does not link debug info into the final @@ -505,8 +523,8 @@ computeMemberData(raw_ostream &StringTable, raw_ostream &SymNames, ModTime = sys::toTimePoint(FilenameCount[M.MemberName]++); else ModTime = M.ModTime; - printMemberHeader(Out, Pos, StringTable, Kind, Thin, ArcName, M, ModTime, - Buf.getBufferSize() + MemberPadding); + printMemberHeader(Out, Pos, StringTable, MemberNames, Kind, Thin, ArcName, + M, ModTime, Buf.getBufferSize() + MemberPadding); Out.flush(); Expected> Symbols = -- cgit v1.2.3