[lld] r233128 - PECOFF: Reduce import table size.

Rui Ueyama ruiu at google.com
Tue Mar 24 15:43:58 PDT 2015


Author: ruiu
Date: Tue Mar 24 17:43:58 2015
New Revision: 233128

URL: http://llvm.org/viewvc/llvm-project?rev=233128&view=rev
Log:
PECOFF: Reduce import table size.

Import Lookup Table in Import Directory Table has the same contents
as Hint/Name Table. Symbol names imported from DLLs are pointed by
both Import Directory Table and Hint/Name Table. We had duplicate
strings there.

This patch eliminates that duplication to make the table smaller.
This should reduce binary size by the sum of lengths of imported
symbols.

Modified:
    lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp

Modified: lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp?rev=233128&r1=233127&r2=233128&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp Tue Mar 24 17:43:58 2015
@@ -69,6 +69,7 @@ static std::vector<ImportTableEntryAtom
 createImportTableAtoms(IdataContext &context,
                        const std::vector<COFFSharedLibraryAtom *> &sharedAtoms,
                        bool shouldAddReference, StringRef sectionName,
+                       std::map<StringRef, HintNameAtom *> &hintNameCache,
                        llvm::BumpPtrAllocator &alloc) {
   std::vector<ImportTableEntryAtom *> ret;
   for (COFFSharedLibraryAtom *atom : sharedAtoms) {
@@ -81,9 +82,16 @@ createImportTableAtoms(IdataContext &con
     } else {
       // Import by name
       entry = new (alloc) ImportTableEntryAtom(context, 0, sectionName);
-      HintNameAtom *hintName =
-          new (alloc) HintNameAtom(context, atom->hint(), atom->importName());
-      addDir32NBReloc(entry, hintName, context.ctx.getMachineType(), 0);
+      HintNameAtom *hintNameAtom;
+      auto it = hintNameCache.find(atom->importName());
+      if (it == hintNameCache.end()) {
+        hintNameAtom = new (alloc) HintNameAtom(
+            context, atom->hint(), atom->importName());
+        hintNameCache[atom->importName()] = hintNameAtom;
+      } else {
+        hintNameAtom = it->second;
+      }
+      addDir32NBReloc(entry, hintNameAtom, context.ctx.getMachineType(), 0);
     }
     ret.push_back(entry);
     if (shouldAddReference)
@@ -104,10 +112,13 @@ void ImportDirectoryAtom::addRelocations
   // same. The PE/COFF loader overwrites the import address tables with the
   // pointers to the referenced items after loading the executable into
   // memory.
+  std::map<StringRef, HintNameAtom *> hintNameCache;
   std::vector<ImportTableEntryAtom *> importLookupTables =
-      createImportTableAtoms(context, sharedAtoms, false, ".idata.t", _alloc);
+      createImportTableAtoms(context, sharedAtoms, false, ".idata.t",
+                             hintNameCache, _alloc);
   std::vector<ImportTableEntryAtom *> importAddressTables =
-      createImportTableAtoms(context, sharedAtoms, true, ".idata.a", _alloc);
+      createImportTableAtoms(context, sharedAtoms, true, ".idata.a",
+                             hintNameCache, _alloc);
 
   addDir32NBReloc(this, importLookupTables[0], context.ctx.getMachineType(),
                   offsetof(ImportDirectoryTableEntry, ImportLookupTableRVA));
@@ -157,8 +168,10 @@ void DelayImportDirectoryAtom::addReloca
   // as (non-delay) import table's Import Lookup Table. Contains
   // imported function names. This is a parallel array of AddressTable
   // field.
+  std::map<StringRef, HintNameAtom *> hintNameCache;
   std::vector<ImportTableEntryAtom *> nameTable =
-      createImportTableAtoms(context, sharedAtoms, false, ".didat", _alloc);
+      createImportTableAtoms(
+          context, sharedAtoms, false, ".didat", hintNameCache, _alloc);
   addDir32NBReloc(
       this, nameTable[0], context.ctx.getMachineType(),
       offsetof(delay_import_directory_table_entry, DelayImportNameTable));





More information about the llvm-commits mailing list