<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jul 28, 2015 at 4:37 PM, Michael Spencer <span dir="ltr"><<a href="mailto:bigcheesegs@gmail.com" target="_blank">bigcheesegs@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Tue, Jul 28, 2015 at 4:22 PM, Chandler Carruth <<a href="mailto:chandlerc@google.com">chandlerc@google.com</a>> wrote:<br>
> On Tue, Jul 28, 2015 at 4:01 PM Michael J. Spencer <<a href="mailto:bigcheesegs@gmail.com">bigcheesegs@gmail.com</a>><br>
<span class="">> wrote:<br>
>><br>
>> Author: mspencer<br>
>> Date: Tue Jul 28 17:58:25 2015<br>
>> New Revision: 243496<br>
>><br>
</span>>> 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=nbYB1OYyFPnDJ3jUMs43THu1HJisILI15442A9ij84U&s=xyM1flDpuRG3gSXJ53009u788glzfiV13p4RCwwpx5c&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=243496&view=rev</a><br>
<span class="">>> Log:<br>
>> [ELF2] Devirtualize SymbolBody.<br>
><br>
><br>
> Could you outline the specific benefits you're hoping to achieve here?<br>
> Memory reduction, speed, even just readability?<br>
><br>
> I just think a bit more context would help folks reading the patches.<br>
<br>
</span>The goal here is to reduce divergence from the COFF linker. It is also<br>
expected that the same performance issues addressed by this change<br>
(r241001) in the COFF linker will be encountered by the ELF linker,<br>
and it's easier to build it right the first time.<br></blockquote><div><br></div><div>Thank you for doing this! </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
- Michael Spencer<br>
<span class=""><br>
>><br>
>><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:<br>
</span><span class="">>> <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=nbYB1OYyFPnDJ3jUMs43THu1HJisILI15442A9ij84U&s=Zwsei_2ngXeHerCbMrXhtuBoteg3K8NKirz1DoR6LGU&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>
>> ==============================================================================<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:<br>
</span><div><div class="h5">>> <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=nbYB1OYyFPnDJ3jUMs43THu1HJisILI15442A9ij84U&s=_xPzGGInMpJ7bkwFK2KZk9469cyodjJijUccuAbOm5w&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>
>><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 =<br>
>> 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<br>
>> *S)<br>
>> +    : Defined(DefinedRegularKind, getSymbolName<ELFT>(F->getObj(), S)),<br>
>> 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:<br>
</div></div><div><div class="h5">>> <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=nbYB1OYyFPnDJ3jUMs43THu1HJisILI15442A9ij84U&s=TELm7GElOUpmB1qnUHQKHbu0AEnD2dLzjcdc9KKg2C8&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>
>><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),<br>
>> 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>
</div></div>>> <a href="mailto:llvm-commits@cs.uiuc.edu">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>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">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>
</div></div></blockquote></div><br></div></div>