<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Tue, Jul 28, 2015 at 4:01 PM Michael J. Spencer <<a href="mailto:bigcheesegs@gmail.com">bigcheesegs@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mspencer<br>
Date: Tue Jul 28 17:58:25 2015<br>
New Revision: 243496<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D243496-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=z76wcPn1EY8tHXFPBdP63AwQO0T-lymEoCwgXPEaK4I&s=UBWuCPTZWC7GJSbvT8fTFghucfvLhJSWC-6B90R_pLI&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=243496&view=rev</a><br>
Log:<br>
[ELF2] Devirtualize SymbolBody.<br></blockquote><div><br></div><div>Could you outline the specific benefits you're hoping to achieve here? Memory reduction, speed, even just readability?</div><div><br></div><div>I just think a bit more context would help folks reading the patches. </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Modified:<br>
    lld/trunk/ELF/InputFiles.cpp<br>
    lld/trunk/ELF/Symbols.cpp<br>
    lld/trunk/ELF/Symbols.h<br>
<br>
Modified: lld/trunk/ELF/InputFiles.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_InputFiles.cpp-3Frev-3D243496-26r1-3D243495-26r2-3D243496-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=z76wcPn1EY8tHXFPBdP63AwQO0T-lymEoCwgXPEaK4I&s=8C53j06O9LMpFIe7-cz3AT5CjApjsrvr27RrlYgL3og&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=243496&r1=243495&r2=243496&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/InputFiles.cpp (original)<br>
+++ lld/trunk/ELF/InputFiles.cpp Tue Jul 28 17:58:25 2015<br>
@@ -65,7 +65,7 @@ SymbolBody *elf2::ObjectFile<ELFT>::crea<br>
   StringRef Name = *NameOrErr;<br>
   if (Sym->isUndefined())<br>
     return new (Alloc) Undefined(Name);<br>
-  return new (Alloc) DefinedRegular<ELFT>(Name);<br>
+  return new (Alloc) DefinedRegular<ELFT>(this, Sym);<br>
 }<br>
