<div dir="ltr">Was this commit intentional. Wasn't D19045 the intended solution?<div><br></div><div>-- Sean Silva</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Apr 14, 2016 at 12:17 PM, Rafael Espindola via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Thu Apr 14 14:17:16 2016<br>
New Revision: 266357<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=266357&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=266357&view=rev</a><br>
Log:<br>
Hash symbol names only once per global SymbolBody.<br>
<br>
The DenseMap doesn't store hash results. This means that when it is<br>
resized it has to recompute them.<br>
<br>
This patch is a small hack that wraps the StringRef in a struct that<br>
remembers the hash value. That way we can be sure it is only hashed<br>
once.<br>
<br>
Modified:<br>
    lld/trunk/ELF/MarkLive.cpp<br>
    lld/trunk/ELF/SymbolTable.h<br>
<br>
Modified: lld/trunk/ELF/MarkLive.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/MarkLive.cpp?rev=266357&r1=266356&r2=266357&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/MarkLive.cpp?rev=266357&r1=266356&r2=266357&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/MarkLive.cpp (original)<br>
+++ lld/trunk/ELF/MarkLive.cpp Thu Apr 14 14:17:16 2016<br>
@@ -113,7 +113,7 @@ template <class ELFT> void elf::markLive<br>
   // Preserve externally-visible symbols if the symbols defined by this<br>
   // file can interrupt other ELF file's symbols at runtime.<br>
   if (Config->Shared || Config->ExportDynamic) {<br>
-    for (const std::pair<StringRef, Symbol *> &P : Symtab->getSymbols()) {<br>
+    for (const std::pair<SymName, Symbol *> &P : Symtab->getSymbols()) {<br>
       SymbolBody *B = P.second->Body;<br>
       if (B->getVisibility() == STV_DEFAULT)<br>
         MarkSymbol(B);<br>
<br>
Modified: lld/trunk/ELF/SymbolTable.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=266357&r1=266356&r2=266357&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=266357&r1=266356&r2=266357&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/SymbolTable.h (original)<br>
+++ lld/trunk/ELF/SymbolTable.h Thu Apr 14 14:17:16 2016<br>
@@ -20,6 +20,37 @@ class Lazy;<br>
 template <class ELFT> class OutputSectionBase;<br>
 struct Symbol;<br>
<br>
+struct SymName {<br>
+  SymName(StringRef Name) : Name(Name) {<br>
+    Hash = llvm::DenseMapInfo<StringRef>::getHashValue(Name);<br>
+  }<br>
+  SymName(StringRef Name, unsigned Hash) : Name(Name), Hash(Hash) {}<br>
+  StringRef Name;<br>
+  unsigned Hash;<br>
+};<br>
+}<br>
+}<br>
+<br>
+namespace llvm {<br>
+template <> struct DenseMapInfo<lld::elf::SymName> {<br>
+  static lld::elf::SymName getEmptyKey() {<br>
+    StringRef N = DenseMapInfo<StringRef>::getEmptyKey();<br>
+    return {N, 0};<br>
+  }<br>
+  static lld::elf::SymName getTombstoneKey() {<br>
+    StringRef N = DenseMapInfo<StringRef>::getTombstoneKey();<br>
+    return {N, 0};<br>
+  }<br>
+  static unsigned getHashValue(lld::elf::SymName Name) { return Name.Hash; }<br>
+  static bool isEqual(lld::elf::SymName A, lld::elf::SymName B) {<br>
+    return A.Name == B.Name;<br>
+  }<br>
+};<br>
+}<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
 // SymbolTable is a bucket of all known symbols, including defined,<br>
 // undefined, or lazy symbols (the last one is symbols in archive<br>
 // files whose archive members are not yet loaded).<br>
@@ -38,7 +69,7 @@ public:<br>
   void addFile(std::unique_ptr<InputFile> File);<br>
   void addCombinedLtoObject();<br>
<br>
-  const llvm::MapVector<StringRef, Symbol *> &getSymbols() const {<br>
+  const llvm::MapVector<SymName, Symbol *> &getSymbols() const {<br>
     return Symtab;<br>
   }<br>
<br>
@@ -79,7 +110,7 @@ private:<br>
   // a bit inefficient.<br>
   // FIXME: Experiment with passing in a custom hashing or sorting the symbols<br>
   // once symbol resolution is finished.<br>
-  llvm::MapVector<StringRef, Symbol *> Symtab;<br>
+  llvm::MapVector<SymName, Symbol *> Symtab;<br>
   llvm::BumpPtrAllocator Alloc;<br>
<br>
   // Comdat groups define "link once" sections. If two comdat groups have the<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>