[lld] r250006 - Simplify the InputFile type hierarchy by removing unnecessary middle classses.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 11 19:22:58 PDT 2015


Author: rafael
Date: Sun Oct 11 21:22:58 2015
New Revision: 250006

URL: http://llvm.org/viewvc/llvm-project?rev=250006&view=rev
Log:
Simplify the InputFile type hierarchy by removing unnecessary middle classses.

Modified:
    lld/trunk/ELF/InputFiles.cpp
    lld/trunk/ELF/InputFiles.h
    lld/trunk/ELF/SymbolTable.cpp

Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=250006&r1=250005&r2=250006&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Sun Oct 11 21:22:58 2015
@@ -67,7 +67,7 @@ ELFFileBase<ELFT>::getNonLocalSymbols()
 
 template <class ELFT>
 ObjectFile<ELFT>::ObjectFile(MemoryBufferRef M)
-    : ObjectFileBase<ELFT>(getStaticELFKind<ELFT>(), M) {}
+    : ELFFileBase<ELFT>(Base::ObjectKind, getStaticELFKind<ELFT>(), M) {}
 
 template <class ELFT>
 typename ObjectFile<ELFT>::Elf_Sym_Range ObjectFile<ELFT>::getLocalSymbols() {
@@ -260,7 +260,9 @@ std::vector<MemoryBufferRef> ArchiveFile
 
 template <class ELFT>
 SharedFile<ELFT>::SharedFile(MemoryBufferRef M)
-    : SharedFileBase<ELFT>(getStaticELFKind<ELFT>(), M) {}
+    : ELFFileBase<ELFT>(Base::SharedKind, getStaticELFKind<ELFT>(), M) {
+  AsNeeded = Config->AsNeeded;
+}
 
 template <class ELFT> void SharedFile<ELFT>::parseSoName() {
   typedef typename ELFFile<ELFT>::Elf_Dyn Elf_Dyn;

Modified: lld/trunk/ELF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=250006&r1=250005&r2=250006&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.h (original)
+++ lld/trunk/ELF/InputFiles.h Sun Oct 11 21:22:58 2015
@@ -80,27 +80,6 @@ protected:
   Elf_Sym_Range getSymbolsHelper(bool);
 };
 
-// .o file.
-template <typename ELFT> class ObjectFileBase : public ELFFileBase<ELFT> {
-  typedef ELFFileBase<ELFT> Base;
-
-public:
-  ObjectFileBase(ELFKind EKind, MemoryBufferRef M)
-      : 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;
-
-protected:
-  // List of all symbols referenced or defined by this file.
-  std::vector<SymbolBody *> SymbolBodies;
-
-  llvm::BumpPtrAllocator Alloc;
-};
-
 template <class ELFT> static ELFKind getStaticELFKind() {
   if (!ELFT::Is64Bits) {
     if (ELFT::TargetEndianness == llvm::support::little)
@@ -112,8 +91,9 @@ template <class ELFT> static ELFKind get
   return ELF64BEKind;
 }
 
-template <class ELFT> class ObjectFile : public ObjectFileBase<ELFT> {
-  typedef ObjectFileBase<ELFT> Base;
+// .o file.
+template <class ELFT> class ObjectFile : public ELFFileBase<ELFT> {
+  typedef ELFFileBase<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,8 +110,10 @@ public:
            cast<ELFFileBase<ELFT>>(F)->getELFKind() == getStaticELFKind<ELFT>();
   }
 
+  ArrayRef<SymbolBody *> getSymbols() { return this->SymbolBodies; }
+
   explicit ObjectFile(MemoryBufferRef M);
-  void parse(llvm::DenseSet<StringRef> &Comdats) override;
+  void parse(llvm::DenseSet<StringRef> &Comdats);
 
   ArrayRef<InputSection<ELFT> *> getSections() const { return Sections; }
 
@@ -157,6 +139,11 @@ private:
   std::vector<InputSection<ELFT> *> Sections;
 
   ArrayRef<Elf_Word> SymtabSHNDX;
+
+  // List of all symbols referenced or defined by this file.
+  std::vector<SymbolBody *> SymbolBodies;
+
+  llvm::BumpPtrAllocator Alloc;
 };
 
 class ArchiveFile : public InputFile {
@@ -180,39 +167,17 @@ private:
 };
 
 // .so file.
-template <typename ELFT> class SharedFileBase : public ELFFileBase<ELFT> {
+template <class ELFT> class SharedFile : public ELFFileBase<ELFT> {
   typedef ELFFileBase<ELFT> Base;
-
-protected:
-  StringRef SoName;
-
-public:
-  SharedFileBase(ELFKind EKind, MemoryBufferRef M)
-      : 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;
-
-  // Used for --as-needed
-  bool AsNeeded = false;
-  bool IsUsed = false;
-  bool isNeeded() const { return !AsNeeded || IsUsed; }
-};
-
-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;
 
   std::vector<SharedSymbol<ELFT>> SymbolBodies;
+  StringRef SoName;
 
 public:
+  StringRef getSoName() const { return SoName; }
   llvm::MutableArrayRef<SharedSymbol<ELFT>> getSharedSymbols() {
     return SymbolBodies;
   }
@@ -224,8 +189,13 @@ public:
 
   explicit SharedFile(MemoryBufferRef M);
 
-  void parseSoName() override;
-  void parse() override;
+  void parseSoName();
+  void parse();
+
+  // Used for --as-needed
+  bool AsNeeded = false;
+  bool IsUsed = false;
+  bool isNeeded() const { return !AsNeeded || IsUsed; }
 };
 
 template <typename T>

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=250006&r1=250005&r2=250006&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Sun Oct 11 21:22:58 2015
@@ -47,13 +47,13 @@ void SymbolTable<ELFT>::addFile(std::uni
       addLazy(&Sym);
     return;
   }
-  if (auto *S = dyn_cast<SharedFileBase<ELFT>>(File.get())) {
+  if (auto *S = dyn_cast<SharedFile<ELFT>>(File.get())) {
     S->parseSoName();
     if (!IncludedSoNames.insert(S->getSoName()).second)
       return;
     S->parse();
   } else {
-    cast<ObjectFileBase<ELFT>>(File.get())->parse(Comdats);
+    cast<ObjectFile<ELFT>>(File.get())->parse(Comdats);
   }
   addELFFile(cast<ELFFileBase<ELFT>>(File.release()));
 }
@@ -97,7 +97,7 @@ void SymbolTable<ELFT>::addELFFile(ELFFi
   else if (auto *S = dyn_cast<SharedFile<ELFT>>(File))
     SharedFiles.emplace_back(S);
 
-  if (auto *O = dyn_cast<ObjectFileBase<ELFT>>(File)) {
+  if (auto *O = dyn_cast<ObjectFile<ELFT>>(File)) {
     for (SymbolBody *Body : O->getSymbols())
       resolve(Body);
   }




More information about the llvm-commits mailing list