<br>
 namespace lld {<br>
<br>
Modified: lld/trunk/ELF/Symbols.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Symbols.cpp-3Frev-3D243496-26r1-3D243495-26r2-3D243496-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=z76wcPn1EY8tHXFPBdP63AwQO0T-lymEoCwgXPEaK4I&s=mbGcOOvOifL42r6yvnMC7-6n6ONffvs8A3zbN6XiKuA&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=243496&r1=243495&r2=243496&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Symbols.cpp (original)<br>
+++ lld/trunk/ELF/Symbols.cpp Tue Jul 28 17:58:25 2015<br>
@@ -9,12 +9,30 @@<br>
<br>
 #include "Symbols.h"<br>
 #include "Chunks.h"<br>
+#include "InputFiles.h"<br>
<br>
 using namespace llvm::object;<br>
<br>
 using namespace lld;<br>
 using namespace lld::elf2;<br>
<br>
+template <class ELFT><br>
+StringRef<br>
+getSymbolName(const llvm::object::ELFFile<ELFT> *F,<br>
+  const typename llvm::object::ELFFile<ELFT>::Elf_Sym *S) {<br>
+  ErrorOr<StringRef> StrTab = F->getStringTableForSymtab(*F->getDotSymtabSec());<br>
+  if (!StrTab || S->st_name >= StrTab->size())<br>
+    llvm::report_fatal_error("Invalid string table.");<br>
+  return StrTab->data() + S->st_name;<br>
+}<br>
+<br>
+template <class ELFT><br>
+DefinedRegular<ELFT>::DefinedRegular(ObjectFile<ELFT> *F, const Elf_Sym *S)<br>
+    : Defined(DefinedRegularKind, getSymbolName<ELFT>(F->getObj(), S)), File(F),<br>
+      Sym(S) {<br>
+  IsExternal = S->isExternal();<br>
+}<br>
+<br>
 // Returns 1, 0 or -1 if this symbol should take precedence<br>
 // over the Other, tie or lose, respectively.<br>
 int SymbolBody::compare(SymbolBody *Other) {<br>
<br>
Modified: lld/trunk/ELF/Symbols.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Symbols.h-3Frev-3D243496-26r1-3D243495-26r2-3D243496-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=z76wcPn1EY8tHXFPBdP63AwQO0T-lymEoCwgXPEaK4I&s=X2OLsKVibPJXXNxuxZEznN343Df9vVgpMXt9R58IZ9U&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=243496&r1=243495&r2=243496&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Symbols.h (original)<br>
+++ lld/trunk/ELF/Symbols.h Tue Jul 28 17:58:25 2015<br>
@@ -21,6 +21,7 @@ using llvm::object::ELFFile;<br>
 class Chunk;<br>
 class InputFile;<br>
 class SymbolBody;<br>
+template <class ELFT> class ObjectFile;<br>
<br>
 // A real symbol object, SymbolBody, is usually accessed indirectly<br>
 // through a Symbol. There's always one Symbol for each symbol name.<br>
@@ -40,14 +41,13 @@ public:<br>
     UndefinedKind,<br>
   };<br>
<br>
-  Kind kind() const { return SymbolKind; }<br>
-  virtual ~SymbolBody() {}<br>
+  Kind kind() const { return static_cast<Kind>(SymbolKind); }<br>
<br>
   // Returns true if this is an external symbol.<br>
-  virtual bool isExternal() { return true; }<br>
+  bool isExternal() const { return true; }<br>
<br>
   // Returns the symbol name.<br>
-  virtual StringRef getName() = 0;<br>
+  StringRef getName() const { return Name; }<br>
<br>
   // A SymbolBody has a backreference to a Symbol. Originally they are<br>
   // doubly-linked. A backreference will never change. But the pointer<br>
@@ -64,10 +64,13 @@ public:<br>
   int compare(SymbolBody *Other);<br>
<br>
 protected:<br>
-  SymbolBody(Kind K) : SymbolKind(K) {}<br>
+  SymbolBody(Kind K, StringRef N = "")<br>
+      : SymbolKind(K), IsExternal(true), Name(N) {}<br>
<br>
-private:<br>
-  const Kind SymbolKind;<br>
+protected:<br>
+  const unsigned SymbolKind : 8;<br>
+  unsigned IsExternal : 1;<br>
+  StringRef Name;<br>
   Symbol *Backref = nullptr;<br>
 };<br>
<br>
@@ -75,7 +78,7 @@ private:<br>
 // etc.<br>
 class Defined : public SymbolBody {<br>
 public:<br>
-  Defined(Kind K) : SymbolBody(K) {}<br>
+  Defined(Kind K, StringRef N = "") : SymbolBody(K, N) {}<br>
<br>
   static bool classof(const SymbolBody *S) {<br>
     Kind K = S->kind();<br>
@@ -85,31 +88,28 @@ public:<br>
<br>
 // Regular defined symbols read from object file symbol tables.<br>
 template <class ELFT> class DefinedRegular : public Defined {<br>
+  typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;<br>
+<br>
 public:<br>
-  DefinedRegular(StringRef Name) : Defined(DefinedRegularKind), Name(Name) {}<br>
+  DefinedRegular(ObjectFile<ELFT> *F, const Elf_Sym *S);<br>
<br>
   static bool classof(const SymbolBody *S) {<br>
     return S->kind() == DefinedRegularKind;<br>
   }<br>
<br>
-  StringRef getName() override { return Name; }<br>
-<br>
 private:<br>
-  StringRef Name;<br>
+  ObjectFile<ELFT> *File;<br>
+  const Elf_Sym *Sym;<br>
 };<br>
<br>
 // Undefined symbols.<br>
 class Undefined : public SymbolBody {<br>
 public:<br>
-  explicit Undefined(StringRef N) : SymbolBody(UndefinedKind), Name(N) {}<br>
+  explicit Undefined(StringRef N) : SymbolBody(UndefinedKind, N) {}<br>
<br>
   static bool classof(const SymbolBody *S) {<br>
     return S->kind() == UndefinedKind;<br>
   }<br>
-  StringRef getName() override { return Name; }<br>
-<br>
-private:<br>
-  StringRef Name;<br>
 };<br>
<br>
 } // namespace elf2<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>