[lld] r234830 - ELF: Use less templates for ELF types.

Rui Ueyama ruiu at google.com
Mon Apr 13 17:59:05 PDT 2015


Author: ruiu
Date: Mon Apr 13 19:59:04 2015
New Revision: 234830

URL: http://llvm.org/viewvc/llvm-project?rev=234830&view=rev
Log:
ELF: Use less templates for ELF types.

These classes are templated but actually instantiated for only
one ELF type.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h
    lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64ExecutableWriter.h
    lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp
    lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h
    lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.h
    lld/trunk/lib/ReaderWriter/ELF/ARM/ARMSymbolTable.h
    lld/trunk/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.cpp
    lld/trunk/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.h
    lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h

Modified: lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h?rev=234830&r1=234829&r2=234830&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h Mon Apr 13 19:59:04 2015
@@ -16,26 +16,23 @@
 namespace lld {
 namespace elf {
 
-template <class ELFT>
-class AArch64DynamicLibraryWriter : public DynamicLibraryWriter<ELFT> {
+class AArch64DynamicLibraryWriter : public DynamicLibraryWriter<ELF64LE> {
 public:
   AArch64DynamicLibraryWriter(AArch64LinkingContext &ctx,
-                              TargetLayout<ELFT> &layout);
+                              TargetLayout<ELF64LE> &layout);
 
 protected:
   // Add any runtime files and their atoms to the output
   void createImplicitFiles(std::vector<std::unique_ptr<File>> &) override;
 };
 
-template <class ELFT>
-AArch64DynamicLibraryWriter<ELFT>::AArch64DynamicLibraryWriter(
-    AArch64LinkingContext &ctx, TargetLayout<ELFT> &layout)
-    : DynamicLibraryWriter<ELFT>(ctx, layout) {}
+AArch64DynamicLibraryWriter::AArch64DynamicLibraryWriter(
+    AArch64LinkingContext &ctx, TargetLayout<ELF64LE> &layout)
+    : DynamicLibraryWriter<ELF64LE>(ctx, layout) {}
 
-template <class ELFT>
-void AArch64DynamicLibraryWriter<ELFT>::createImplicitFiles(
+void AArch64DynamicLibraryWriter::createImplicitFiles(
     std::vector<std::unique_ptr<File>> &result) {
-  DynamicLibraryWriter<ELFT>::createImplicitFiles(result);
+  DynamicLibraryWriter<ELF64LE>::createImplicitFiles(result);
   auto gotFile = llvm::make_unique<SimpleFile>("GOTFile");
   gotFile->addAtom(*new (gotFile->allocator()) GlobalOffsetTableAtom(*gotFile));
   gotFile->addAtom(*new (gotFile->allocator()) DynamicAtom(*gotFile));

Modified: lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64ExecutableWriter.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64ExecutableWriter.h?rev=234830&r1=234829&r2=234830&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64ExecutableWriter.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64ExecutableWriter.h Mon Apr 13 19:59:04 2015
@@ -15,26 +15,23 @@
 namespace lld {
 namespace elf {
 
-template <class ELFT>
-class AArch64ExecutableWriter : public ExecutableWriter<ELFT> {
+class AArch64ExecutableWriter : public ExecutableWriter<ELF64LE> {
 public:
   AArch64ExecutableWriter(AArch64LinkingContext &ctx,
-                          TargetLayout<ELFT> &layout);
+                          TargetLayout<ELF64LE> &layout);
 
 protected:
   // Add any runtime files and their atoms to the output
   void createImplicitFiles(std::vector<std::unique_ptr<File>> &) override;
 };
 
-template <class ELFT>
-AArch64ExecutableWriter<ELFT>::AArch64ExecutableWriter(
-    AArch64LinkingContext &ctx, TargetLayout<ELFT> &layout)
-    : ExecutableWriter<ELFT>(ctx, layout) {}
+AArch64ExecutableWriter::AArch64ExecutableWriter(AArch64LinkingContext &ctx,
+                                                 TargetLayout<ELF64LE> &layout)
+    : ExecutableWriter<ELF64LE>(ctx, layout) {}
 
-template <class ELFT>
-void AArch64ExecutableWriter<ELFT>::createImplicitFiles(
+void AArch64ExecutableWriter::createImplicitFiles(
     std::vector<std::unique_ptr<File>> &result) {
-  ExecutableWriter<ELFT>::createImplicitFiles(result);
+  ExecutableWriter<ELF64LE>::createImplicitFiles(result);
   auto gotFile = llvm::make_unique<SimpleFile>("GOTFile");
   gotFile->addAtom(*new (gotFile->allocator()) GlobalOffsetTableAtom(*gotFile));
   if (this->_ctx.isDynamic())

Modified: lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp?rev=234830&r1=234829&r2=234830&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.cpp Mon Apr 13 19:59:04 2015
@@ -23,11 +23,9 @@ AArch64TargetHandler::AArch64TargetHandl
 std::unique_ptr<Writer> AArch64TargetHandler::getWriter() {
   switch (this->_ctx.getOutputELFType()) {
   case llvm::ELF::ET_EXEC:
-    return llvm::make_unique<AArch64ExecutableWriter<ELF64LE>>(_ctx,
-                                                               *_targetLayout);
+    return llvm::make_unique<AArch64ExecutableWriter>(_ctx, *_targetLayout);
   case llvm::ELF::ET_DYN:
-    return llvm::make_unique<AArch64DynamicLibraryWriter<ELF64LE>>(
-        _ctx, *_targetLayout);
+    return llvm::make_unique<AArch64DynamicLibraryWriter>(_ctx, *_targetLayout);
   case llvm::ELF::ET_REL:
     llvm_unreachable("TODO: support -r mode");
   default:

Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h?rev=234830&r1=234829&r2=234830&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h Mon Apr 13 19:59:04 2015
@@ -22,10 +22,9 @@ const char *gotSymbol = "_GLOBAL_OFFSET_
 namespace lld {
 namespace elf {
 
-template <class ELFT>
-class ARMExecutableWriter : public ExecutableWriter<ELFT> {
+class ARMExecutableWriter : public ExecutableWriter<ELF32LE> {
 public:
-  ARMExecutableWriter(ARMLinkingContext &ctx, ARMTargetLayout<ELFT> &layout);
+  ARMExecutableWriter(ARMLinkingContext &ctx, ARMTargetLayout &layout);
 
 protected:
   // Add any runtime files and their atoms to the output
@@ -34,34 +33,31 @@ protected:
   void finalizeDefaultAtomValues() override;
 
   /// \brief Create symbol table.
-  unique_bump_ptr<SymbolTable<ELFT>> createSymbolTable() override;
+  unique_bump_ptr<SymbolTable<ELF32LE>> createSymbolTable() override;
 
   void processUndefinedSymbol(StringRef symName,
-                              RuntimeFile<ELFT> &file) const override;
+                              RuntimeFile<ELF32LE> &file) const override;
 
   // Setup the ELF header.
   std::error_code setELFHeader() override;
 
 private:
   ARMLinkingContext &_ctx;
-  ARMTargetLayout<ELFT> &_armLayout;
+  ARMTargetLayout &_armLayout;
 };
 
-template <class ELFT>
-ARMExecutableWriter<ELFT>::ARMExecutableWriter(ARMLinkingContext &ctx,
-                                               ARMTargetLayout<ELFT> &layout)
-    : ExecutableWriter<ELFT>(ctx, layout), _ctx(ctx), _armLayout(layout) {}
+ARMExecutableWriter::ARMExecutableWriter(ARMLinkingContext &ctx,
+                                         ARMTargetLayout &layout)
+    : ExecutableWriter<ELF32LE>(ctx, layout), _ctx(ctx), _armLayout(layout) {}
 
-template <class ELFT>
-void ARMExecutableWriter<ELFT>::createImplicitFiles(
+void ARMExecutableWriter::createImplicitFiles(
     std::vector<std::unique_ptr<File>> &result) {
-  ExecutableWriter<ELFT>::createImplicitFiles(result);
+  ExecutableWriter<ELF32LE>::createImplicitFiles(result);
 }
 
-template <class ELFT>
-void ARMExecutableWriter<ELFT>::finalizeDefaultAtomValues() {
+void ARMExecutableWriter::finalizeDefaultAtomValues() {
   // Finalize the atom values that are part of the parent.
-  ExecutableWriter<ELFT>::finalizeDefaultAtomValues();
+  ExecutableWriter<ELF32LE>::finalizeDefaultAtomValues();
   AtomLayout *gotAtom = _armLayout.findAbsoluteAtom(gotSymbol);
   if (gotAtom) {
     if (auto gotpltSection = _armLayout.findOutputSection(".got.plt"))
@@ -74,16 +70,13 @@ void ARMExecutableWriter<ELFT>::finalize
   // TODO: resolve addresses of __exidx_start/_end atoms
 }
 
-template <class ELFT>
-unique_bump_ptr<SymbolTable<ELFT>>
-ARMExecutableWriter<ELFT>::createSymbolTable() {
-  return unique_bump_ptr<SymbolTable<ELFT>>(
-      new (this->_alloc) ARMSymbolTable<ELFT>(this->_ctx));
+unique_bump_ptr<SymbolTable<ELF32LE>> ARMExecutableWriter::createSymbolTable() {
+  return unique_bump_ptr<SymbolTable<ELF32LE>>(new (this->_alloc)
+                                                   ARMSymbolTable(this->_ctx));
 }
 
-template <class ELFT>
-void ARMExecutableWriter<ELFT>::processUndefinedSymbol(
-    StringRef symName, RuntimeFile<ELFT> &file) const {
+void ARMExecutableWriter::processUndefinedSymbol(
+    StringRef symName, RuntimeFile<ELF32LE> &file) const {
   if (symName == gotSymbol) {
     file.addAbsoluteAtom(gotSymbol);
   } else if (symName.startswith("__exidx")) {
@@ -92,9 +85,8 @@ void ARMExecutableWriter<ELFT>::processU
   }
 }
 
-template <class ELFT>
-std::error_code ARMExecutableWriter<ELFT>::setELFHeader() {
-  if (std::error_code ec = ExecutableWriter<ELFT>::setELFHeader())
+std::error_code ARMExecutableWriter::setELFHeader() {
+  if (std::error_code ec = ExecutableWriter<ELF32LE>::setELFHeader())
     return ec;
 
   // Set ARM-specific flags.

Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.h?rev=234830&r1=234829&r2=234830&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationHandler.h Mon Apr 13 19:59:04 2015
@@ -15,19 +15,18 @@
 namespace lld {
 namespace elf {
 
-template <class ELFT> class ARMTargetLayout;
+class ARMTargetLayout;
 
 class ARMTargetRelocationHandler final : public TargetRelocationHandler {
 public:
-  ARMTargetRelocationHandler(ARMTargetLayout<ELF32LE> &layout)
-      : _armLayout(layout) {}
+  ARMTargetRelocationHandler(ARMTargetLayout &layout) : _armLayout(layout) {}
 
   std::error_code applyRelocation(ELFWriter &, llvm::FileOutputBuffer &,
                                   const lld::AtomLayout &,
                                   const Reference &) const override;
 
 private:
-  ARMTargetLayout<ELF32LE> &_armLayout;
+  ARMTargetLayout &_armLayout;
 };
 
 } // end namespace elf

Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMSymbolTable.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMSymbolTable.h?rev=234830&r1=234829&r2=234830&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMSymbolTable.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMSymbolTable.h Mon Apr 13 19:59:04 2015
@@ -14,10 +14,9 @@ namespace lld {
 namespace elf {
 
 /// \brief The SymbolTable class represents the symbol table in a ELF file
-template<class ELFT>
-class ARMSymbolTable : public SymbolTable<ELFT> {
+class ARMSymbolTable : public SymbolTable<ELF32LE> {
 public:
-  typedef llvm::object::Elf_Sym_Impl<ELFT> Elf_Sym;
+  typedef llvm::object::Elf_Sym_Impl<ELF32LE> Elf_Sym;
 
   ARMSymbolTable(const ELFLinkingContext &ctx);
 
@@ -25,15 +24,13 @@ public:
                       int64_t addr) override;
 };
 
-template <class ELFT>
-ARMSymbolTable<ELFT>::ARMSymbolTable(const ELFLinkingContext &ctx)
-    : SymbolTable<ELFT>(ctx, ".symtab",
-                        TargetLayout<ELFT>::ORDER_SYMBOL_TABLE) {}
-
-template <class ELFT>
-void ARMSymbolTable<ELFT>::addDefinedAtom(Elf_Sym &sym, const DefinedAtom *da,
-                                          int64_t addr) {
-  SymbolTable<ELFT>::addDefinedAtom(sym, da, addr);
+ARMSymbolTable::ARMSymbolTable(const ELFLinkingContext &ctx)
+    : SymbolTable<ELF32LE>(ctx, ".symtab",
+                           TargetLayout<ELF32LE>::ORDER_SYMBOL_TABLE) {}
+
+void ARMSymbolTable::addDefinedAtom(Elf_Sym &sym, const DefinedAtom *da,
+                                    int64_t addr) {
+  SymbolTable<ELF32LE>::addDefinedAtom(sym, da, addr);
 
   // Set zero bit to distinguish real symbols addressing Thumb instructions.
   // Don't care about mapping symbols like $t and others.

Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.cpp?rev=234830&r1=234829&r2=234830&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.cpp Mon Apr 13 19:59:04 2015
@@ -16,14 +16,13 @@ using namespace lld;
 using namespace elf;
 
 ARMTargetHandler::ARMTargetHandler(ARMLinkingContext &ctx)
-    : _ctx(ctx), _targetLayout(new ARMTargetLayout<ELF32LE>(ctx)),
+    : _ctx(ctx), _targetLayout(new ARMTargetLayout(ctx)),
       _relocationHandler(new ARMTargetRelocationHandler(*_targetLayout)) {}
 
 std::unique_ptr<Writer> ARMTargetHandler::getWriter() {
   switch (this->_ctx.getOutputELFType()) {
   case llvm::ELF::ET_EXEC:
-    return llvm::make_unique<ARMExecutableWriter<ELF32LE>>(_ctx,
-                                                           *_targetLayout);
+    return llvm::make_unique<ARMExecutableWriter>(_ctx, *_targetLayout);
   default:
     llvm_unreachable("unsupported output type");
   }

Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.h?rev=234830&r1=234829&r2=234830&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMTargetHandler.h Mon Apr 13 19:59:04 2015
@@ -16,12 +16,13 @@
 #include "TargetLayout.h"
 
 namespace lld {
+class ELFLinkingContext;
+
 namespace elf {
-class ARMLinkingContext;
 
-template <class ELFT> class ARMTargetLayout : public TargetLayout<ELFT> {
+class ARMTargetLayout : public TargetLayout<ELF32LE> {
 public:
-  ARMTargetLayout(ARMLinkingContext &ctx) : TargetLayout<ELFT>(ctx) {}
+  ARMTargetLayout(ELFLinkingContext &ctx) : TargetLayout<ELF32LE>(ctx) {}
 
   uint64_t getGOTSymAddr() {
     std::call_once(_gotSymOnce, [this]() {
@@ -80,7 +81,7 @@ public:
 
 private:
   ARMLinkingContext &_ctx;
-  std::unique_ptr<ARMTargetLayout<ELF32LE>> _targetLayout;
+  std::unique_ptr<ARMTargetLayout> _targetLayout;
   std::unique_ptr<ARMTargetRelocationHandler> _relocationHandler;
 };
 

Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h?rev=234830&r1=234829&r2=234830&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h Mon Apr 13 19:59:04 2015
@@ -21,7 +21,7 @@ namespace elf {
 class HexagonLinkingContext;
 
 /// \brief Handle Hexagon SData section
-template <class ELFT> class SDataSection : public AtomSection<ELFT> {
+class SDataSection : public AtomSection<ELF32LE> {
 public:
   SDataSection(const HexagonLinkingContext &ctx);
 
@@ -43,7 +43,7 @@ public:
 
   HexagonTargetLayout(HexagonLinkingContext &hti)
       : TargetLayout<ELF32LE>(hti), _sdataSection() {
-    _sdataSection = new (_alloc) SDataSection<ELF32LE>(hti);
+    _sdataSection = new (_alloc) SDataSection(hti);
   }
 
   /// \brief Return the section order for a input section
@@ -103,7 +103,7 @@ public:
 
 private:
   llvm::BumpPtrAllocator _alloc;
-  SDataSection<ELF32LE> *_sdataSection = nullptr;
+  SDataSection *_sdataSection = nullptr;
   uint64_t _gotAddr = 0;
   std::once_flag _gotOnce;
 };
@@ -137,7 +137,7 @@ private:
   std::unique_ptr<HexagonTargetRelocationHandler> _relocationHandler;
 };
 
-template <class ELFT> void SDataSection<ELFT>::doPreFlight() {
+inline void SDataSection::doPreFlight() {
   // sort the atoms on the alignments they have been set
   std::stable_sort(this->_atoms.begin(), this->_atoms.end(),
                                              [](const lld::AtomLayout * A,
@@ -167,17 +167,15 @@ template <class ELFT> void SDataSection<
   }
 } // finalize
 
-template <class ELFT>
-SDataSection<ELFT>::SDataSection(const HexagonLinkingContext &ctx)
-    : AtomSection<ELFT>(ctx, ".sdata", DefinedAtom::typeDataFast, 0,
-                        HexagonTargetLayout::ORDER_SDATA) {
+inline SDataSection::SDataSection(const HexagonLinkingContext &ctx)
+    : AtomSection<ELF32LE>(ctx, ".sdata", DefinedAtom::typeDataFast, 0,
+                           HexagonTargetLayout::ORDER_SDATA) {
   this->_type = SHT_PROGBITS;
   this->_flags = SHF_ALLOC | SHF_WRITE;
   this->_alignment = 4096;
 }
 
-template <class ELFT>
-const lld::AtomLayout *SDataSection<ELFT>::appendAtom(const Atom *atom) {
+inline const lld::AtomLayout *SDataSection::appendAtom(const Atom *atom) {
   const DefinedAtom *definedAtom = cast<DefinedAtom>(atom);
   DefinedAtom::Alignment atomAlign = definedAtom->alignment();
   uint64_t alignment = atomAlign.value;





More information about the llvm-commits mailing list