<div dir="ltr">This is awesome! Thank you so much for doing this.<div><br></div><div>One question I have is why don't you merge ObjectFileBase with ObjectFile and SharedFileBase with SharedFile? It seems you can remove one extra hierarchy.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Oct 11, 2015 at 6:55 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: Sun Oct 11 20:55:32 2015<br>
New Revision: 250005<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=250005&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=250005&view=rev</a><br>
Log:<br>
Simplify the InputFile type hierarchy.<br>
<br>
Now that the SymbolTable is templated, we don't need the ELFData class or<br>
multiple inheritance.<br>
<br>
Modified:<br>
    lld/trunk/ELF/Config.h<br>
    lld/trunk/ELF/Driver.cpp<br>
    lld/trunk/ELF/Driver.h<br>
    lld/trunk/ELF/InputFiles.cpp<br>
    lld/trunk/ELF/InputFiles.h<br>
    lld/trunk/ELF/SymbolTable.cpp<br>
    lld/trunk/ELF/SymbolTable.h<br>
    lld/trunk/ELF/Writer.cpp<br>
<br>
Modified: lld/trunk/ELF/Config.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=250005&r1=250004&r2=250005&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=250005&r1=250004&r2=250005&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Config.h (original)<br>
+++ lld/trunk/ELF/Config.h Sun Oct 11 20:55:32 2015<br>
@@ -18,7 +18,7 @@<br>
 namespace lld {<br>
 namespace elf2 {<br>
<br>
-class ELFFileBase;<br>
+class InputFile;<br>
 class SymbolBody;<br>
<br>
 enum ELFKind {<br>
@@ -31,7 +31,7 @@ enum ELFKind {<br>
<br>
 struct Configuration {<br>
   SymbolBody *EntrySym = nullptr;<br>
-  ELFFileBase *FirstElf = nullptr;<br>
+  InputFile *FirstElf = nullptr;<br>
   llvm::StringRef DynamicLinker;<br>
   llvm::StringRef Entry;<br>
   llvm::StringRef Emulation;<br>
<br>
Modified: lld/trunk/ELF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=250005&r1=250004&r2=250005&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=250005&r1=250004&r2=250005&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Driver.cpp (original)<br>
+++ lld/trunk/ELF/Driver.cpp Sun Oct 11 20:55:32 2015<br>
@@ -100,12 +100,9 @@ void LinkerDriver::addFile(StringRef Pat<br>
     }<br>
     Files.push_back(make_unique<ArchiveFile>(MBRef));<br>
     return;<br>
-  case file_magic::elf_shared_object: {<br>
-    std::unique_ptr<ELFFileBase> File = createELFFile<SharedFile>(MBRef);<br>
-    cast<SharedFileBase>(File.get())->AsNeeded = Config->AsNeeded;<br>
-    Files.push_back(std::move(File));<br>
+  case file_magic::elf_shared_object:<br>
+    Files.push_back(createELFFile<SharedFile>(MBRef));<br>
     return;<br>
-  }<br>
   default:<br>
     Files.push_back(createELFFile<ObjectFile>(MBRef));<br>
   }<br>
<br>
Modified: lld/trunk/ELF/Driver.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.h?rev=250005&r1=250004&r2=250005&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.h?rev=250005&r1=250004&r2=250005&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Driver.h (original)<br>
+++ lld/trunk/ELF/Driver.h Sun Oct 11 20:55:32 2015<br>
@@ -33,7 +33,7 @@ public:<br>
<br>
 private:<br>
   template <template <class> class T><br>
-  std::unique_ptr<ELFFileBase> createELFInputFile(MemoryBufferRef MB);<br>
+  std::unique_ptr<InputFile> createELFInputFile(MemoryBufferRef MB);<br>
<br>
   llvm::BumpPtrAllocator Alloc;<br>
   bool WholeArchive = false;<br>
<br>
Modified: lld/trunk/ELF/InputFiles.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=250005&r1=250004&r2=250005&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=250005&r1=250004&r2=250005&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/InputFiles.cpp (original)<br>
+++ lld/trunk/ELF/InputFiles.cpp Sun Oct 11 20:55:32 2015<br>
@@ -21,28 +21,6 @@ using namespace llvm::sys::fs;<br>
 using namespace lld;<br>
 using namespace lld::elf2;<br>
<br>
-template <class ELFT> static uint16_t getEMachine(const ELFFileBase &B) {<br>
-  bool IsShared = isa<SharedFileBase>(B);<br>
-  if (IsShared)<br>
-    return cast<SharedFile<ELFT>>(B).getEMachine();<br>
-  return cast<ObjectFile<ELFT>>(B).getEMachine();<br>
-}<br>
-<br>
-uint16_t ELFFileBase::getEMachine() const {<br>
-  switch (EKind) {<br>
-  case ELF32BEKind:<br>
-    return ::getEMachine<ELF32BE>(*this);<br>
-  case ELF32LEKind:<br>
-    return ::getEMachine<ELF32LE>(*this);<br>
-  case ELF64BEKind:<br>
-    return ::getEMachine<ELF64BE>(*this);<br>
-  case ELF64LEKind:<br>
-    return ::getEMachine<ELF64LE>(*this);<br>
-  default:<br>
-    llvm_unreachable("Invalid kind");<br>
-  }<br>
-}<br>
-<br>
 namespace {<br>
 class ECRAII {<br>
   std::error_code EC;<br>
@@ -54,12 +32,12 @@ public:<br>
 }<br>
<br>
 template <class ELFT><br>
-ELFData<ELFT>::ELFData(MemoryBufferRef MB)<br>
-    : ELFObj(MB.getBuffer(), ECRAII().getEC()) {}<br>
+ELFFileBase<ELFT>::ELFFileBase(Kind K, ELFKind EKind, MemoryBufferRef M)<br>
+    : InputFile(K, M), EKind(EKind), ELFObj(MB.getBuffer(), ECRAII().getEC()) {}<br>
<br>
 template <class ELFT><br>
-typename ELFData<ELFT>::Elf_Sym_Range<br>
-ELFData<ELFT>::getSymbolsHelper(bool Local) {<br>
+typename ELFFileBase<ELFT>::Elf_Sym_Range<br>
+ELFFileBase<ELFT>::getSymbolsHelper(bool Local) {<br>
   if (!Symtab)<br>
     return Elf_Sym_Range(nullptr, nullptr);<br>
   Elf_Sym_Range Syms = ELFObj.symbols(Symtab);<br>
@@ -73,7 +51,7 @@ ELFData<ELFT>::getSymbolsHelper(bool Loc<br>
   return make_range(Syms.begin() + 1, Syms.begin() + FirstNonLocal);<br>
 }<br>
<br>
-template <class ELFT> void ELFData<ELFT>::initStringTable() {<br>
+template <class ELFT> void ELFFileBase<ELFT>::initStringTable() {<br>
   if (!Symtab)<br>
     return;<br>
   ErrorOr<StringRef> StringTableOrErr = ELFObj.getStringTableForSymtab(*Symtab);<br>
@@ -82,13 +60,14 @@ template <class ELFT> void ELFData<ELFT><br>
 }<br>
<br>
 template <class ELFT><br>
-typename ELFData<ELFT>::Elf_Sym_Range ELFData<ELFT>::getNonLocalSymbols() {<br>
+typename ELFFileBase<ELFT>::Elf_Sym_Range<br>
+ELFFileBase<ELFT>::getNonLocalSymbols() {<br>
   return getSymbolsHelper(false);<br>
 }<br>
<br>
 template <class ELFT><br>
 ObjectFile<ELFT>::ObjectFile(MemoryBufferRef M)<br>
-    : ObjectFileBase(getStaticELFKind<ELFT>(), M), ELFData<ELFT>(M) {}<br>
+    : ObjectFileBase<ELFT>(getStaticELFKind<ELFT>(), M) {}<br>
<br>
 template <class ELFT><br>
 typename ObjectFile<ELFT>::Elf_Sym_Range ObjectFile<ELFT>::getLocalSymbols() {<br>
@@ -178,7 +157,7 @@ void elf2::ObjectFile<ELFT>::initializeS<br>
       break;<br>
     }<br>
     default:<br>
-      Sections[I] = new (Alloc) InputSection<ELFT>(this, &Sec);<br>
+      Sections[I] = new (this->Alloc) InputSection<ELFT>(this, &Sec);<br>
       break;<br>
     }<br>
   }<br>
@@ -188,9 +167,9 @@ template <class ELFT> void elf2::ObjectF<br>
   this->initStringTable();<br>
   Elf_Sym_Range Syms = this->getNonLocalSymbols();<br>
   uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());<br>
-  SymbolBodies.reserve(NumSymbols);<br>
+  this->SymbolBodies.reserve(NumSymbols);<br>
   for (const Elf_Sym &Sym : Syms)<br>
-    SymbolBodies.push_back(createSymbolBody(this->StringTable, &Sym));<br>
+    this->SymbolBodies.push_back(createSymbolBody(this->StringTable, &Sym));<br>
 }<br>
<br>
 template <class ELFT><br>
@@ -203,11 +182,11 @@ SymbolBody *elf2::ObjectFile<ELFT>::crea<br>
   uint32_t SecIndex = Sym->st_shndx;<br>
   switch (SecIndex) {<br>
   case SHN_ABS:<br>
-    return new (Alloc) DefinedAbsolute<ELFT>(Name, *Sym);<br>
+    return new (this->Alloc) DefinedAbsolute<ELFT>(Name, *Sym);<br>
   case SHN_UNDEF:<br>
-    return new (Alloc) Undefined<ELFT>(Name, *Sym);<br>
+    return new (this->Alloc) Undefined<ELFT>(Name, *Sym);<br>
   case SHN_COMMON:<br>
-    return new (Alloc) DefinedCommon<ELFT>(Name, *Sym);<br>
+    return new (this->Alloc) DefinedCommon<ELFT>(Name, *Sym);<br>
   case SHN_XINDEX:<br>
     SecIndex = this->ELFObj.getExtendedSymbolTableIndex(Sym, this->Symtab,<br>
                                                         SymtabSHNDX);<br>
@@ -225,8 +204,8 @@ SymbolBody *elf2::ObjectFile<ELFT>::crea<br>
   case STB_GNU_UNIQUE: {<br>
     InputSection<ELFT> *Sec = Sections[SecIndex];<br>
     if (Sec == &InputSection<ELFT>::Discarded)<br>
-      return new (Alloc) Undefined<ELFT>(Name, *Sym);<br>
-    return new (Alloc) DefinedRegular<ELFT>(Name, *Sym, *Sec);<br>
+      return new (this->Alloc) Undefined<ELFT>(Name, *Sym);<br>
+    return new (this->Alloc) DefinedRegular<ELFT>(Name, *Sym, *Sec);<br>
   }<br>
   }<br>
 }<br>
@@ -281,7 +260,7 @@ std::vector<MemoryBufferRef> ArchiveFile<br>
<br>
 template <class ELFT><br>
 SharedFile<ELFT>::SharedFile(MemoryBufferRef M)<br>
-    : SharedFileBase(getStaticELFKind<ELFT>(), M), ELFData<ELFT>(M) {}<br>
+    : SharedFileBase<ELFT>(getStaticELFKind<ELFT>(), M) {}<br>
<br>
 template <class ELFT> void SharedFile<ELFT>::parseSoName() {<br>
   typedef typename ELFFile<ELFT>::Elf_Dyn Elf_Dyn;<br>
@@ -298,7 +277,7 @@ template <class ELFT> void SharedFile<EL<br>
   }<br>
<br>
   this->initStringTable();<br>
-  SoName = getName();<br>
+  this->SoName = this->getName();<br>
<br>
   if (DynamicSec) {<br>
     auto *Begin =<br>
@@ -310,7 +289,7 @@ template <class ELFT> void SharedFile<EL<br>
         uintX_t Val = Dyn.getVal();<br>
         if (Val >= this->StringTable.size())<br>
           error("Invalid DT_SONAME entry");<br>
-        SoName = StringRef(this->StringTable.data() + Val);<br>
+        this->SoName = StringRef(this->StringTable.data() + Val);<br>
         break;<br>
       }<br>
     }<br>
@@ -335,6 +314,10 @@ template <class ELFT> void SharedFile<EL<br>
<br>
 namespace lld {<br>
 namespace elf2 {<br>
+template class ELFFileBase<llvm::object::ELF32LE>;<br>
+template class ELFFileBase<llvm::object::ELF32BE>;<br>
+template class ELFFileBase<llvm::object::ELF64LE>;<br>
+template class ELFFileBase<llvm::object::ELF64BE>;<br>
<br>
 template class elf2::ObjectFile<llvm::object::ELF32LE>;<br>
 template class elf2::ObjectFile<llvm::object::ELF32BE>;<br>
<br>
Modified: lld/trunk/ELF/InputFiles.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=250005&r1=250004&r2=250005&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=250005&r1=250004&r2=250005&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/InputFiles.h (original)<br>
+++ lld/trunk/ELF/InputFiles.h Sun Oct 11 20:55:32 2015<br>
@@ -47,10 +47,12 @@ private:<br>
   const Kind FileKind;<br>
 };<br>
<br>
-class ELFFileBase : public InputFile {<br>
+template <typename ELFT> class ELFFileBase : public InputFile {<br>
 public:<br>
-  ELFFileBase(Kind K, ELFKind EKind, MemoryBufferRef M)<br>
-      : InputFile(K, M), EKind(EKind) {}<br>
+  typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;<br>
+  typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;<br>
+<br>
+  ELFFileBase(Kind K, ELFKind EKind, MemoryBufferRef M);<br>
   static bool classof(const InputFile *F) {<br>
     Kind K = F->kind();<br>
     return K == ObjectKind || K == SharedKind;<br>
@@ -58,18 +60,36 @@ public:<br>
<br>
   ELFKind getELFKind() const { return EKind; }<br>
<br>
-  uint16_t getEMachine() const;<br>
+  const llvm::object::ELFFile<ELFT> &getObj() const { return ELFObj; }<br>
+  llvm::object::ELFFile<ELFT> &getObj() { return ELFObj; }<br>
+<br>
+  uint16_t getEMachine() const { return getObj().getHeader()->e_machine; }<br>
+  uint8_t getOSABI() const {<br>
+    return getObj().getHeader()->e_ident[llvm::ELF::EI_OSABI];<br>
+  }<br>
+<br>
+  StringRef getStringTable() const { return StringTable; }<br>
<br>
 protected:<br>
   const ELFKind EKind;<br>
+  llvm::object::ELFFile<ELFT> ELFObj;<br>
+  const Elf_Shdr *Symtab = nullptr;<br>
+  StringRef StringTable;<br>
+  void initStringTable();<br>
+  Elf_Sym_Range getNonLocalSymbols();<br>
+  Elf_Sym_Range getSymbolsHelper(bool);<br>
 };<br>
<br>
 // .o file.<br>
-class ObjectFileBase : public ELFFileBase {<br>
+template <typename ELFT> class ObjectFileBase : public ELFFileBase<ELFT> {<br>
+  typedef ELFFileBase<ELFT> Base;<br>
+<br>
 public:<br>
   ObjectFileBase(ELFKind EKind, MemoryBufferRef M)<br>
-      : ELFFileBase(ObjectKind, EKind, M) {}<br>
-  static bool classof(const InputFile *F) { return F->kind() == ObjectKind; }<br>
+      : ELFFileBase<ELFT>(Base::ObjectKind, EKind, M) {}<br>
+  static bool classof(const InputFile *F) {<br>
+    return F->kind() == Base::ObjectKind;<br>
+  }<br>
<br>
   ArrayRef<SymbolBody *> getSymbols() { return SymbolBodies; }<br>
   virtual void parse(llvm::DenseSet<StringRef> &Comdats) = 0;<br>
@@ -92,33 +112,8 @@ template <class ELFT> static ELFKind get<br>
   return ELF64BEKind;<br>
 }<br>
<br>
-template <class ELFT> class ELFData {<br>
-public:<br>
-  ELFData(MemoryBufferRef MB);<br>
-  typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;<br>
-  typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;<br>
-<br>
-  const llvm::object::ELFFile<ELFT> &getObj() const { return ELFObj; }<br>
-  llvm::object::ELFFile<ELFT> &getObj() { return ELFObj; }<br>
-<br>
-  uint16_t getEMachine() const { return getObj().getHeader()->e_machine; }<br>
-  uint8_t getOSABI() const {<br>
-    return getObj().getHeader()->e_ident[llvm::ELF::EI_OSABI];<br>
-  }<br>
-<br>
-  StringRef getStringTable() const { return StringTable; }<br>
-<br>
-protected:<br>
-  llvm::object::ELFFile<ELFT> ELFObj;<br>
-  const Elf_Shdr *Symtab = nullptr;<br>
-  StringRef StringTable;<br>
-  void initStringTable();<br>
-  Elf_Sym_Range getNonLocalSymbols();<br>
-  Elf_Sym_Range getSymbolsHelper(bool);<br>
-};<br>
-<br>
-template <class ELFT><br>
-class ObjectFile : public ObjectFileBase, public ELFData<ELFT> {<br>
+template <class ELFT> class ObjectFile : public ObjectFileBase<ELFT> {<br>
+  typedef ObjectFileBase<ELFT> Base;<br>
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;<br>
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;<br>
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;<br>
@@ -130,11 +125,9 @@ class ObjectFile : public ObjectFileBase<br>
   ArrayRef<GroupEntryType> getShtGroupEntries(const Elf_Shdr &Sec);<br>
<br>
 public:<br>
-  using ELFData<ELFT>::getEMachine;<br>
-<br>
   static bool classof(const InputFile *F) {<br>
-    return F->kind() == ObjectKind &&<br>
-           cast<ELFFileBase>(F)->getELFKind() == getStaticELFKind<ELFT>();<br>
+    return F->kind() == Base::ObjectKind &&<br>
+           cast<ELFFileBase<ELFT>>(F)->getELFKind() == getStaticELFKind<ELFT>();<br>
   }<br>
<br>
   explicit ObjectFile(MemoryBufferRef M);<br>
@@ -146,7 +139,7 @@ public:<br>
     uint32_t FirstNonLocal = this->Symtab->sh_info;<br>
     if (SymbolIndex < FirstNonLocal)<br>
       return nullptr;<br>
-    return SymbolBodies[SymbolIndex - FirstNonLocal];<br>
+    return this->SymbolBodies[SymbolIndex - FirstNonLocal];<br>
   }<br>
<br>
   Elf_Sym_Range getLocalSymbols();<br>
@@ -187,14 +180,20 @@ private:<br>
 };<br>
<br>
 // .so file.<br>
-class SharedFileBase : public ELFFileBase {<br>
+template <typename ELFT> class SharedFileBase : public ELFFileBase<ELFT> {<br>
+  typedef ELFFileBase<ELFT> Base;<br>
+<br>
 protected:<br>
   StringRef SoName;<br>
<br>
 public:<br>
   SharedFileBase(ELFKind EKind, MemoryBufferRef M)<br>
-      : ELFFileBase(SharedKind, EKind, M) {}<br>
-  static bool classof(const InputFile *F) { return F->kind() == SharedKind; }<br>
+      : ELFFileBase<ELFT>(Base::SharedKind, EKind, M) {<br>
+    AsNeeded = Config->AsNeeded;<br>
+  }<br>
+  static bool classof(const InputFile *F) {<br>
+    return F->kind() == Base::SharedKind;<br>
+  }<br>
   StringRef getSoName() const { return SoName; }<br>
   virtual void parseSoName() = 0;<br>
   virtual void parse() = 0;<br>
@@ -205,8 +204,8 @@ public:<br>
   bool isNeeded() const { return !AsNeeded || IsUsed; }<br>
 };<br>
<br>
-template <class ELFT><br>
-class SharedFile : public SharedFileBase, public ELFData<ELFT> {<br>
+template <class ELFT> class SharedFile : public SharedFileBase<ELFT> {<br>
+  typedef SharedFileBase<ELFT> Base;<br>
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;<br>
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;<br>
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;<br>
@@ -214,14 +213,13 @@ class SharedFile : public SharedFileBase<br>
   std::vector<SharedSymbol<ELFT>> SymbolBodies;<br>
<br>
 public:<br>
-  using ELFData<ELFT>::getEMachine;<br>
   llvm::MutableArrayRef<SharedSymbol<ELFT>> getSharedSymbols() {<br>
     return SymbolBodies;<br>
   }<br>
<br>
   static bool classof(const InputFile *F) {<br>
-    return F->kind() == SharedKind &&<br>
-           cast<ELFFileBase>(F)->getELFKind() == getStaticELFKind<ELFT>();<br>
+    return F->kind() == Base::SharedKind &&<br>
+           cast<ELFFileBase<ELFT>>(F)->getELFKind() == getStaticELFKind<ELFT>();<br>
   }<br>
<br>
   explicit SharedFile(MemoryBufferRef M);<br>
@@ -230,8 +228,23 @@ public:<br>
   void parse() override;<br>
 };<br>
<br>
+template <typename T><br>
+std::unique_ptr<InputFile> createELFFileAux(MemoryBufferRef MB) {<br>
+  std::unique_ptr<T> Ret = llvm::make_unique<T>(MB);<br>
+<br>
+  if (!Config->FirstElf)<br>
+    Config->FirstElf = Ret.get();<br>
+<br>
+  if (Config->ElfKind == ELFNoneKind) {<br>
+    Config->ElfKind = Ret->getELFKind();<br>
+    Config->EMachine = Ret->getEMachine();<br>
+  }<br>
+<br>
+  return std::move(Ret);<br>
+}<br>
+<br>
 template <template <class> class T><br>
-std::unique_ptr<ELFFileBase> createELFFile(MemoryBufferRef MB) {<br>
+std::unique_ptr<InputFile> createELFFile(MemoryBufferRef MB) {<br>
   using namespace llvm;<br>
<br>
   std::pair<unsigned char, unsigned char> Type =<br>
@@ -239,30 +252,17 @@ std::unique_ptr<ELFFileBase> createELFFi<br>
   if (Type.second != ELF::ELFDATA2LSB && Type.second != ELF::ELFDATA2MSB)<br>
     error("Invalid data encoding: " + MB.getBufferIdentifier());<br>
<br>
-  std::unique_ptr<ELFFileBase> Ret;<br>
   if (Type.first == ELF::ELFCLASS32) {<br>
     if (Type.second == ELF::ELFDATA2LSB)<br>
-      Ret.reset(new T<object::ELF32LE>(MB));<br>
-    else<br>
-      Ret.reset(new T<object::ELF32BE>(MB));<br>
-  } else if (Type.first == ELF::ELFCLASS64) {<br>
-    if (Type.second == ELF::ELFDATA2LSB)<br>
-      Ret.reset(new T<object::ELF64LE>(MB));<br>
-    else<br>
-      Ret.reset(new T<object::ELF64BE>(MB));<br>
-  } else {<br>
-    error("Invalid file class: " + MB.getBufferIdentifier());<br>
+      return createELFFileAux<T<object::ELF32LE>>(MB);<br>
+    return createELFFileAux<T<object::ELF32BE>>(MB);<br>
   }<br>
-<br>
-  if (!Config->FirstElf)<br>
-    Config->FirstElf = Ret.get();<br>
-<br>
-  if (Config->ElfKind == ELFNoneKind) {<br>
-    Config->ElfKind = Ret->getELFKind();<br>
-    Config->EMachine = Ret->getEMachine();<br>
+  if (Type.first == ELF::ELFCLASS64) {<br>
+    if (Type.second == ELF::ELFDATA2LSB)<br>
+      return createELFFileAux<T<object::ELF64LE>>(MB);<br>
+    return createELFFileAux<T<object::ELF64BE>>(MB);<br>
   }<br>
-<br>
-  return Ret;<br>
+  error("Invalid file class: " + MB.getBufferIdentifier());<br>
 }<br>
<br>
 } // namespace elf2<br>
<br>
Modified: lld/trunk/ELF/SymbolTable.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=250005&r1=250004&r2=250005&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=250005&r1=250004&r2=250005&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/SymbolTable.cpp (original)<br>
+++ lld/trunk/ELF/SymbolTable.cpp Sun Oct 11 20:55:32 2015<br>
@@ -29,7 +29,7 @@ template <class ELFT> bool SymbolTable<E<br>
 template <class ELFT><br>
 void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) {<br>
<br>
-  if (auto *E = dyn_cast<ELFFileBase>(File.get())) {<br>
+  if (auto *E = dyn_cast<ELFFileBase<ELFT>>(File.get())) {<br>
     if (E->getELFKind() != Config->ElfKind ||<br>
         E->getEMachine() != Config->EMachine) {<br>
       StringRef A = E->getName();<br>
@@ -47,15 +47,15 @@ void SymbolTable<ELFT>::addFile(std::uni<br>
       addLazy(&Sym);<br>
     return;<br>
   }<br>
-  if (auto *S = dyn_cast<SharedFileBase>(File.get())) {<br>
+  if (auto *S = dyn_cast<SharedFileBase<ELFT>>(File.get())) {<br>
     S->parseSoName();<br>
     if (!IncludedSoNames.insert(S->getSoName()).second)<br>
       return;<br>
     S->parse();<br>
   } else {<br>
-    cast<ObjectFileBase>(File.get())->parse(Comdats);<br>
+    cast<ObjectFileBase<ELFT>>(File.get())->parse(Comdats);<br>
   }<br>
-  addELFFile(cast<ELFFileBase>(File.release()));<br>
+  addELFFile(cast<ELFFileBase<ELFT>>(File.release()));<br>
 }<br>
<br>
 template <class ELFT><br>
@@ -90,13 +90,14 @@ template <class ELFT> void SymbolTable<E<br>
   resolve(Sym);<br>
 }<br>
<br>
-template <class ELFT> void SymbolTable<ELFT>::addELFFile(ELFFileBase *File) {<br>
+template <class ELFT><br>
+void SymbolTable<ELFT>::addELFFile(ELFFileBase<ELFT> *File) {<br>
   if (auto *O = dyn_cast<ObjectFile<ELFT>>(File))<br>
     ObjectFiles.emplace_back(O);<br>
   else if (auto *S = dyn_cast<SharedFile<ELFT>>(File))<br>
     SharedFiles.emplace_back(S);<br>
<br>
-  if (auto *O = dyn_cast<ObjectFileBase>(File)) {<br>
+  if (auto *O = dyn_cast<ObjectFileBase<ELFT>>(File)) {<br>
     for (SymbolBody *Body : O->getSymbols())<br>
       resolve(Body);<br>
   }<br>
@@ -116,8 +117,8 @@ void SymbolTable<ELFT>::reportConflict(c<br>
<br>
   const Elf_Sym &OldE = cast<ELFSymbolBody<ELFT>>(Old).Sym;<br>
   const Elf_Sym &NewE = cast<ELFSymbolBody<ELFT>>(New).Sym;<br>
-  ELFFileBase *OldFile = nullptr;<br>
-  ELFFileBase *NewFile = nullptr;<br>
+  ELFFileBase<ELFT> *OldFile = nullptr;<br>
+  ELFFileBase<ELFT> *NewFile = nullptr;<br>
<br>
   for (const std::unique_ptr<ObjectFile<ELFT>> &File : ObjectFiles) {<br>
     Elf_Sym_Range Syms = File->getObj().symbols(File->getSymbolTable());<br>
<br>
Modified: lld/trunk/ELF/SymbolTable.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=250005&r1=250004&r2=250005&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=250005&r1=250004&r2=250005&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/SymbolTable.h (original)<br>
+++ lld/trunk/ELF/SymbolTable.h Sun Oct 11 20:55:32 2015<br>
@@ -33,7 +33,7 @@ public:<br>
<br>
   void addFile(std::unique_ptr<InputFile> File);<br>
<br>
-  const ELFFileBase *getFirstELF() const {<br>
+  const ELFFileBase<ELFT> *getFirstELF() const {<br>
     if (!ObjectFiles.empty())<br>
       return ObjectFiles[0].get();<br>
     if (!SharedFiles.empty())<br>
@@ -63,7 +63,7 @@ public:<br>
<br>
 private:<br>
   Symbol *insert(SymbolBody *New);<br>
-  void addELFFile(ELFFileBase *File);<br>
+  void addELFFile(ELFFileBase<ELFT> *File);<br>
   void addLazy(Lazy *New);<br>
   void addMemberFile(Lazy *Body);<br>
   void init(uint16_t EMachine);<br>
<br>
Modified: lld/trunk/ELF/Writer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=250005&r1=250004&r2=250005&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=250005&r1=250004&r2=250005&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Writer.cpp (original)<br>
+++ lld/trunk/ELF/Writer.cpp Sun Oct 11 20:55:32 2015<br>
@@ -229,7 +229,7 @@ static void reportUndefined(const Symbol<br>
     return;<br>
<br>
   const Elf_Sym &SymE = cast<ELFSymbolBody<ELFT>>(Sym).Sym;<br>
-  ELFFileBase *SymFile = nullptr;<br>
+  ELFFileBase<ELFT> *SymFile = nullptr;<br>
<br>
   for (const std::unique_ptr<ObjectFile<ELFT>> &File : S.getObjectFiles()) {<br>
     Elf_Sym_Range Syms = File->getObj().symbols(File->getSymbolTable());<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>