[lld] r250005 - Simplify the InputFile type hierarchy.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 11 18:55:32 PDT 2015


Author: rafael
Date: Sun Oct 11 20:55:32 2015
New Revision: 250005

URL: http://llvm.org/viewvc/llvm-project?rev=250005&view=rev
Log:
Simplify the InputFile type hierarchy.

Now that the SymbolTable is templated, we don't need the ELFData class or
multiple inheritance.

Modified:
    lld/trunk/ELF/Config.h
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/Driver.h
    lld/trunk/ELF/InputFiles.cpp
    lld/trunk/ELF/InputFiles.h
    lld/trunk/ELF/SymbolTable.cpp
    lld/trunk/ELF/SymbolTable.h
    lld/trunk/ELF/Writer.cpp

Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=250005&r1=250004&r2=250005&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Sun Oct 11 20:55:32 2015
@@ -18,7 +18,7 @@
 namespace lld {
 namespace elf2 {
 
-class ELFFileBase;
+class InputFile;
 class SymbolBody;
 
 enum ELFKind {
@@ -31,7 +31,7 @@ enum ELFKind {
 
 struct Configuration {
   SymbolBody *EntrySym = nullptr;
-  ELFFileBase *FirstElf = nullptr;
+  InputFile *FirstElf = nullptr;
   llvm::StringRef DynamicLinker;
   llvm::StringRef Entry;
   llvm::StringRef Emulation;

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=250005&r1=250004&r2=250005&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Sun Oct 11 20:55:32 2015
@@ -100,12 +100,9 @@ void LinkerDriver::addFile(StringRef Pat
     }
     Files.push_back(make_unique<ArchiveFile>(MBRef));
     return;
-  case file_magic::elf_shared_object: {
-    std::unique_ptr<ELFFileBase> File = createELFFile<SharedFile>(MBRef);
-    cast<SharedFileBase>(File.get())->AsNeeded = Config->AsNeeded;
-    Files.push_back(std::move(File));
+  case file_magic::elf_shared_object:
+    Files.push_back(createELFFile<SharedFile>(MBRef));
     return;
-  }
   default:
     Files.push_back(createELFFile<ObjectFile>(MBRef));
   }

Modified: lld/trunk/ELF/Driver.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.h?rev=250005&r1=250004&r2=250005&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.h (original)
+++ lld/trunk/ELF/Driver.h Sun Oct 11 20:55:32 2015
@@ -33,7 +33,7 @@ public:
 
 private:
   template <template <class> class T>
-  std::unique_ptr<ELFFileBase> createELFInputFile(MemoryBufferRef MB);
+  std::unique_ptr<InputFile> createELFInputFile(MemoryBufferRef MB);
 
   llvm::BumpPtrAllocator Alloc;
   bool WholeArchive = false;

Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=250005&r1=250004&r2=250005&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Sun Oct 11 20:55:32 2015
@@ -21,28 +21,6 @@ using namespace llvm::sys::fs;
 using namespace lld;
 using namespace lld::elf2;
 
-template <class ELFT> static uint16_t getEMachine(const ELFFileBase &B) {
-  bool IsShared = isa<SharedFileBase>(B);
-  if (IsShared)
-    return cast<SharedFile<ELFT>>(B).getEMachine();
-  return cast<ObjectFile<ELFT>>(B).getEMachine();
-}
-
-uint16_t ELFFileBase::getEMachine() const {
-  switch (EKind) {
-  case ELF32BEKind:
-    return ::getEMachine<ELF32BE>(*this);
-  case ELF32LEKind:
-    return ::getEMachine<ELF32LE>(*this);
-  case ELF64BEKind:
-    return ::getEMachine<ELF64BE>(*this);
-  case ELF64LEKind:
-    return ::getEMachine<ELF64LE>(*this);
-  default:
-    llvm_unreachable("Invalid kind");
-  }
-}
-
 namespace {
 class ECRAII {
   std::error_code EC;
@@ -54,12 +32,12 @@ public:
 }
 
 template <class ELFT>
-ELFData<ELFT>::ELFData(MemoryBufferRef MB)
-    : ELFObj(MB.getBuffer(), ECRAII().getEC()) {}
+ELFFileBase<ELFT>::ELFFileBase(Kind K, ELFKind EKind, MemoryBufferRef M)
+    : InputFile(K, M), EKind(EKind), ELFObj(MB.getBuffer(), ECRAII().getEC()) {}
 
 template <class ELFT>
-typename ELFData<ELFT>::Elf_Sym_Range
-ELFData<ELFT>::getSymbolsHelper(bool Local) {
+typename ELFFileBase<ELFT>::Elf_Sym_Range
+ELFFileBase<ELFT>::getSymbolsHelper(bool Local) {
   if (!Symtab)
     return Elf_Sym_Range(nullptr, nullptr);
   Elf_Sym_Range Syms = ELFObj.symbols(Symtab);
@@ -73,7 +51,7 @@ ELFData<ELFT>::getSymbolsHelper(bool Loc
   return make_range(Syms.begin() + 1, Syms.begin() + FirstNonLocal);
 }
 
-template <class ELFT> void ELFData<ELFT>::initStringTable() {
+template <class ELFT> void ELFFileBase<ELFT>::initStringTable() {
   if (!Symtab)
     return;
   ErrorOr<StringRef> StringTableOrErr = ELFObj.getStringTableForSymtab(*Symtab);
@@ -82,13 +60,14 @@ template <class ELFT> void ELFData<ELFT>
 }
 
 template <class ELFT>
-typename ELFData<ELFT>::Elf_Sym_Range ELFData<ELFT>::getNonLocalSymbols() {
+typename ELFFileBase<ELFT>::Elf_Sym_Range
+ELFFileBase<ELFT>::getNonLocalSymbols() {
   return getSymbolsHelper(false);
 }
 
 template <class ELFT>
 ObjectFile<ELFT>::ObjectFile(MemoryBufferRef M)
-    : ObjectFileBase(getStaticELFKind<ELFT>(), M), ELFData<ELFT>(M) {}
+    : ObjectFileBase<ELFT>(getStaticELFKind<ELFT>(), M) {}
 
 template <class ELFT>
 typename ObjectFile<ELFT>::Elf_Sym_Range ObjectFile<ELFT>::getLocalSymbols() {
@@ -178,7 +157,7 @@ void elf2::ObjectFile<ELFT>::initializeS
       break;
     }
     default:
-      Sections[I] = new (Alloc) InputSection<ELFT>(this, &Sec);
+      Sections[I] = new (this->Alloc) InputSection<ELFT>(this, &Sec);
       break;
     }
   }
@@ -188,9 +167,9 @@ template <class ELFT> void elf2::ObjectF
   this->initStringTable();
   Elf_Sym_Range Syms = this->getNonLocalSymbols();
   uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
-  SymbolBodies.reserve(NumSymbols);
+  this->SymbolBodies.reserve(NumSymbols);
   for (const Elf_Sym &Sym : Syms)
-    SymbolBodies.push_back(createSymbolBody(this->StringTable, &Sym));
+    this->SymbolBodies.push_back(createSymbolBody(this->StringTable, &Sym));
 }
 
 template <class ELFT>
@@ -203,11 +182,11 @@ SymbolBody *elf2::ObjectFile<ELFT>::crea
   uint32_t SecIndex = Sym->st_shndx;
   switch (SecIndex) {
   case SHN_ABS:
-    return new (Alloc) DefinedAbsolute<ELFT>(Name, *Sym);
+    return new (this->Alloc) DefinedAbsolute<ELFT>(Name, *Sym);
   case SHN_UNDEF:
-    return new (Alloc) Undefined<ELFT>(Name, *Sym);
+    return new (this->Alloc) Undefined<ELFT>(Name, *Sym);
   case SHN_COMMON:
-    return new (Alloc) DefinedCommon<ELFT>(Name, *Sym);
+    return new (this->Alloc) DefinedCommon<ELFT>(Name, *Sym);
   case SHN_XINDEX:
     SecIndex = this->ELFObj.getExtendedSymbolTableIndex(Sym, this->Symtab,
                                                         SymtabSHNDX);
@@ -225,8 +204,8 @@ SymbolBody *elf2::ObjectFile<ELFT>::crea
   case STB_GNU_UNIQUE: {
     InputSection<ELFT> *Sec = Sections[SecIndex];
     if (Sec == &InputSection<ELFT>::Discarded)
-      return new (Alloc) Undefined<ELFT>(Name, *Sym);
-    return new (Alloc) DefinedRegular<ELFT>(Name, *Sym, *Sec);
+      return new (this->Alloc) Undefined<ELFT>(Name, *Sym);
+    return new (this->Alloc) DefinedRegular<ELFT>(Name, *Sym, *Sec);
   }
   }
 }
@@ -281,7 +260,7 @@ std::vector<MemoryBufferRef> ArchiveFile
 
 template <class ELFT>
 SharedFile<ELFT>::SharedFile(MemoryBufferRef M)
-    : SharedFileBase(getStaticELFKind<ELFT>(), M), ELFData<ELFT>(M) {}
+    : SharedFileBase<ELFT>(getStaticELFKind<ELFT>(), M) {}
 
 template <class ELFT> void SharedFile<ELFT>::parseSoName() {
   typedef typename ELFFile<ELFT>::Elf_Dyn Elf_Dyn;
@@ -298,7 +277,7 @@ template <class ELFT> void SharedFile<EL
   }
 
   this->initStringTable();
-  SoName = getName();
+  this->SoName = this->getName();
 
   if (DynamicSec) {
     auto *Begin =
@@ -310,7 +289,7 @@ template <class ELFT> void SharedFile<EL
         uintX_t Val = Dyn.getVal();
         if (Val >= this->StringTable.size())
           error("Invalid DT_SONAME entry");
-        SoName = StringRef(this->StringTable.data() + Val);
+        this->SoName = StringRef(this->StringTable.data() + Val);
         break;
       }
     }
@@ -335,6 +314,10 @@ template <class ELFT> void SharedFile<EL
 
 namespace lld {
 namespace elf2 {
+template class ELFFileBase<llvm::object::ELF32LE>;
+template class ELFFileBase<llvm::object::ELF32BE>;
+template class ELFFileBase<llvm::object::ELF64LE>;
+template class ELFFileBase<llvm::object::ELF64BE>;
 
 template class elf2::ObjectFile<llvm::object::ELF32LE>;
 template class elf2::ObjectFile<llvm::object::ELF32BE>;

Modified: lld/trunk/ELF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=250005&r1=250004&r2=250005&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.h (original)
+++ lld/trunk/ELF/InputFiles.h Sun Oct 11 20:55:32 2015
@@ -47,10 +47,12 @@ private:
   const Kind FileKind;
 };
 
-class ELFFileBase : public InputFile {
+template <typename ELFT> class ELFFileBase : public InputFile {
 public:
-  ELFFileBase(Kind K, ELFKind EKind, MemoryBufferRef M)
-      : InputFile(K, M), EKind(EKind) {}
+  typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
+  typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
+
+  ELFFileBase(Kind K, ELFKind EKind, MemoryBufferRef M);
   static bool classof(const InputFile *F) {
     Kind K = F->kind();
     return K == ObjectKind || K == SharedKind;
@@ -58,18 +60,36 @@ public:
 
   ELFKind getELFKind() const { return EKind; }
 
-  uint16_t getEMachine() const;
+  const llvm::object::ELFFile<ELFT> &getObj() const { return ELFObj; }
+  llvm::object::ELFFile<ELFT> &getObj() { return ELFObj; }
+
+  uint16_t getEMachine() const { return getObj().getHeader()->e_machine; }
+  uint8_t getOSABI() const {
+    return getObj().getHeader()->e_ident[llvm::ELF::EI_OSABI];
+  }
+
+  StringRef getStringTable() const { return StringTable; }
 
 protected:
   const ELFKind EKind;
+  llvm::object::ELFFile<ELFT> ELFObj;
+  const Elf_Shdr *Symtab = nullptr;
+  StringRef StringTable;
+  void initStringTable();
+  Elf_Sym_Range getNonLocalSymbols();
+  Elf_Sym_Range getSymbolsHelper(bool);
 };
 
 // .o file.
-class ObjectFileBase : public ELFFileBase {
+template <typename ELFT> class ObjectFileBase : public ELFFileBase<ELFT> {
+  typedef ELFFileBase<ELFT> Base;
+
 public:
   ObjectFileBase(ELFKind EKind, MemoryBufferRef M)
-      : ELFFileBase(ObjectKind, EKind, M) {}
-  static bool classof(const InputFile *F) { return F->kind() == ObjectKind; }
+      : ELFFileBase<ELFT>(Base::ObjectKind, EKind, M) {}
+  static bool classof(const InputFile *F) {
+    return F->kind() == Base::ObjectKind;
+  }
 
   ArrayRef<SymbolBody *> getSymbols() { return SymbolBodies; }
   virtual void parse(llvm::DenseSet<StringRef> &Comdats) = 0;
@@ -92,33 +112,8 @@ template <class ELFT> static ELFKind get
   return ELF64BEKind;
 }
 
-template <class ELFT> class ELFData {
-public:
-  ELFData(MemoryBufferRef MB);
-  typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
-  typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
-
-  const llvm::object::ELFFile<ELFT> &getObj() const { return ELFObj; }
-  llvm::object::ELFFile<ELFT> &getObj() { return ELFObj; }
-
-  uint16_t getEMachine() const { return getObj().getHeader()->e_machine; }
-  uint8_t getOSABI() const {
-    return getObj().getHeader()->e_ident[llvm::ELF::EI_OSABI];
-  }
-
-  StringRef getStringTable() const { return StringTable; }
-
-protected:
-  llvm::object::ELFFile<ELFT> ELFObj;
-  const Elf_Shdr *Symtab = nullptr;
-  StringRef StringTable;
-  void initStringTable();
-  Elf_Sym_Range getNonLocalSymbols();
-  Elf_Sym_Range getSymbolsHelper(bool);
-};
-
-template <class ELFT>
-class ObjectFile : public ObjectFileBase, public ELFData<ELFT> {
+template <class ELFT> class ObjectFile : public ObjectFileBase<ELFT> {
+  typedef ObjectFileBase<ELFT> Base;
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
@@ -130,11 +125,9 @@ class ObjectFile : public ObjectFileBase
   ArrayRef<GroupEntryType> getShtGroupEntries(const Elf_Shdr &Sec);
 
 public:
-  using ELFData<ELFT>::getEMachine;
-
   static bool classof(const InputFile *F) {
-    return F->kind() == ObjectKind &&
-           cast<ELFFileBase>(F)->getELFKind() == getStaticELFKind<ELFT>();
+    return F->kind() == Base::ObjectKind &&
+           cast<ELFFileBase<ELFT>>(F)->getELFKind() == getStaticELFKind<ELFT>();
   }
 
   explicit ObjectFile(MemoryBufferRef M);
@@ -146,7 +139,7 @@ public:
     uint32_t FirstNonLocal = this->Symtab->sh_info;
     if (SymbolIndex < FirstNonLocal)
       return nullptr;
-    return SymbolBodies[SymbolIndex - FirstNonLocal];
+    return this->SymbolBodies[SymbolIndex - FirstNonLocal];
   }
 
   Elf_Sym_Range getLocalSymbols();
@@ -187,14 +180,20 @@ private:
 };
 
 // .so file.
-class SharedFileBase : public ELFFileBase {
+template <typename ELFT> class SharedFileBase : public ELFFileBase<ELFT> {
+  typedef ELFFileBase<ELFT> Base;
+
 protected:
   StringRef SoName;
 
 public:
   SharedFileBase(ELFKind EKind, MemoryBufferRef M)
-      : ELFFileBase(SharedKind, EKind, M) {}
-  static bool classof(const InputFile *F) { return F->kind() == SharedKind; }
+      : ELFFileBase<ELFT>(Base::SharedKind, EKind, M) {
+    AsNeeded = Config->AsNeeded;
+  }
+  static bool classof(const InputFile *F) {
+    return F->kind() == Base::SharedKind;
+  }
   StringRef getSoName() const { return SoName; }
   virtual void parseSoName() = 0;
   virtual void parse() = 0;
@@ -205,8 +204,8 @@ public:
   bool isNeeded() const { return !AsNeeded || IsUsed; }
 };
 
-template <class ELFT>
-class SharedFile : public SharedFileBase, public ELFData<ELFT> {
+template <class ELFT> class SharedFile : public SharedFileBase<ELFT> {
+  typedef SharedFileBase<ELFT> Base;
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range;
@@ -214,14 +213,13 @@ class SharedFile : public SharedFileBase
   std::vector<SharedSymbol<ELFT>> SymbolBodies;
 
 public:
-  using ELFData<ELFT>::getEMachine;
   llvm::MutableArrayRef<SharedSymbol<ELFT>> getSharedSymbols() {
     return SymbolBodies;
   }
 
   static bool classof(const InputFile *F) {
-    return F->kind() == SharedKind &&
-           cast<ELFFileBase>(F)->getELFKind() == getStaticELFKind<ELFT>();
+    return F->kind() == Base::SharedKind &&
+           cast<ELFFileBase<ELFT>>(F)->getELFKind() == getStaticELFKind<ELFT>();
   }
 
   explicit SharedFile(MemoryBufferRef M);
@@ -230,8 +228,23 @@ public:
   void parse() override;
 };
 
+template <typename T>
+std::unique_ptr<InputFile> createELFFileAux(MemoryBufferRef MB) {
+  std::unique_ptr<T> Ret = llvm::make_unique<T>(MB);
+
+  if (!Config->FirstElf)
+    Config->FirstElf = Ret.get();
+
+  if (Config->ElfKind == ELFNoneKind) {
+    Config->ElfKind = Ret->getELFKind();
+    Config->EMachine = Ret->getEMachine();
+  }
+
+  return std::move(Ret);
+}
+
 template <template <class> class T>
-std::unique_ptr<ELFFileBase> createELFFile(MemoryBufferRef MB) {
+std::unique_ptr<InputFile> createELFFile(MemoryBufferRef MB) {
   using namespace llvm;
 
   std::pair<unsigned char, unsigned char> Type =
@@ -239,30 +252,17 @@ std::unique_ptr<ELFFileBase> createELFFi
   if (Type.second != ELF::ELFDATA2LSB && Type.second != ELF::ELFDATA2MSB)
     error("Invalid data encoding: " + MB.getBufferIdentifier());
 
-  std::unique_ptr<ELFFileBase> Ret;
   if (Type.first == ELF::ELFCLASS32) {
     if (Type.second == ELF::ELFDATA2LSB)
-      Ret.reset(new T<object::ELF32LE>(MB));
-    else
-      Ret.reset(new T<object::ELF32BE>(MB));
-  } else if (Type.first == ELF::ELFCLASS64) {
-    if (Type.second == ELF::ELFDATA2LSB)
-      Ret.reset(new T<object::ELF64LE>(MB));
-    else
-      Ret.reset(new T<object::ELF64BE>(MB));
-  } else {
-    error("Invalid file class: " + MB.getBufferIdentifier());
+      return createELFFileAux<T<object::ELF32LE>>(MB);
+    return createELFFileAux<T<object::ELF32BE>>(MB);
   }
-
-  if (!Config->FirstElf)
-    Config->FirstElf = Ret.get();
-
-  if (Config->ElfKind == ELFNoneKind) {
-    Config->ElfKind = Ret->getELFKind();
-    Config->EMachine = Ret->getEMachine();
+  if (Type.first == ELF::ELFCLASS64) {
+    if (Type.second == ELF::ELFDATA2LSB)
+      return createELFFileAux<T<object::ELF64LE>>(MB);
+    return createELFFileAux<T<object::ELF64BE>>(MB);
   }
-
-  return Ret;
+  error("Invalid file class: " + MB.getBufferIdentifier());
 }
 
 } // namespace elf2

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=250005&r1=250004&r2=250005&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Sun Oct 11 20:55:32 2015
@@ -29,7 +29,7 @@ template <class ELFT> bool SymbolTable<E
 template <class ELFT>
 void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) {
 
-  if (auto *E = dyn_cast<ELFFileBase>(File.get())) {
+  if (auto *E = dyn_cast<ELFFileBase<ELFT>>(File.get())) {
     if (E->getELFKind() != Config->ElfKind ||
         E->getEMachine() != Config->EMachine) {
       StringRef A = E->getName();
@@ -47,15 +47,15 @@ void SymbolTable<ELFT>::addFile(std::uni
       addLazy(&Sym);
     return;
   }
-  if (auto *S = dyn_cast<SharedFileBase>(File.get())) {
+  if (auto *S = dyn_cast<SharedFileBase<ELFT>>(File.get())) {
     S->parseSoName();
     if (!IncludedSoNames.insert(S->getSoName()).second)
       return;
     S->parse();
   } else {
-    cast<ObjectFileBase>(File.get())->parse(Comdats);
+    cast<ObjectFileBase<ELFT>>(File.get())->parse(Comdats);
   }
-  addELFFile(cast<ELFFileBase>(File.release()));
+  addELFFile(cast<ELFFileBase<ELFT>>(File.release()));
 }
 
 template <class ELFT>
@@ -90,13 +90,14 @@ template <class ELFT> void SymbolTable<E
   resolve(Sym);
 }
 
-template <class ELFT> void SymbolTable<ELFT>::addELFFile(ELFFileBase *File) {
+template <class ELFT>
+void SymbolTable<ELFT>::addELFFile(ELFFileBase<ELFT> *File) {
   if (auto *O = dyn_cast<ObjectFile<ELFT>>(File))
     ObjectFiles.emplace_back(O);
   else if (auto *S = dyn_cast<SharedFile<ELFT>>(File))
     SharedFiles.emplace_back(S);
 
-  if (auto *O = dyn_cast<ObjectFileBase>(File)) {
+  if (auto *O = dyn_cast<ObjectFileBase<ELFT>>(File)) {
     for (SymbolBody *Body : O->getSymbols())
       resolve(Body);
   }
@@ -116,8 +117,8 @@ void SymbolTable<ELFT>::reportConflict(c
 
   const Elf_Sym &OldE = cast<ELFSymbolBody<ELFT>>(Old).Sym;
   const Elf_Sym &NewE = cast<ELFSymbolBody<ELFT>>(New).Sym;
-  ELFFileBase *OldFile = nullptr;
-  ELFFileBase *NewFile = nullptr;
+  ELFFileBase<ELFT> *OldFile = nullptr;
+  ELFFileBase<ELFT> *NewFile = nullptr;
 
   for (const std::unique_ptr<ObjectFile<ELFT>> &File : ObjectFiles) {
     Elf_Sym_Range Syms = File->getObj().symbols(File->getSymbolTable());

Modified: lld/trunk/ELF/SymbolTable.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=250005&r1=250004&r2=250005&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.h (original)
+++ lld/trunk/ELF/SymbolTable.h Sun Oct 11 20:55:32 2015
@@ -33,7 +33,7 @@ public:
 
   void addFile(std::unique_ptr<InputFile> File);
 
-  const ELFFileBase *getFirstELF() const {
+  const ELFFileBase<ELFT> *getFirstELF() const {
     if (!ObjectFiles.empty())
       return ObjectFiles[0].get();
     if (!SharedFiles.empty())
@@ -63,7 +63,7 @@ public:
 
 private:
   Symbol *insert(SymbolBody *New);
-  void addELFFile(ELFFileBase *File);
+  void addELFFile(ELFFileBase<ELFT> *File);
   void addLazy(Lazy *New);
   void addMemberFile(Lazy *Body);
   void init(uint16_t EMachine);

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=250005&r1=250004&r2=250005&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Sun Oct 11 20:55:32 2015
@@ -229,7 +229,7 @@ static void reportUndefined(const Symbol
     return;
 
   const Elf_Sym &SymE = cast<ELFSymbolBody<ELFT>>(Sym).Sym;
-  ELFFileBase *SymFile = nullptr;
+  ELFFileBase<ELFT> *SymFile = nullptr;
 
   for (const std::unique_ptr<ObjectFile<ELFT>> &File : S.getObjectFiles()) {
     Elf_Sym_Range Syms = File->getObj().symbols(File->getSymbolTable());




More information about the llvm-commits mailing list