[ELF][x86] Detemplatify ELFT. There's only a single valid instantiation.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Wed, 25 Feb 2015 23:27:13 +0000 (23:27 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Wed, 25 Feb 2015 23:27:13 +0000 (23:27 +0000)
llvm-svn: 230574

lld/lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h
lld/lib/ReaderWriter/ELF/X86_64/X86_64ElfType.h [new file with mode: 0644]
lld/lib/ReaderWriter/ELF/X86_64/X86_64ExecutableWriter.h
lld/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h
lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp
lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h

index aec229b..d25c739 100644 (file)
 #define X86_64_DYNAMIC_LIBRARY_WRITER_H
 
 #include "DynamicLibraryWriter.h"
+#include "X86_64ElfType.h"
 #include "X86_64LinkingContext.h"
 #include "X86_64TargetHandler.h"
 
 namespace lld {
 namespace elf {
 
-template <class ELFT>
-class X86_64DynamicLibraryWriter : public DynamicLibraryWriter<ELFT> {
+class X86_64DynamicLibraryWriter : public DynamicLibraryWriter<X86_64ELFType> {
 public:
   X86_64DynamicLibraryWriter(X86_64LinkingContext &context,
-                             X86_64TargetLayout<ELFT> &layout);
+                             X86_64TargetLayout &layout);
 
 protected:
   // Add any runtime files and their atoms to the output
   virtual bool createImplicitFiles(std::vector<std::unique_ptr<File>> &);
 
   virtual void finalizeDefaultAtomValues() {
-    return DynamicLibraryWriter<ELFT>::finalizeDefaultAtomValues();
+    return DynamicLibraryWriter::finalizeDefaultAtomValues();
   }
 
   virtual void addDefaultAtoms() {
-    return DynamicLibraryWriter<ELFT>::addDefaultAtoms();
+    return DynamicLibraryWriter::addDefaultAtoms();
   }
 
 private:
@@ -43,20 +43,17 @@ private:
 
   std::unique_ptr<GOTFile> _gotFile;
   X86_64LinkingContext &_context;
-  X86_64TargetLayout<ELFT> &_x86_64Layout;
+  X86_64TargetLayout &_x86_64Layout;
 };
 
-template <class ELFT>
-X86_64DynamicLibraryWriter<ELFT>::X86_64DynamicLibraryWriter(
-    X86_64LinkingContext &context, X86_64TargetLayout<ELFT> &layout)
-    : DynamicLibraryWriter<ELFT>(context, layout),
-      _gotFile(new GOTFile(context)), _context(context), _x86_64Layout(layout) {
-}
+X86_64DynamicLibraryWriter::X86_64DynamicLibraryWriter(
+    X86_64LinkingContext &context, X86_64TargetLayout &layout)
+    : DynamicLibraryWriter(context, layout), _gotFile(new GOTFile(context)),
+      _context(context), _x86_64Layout(layout) {}
 
-template <class ELFT>
-bool X86_64DynamicLibraryWriter<ELFT>::createImplicitFiles(
+bool X86_64DynamicLibraryWriter::createImplicitFiles(
     std::vector<std::unique_ptr<File>> &result) {
-  DynamicLibraryWriter<ELFT>::createImplicitFiles(result);
+  DynamicLibraryWriter::createImplicitFiles(result);
   _gotFile->addAtom(*new (_gotFile->_alloc) GLOBAL_OFFSET_TABLEAtom(*_gotFile));
   _gotFile->addAtom(*new (_gotFile->_alloc) DYNAMICAtom(*_gotFile));
   result.push_back(std::move(_gotFile));
diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ElfType.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ElfType.h
new file mode 100644 (file)
index 0000000..0b982e7
--- /dev/null
@@ -0,0 +1,21 @@
+//===- lib/ReaderWriter/ELF/X86_64/X86_64ElfType.h ------------------------===//
+//
+//                             The LLVM Linker
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLD_READER_WRITER_ELF_X86_64_X86_64_ELF_TYPE_H
+#define LLD_READER_WRITER_ELF_X86_64_X86_64_ELF_TYPE_H
+
+#include "llvm/Object/ELF.h"
+
+namespace lld {
+namespace elf {
+typedef llvm::object::ELFType<llvm::support::little, 2, true> X86_64ELFType;
+}
+}
+
+#endif
index 1b7a26a..f549ed6 100644 (file)
 #define X86_64_EXECUTABLE_WRITER_H
 
 #include "ExecutableWriter.h"
+#include "X86_64ElfType.h"
 #include "X86_64LinkingContext.h"
 
 namespace lld {
 namespace elf {
 
-template <class ELFT>
-class X86_64ExecutableWriter : public ExecutableWriter<ELFT> {
+class X86_64ExecutableWriter : public ExecutableWriter<X86_64ELFType> {
 public:
   X86_64ExecutableWriter(X86_64LinkingContext &context,
-                         X86_64TargetLayout<ELFT> &layout);
+                         X86_64TargetLayout &layout)
+      : ExecutableWriter(context, layout), _gotFile(new GOTFile(context)),
+        _context(context) {}
 
 protected:
   // Add any runtime files and their atoms to the output
-  virtual bool createImplicitFiles(std::vector<std::unique_ptr<File>> &);
+  virtual bool
+  createImplicitFiles(std::vector<std::unique_ptr<File>> &result) {
+    ExecutableWriter::createImplicitFiles(result);
+    _gotFile->addAtom(*new (_gotFile->_alloc)
+                      GLOBAL_OFFSET_TABLEAtom(*_gotFile));
+    if (_context.isDynamic())
+      _gotFile->addAtom(*new (_gotFile->_alloc) DYNAMICAtom(*_gotFile));
+    result.push_back(std::move(_gotFile));
+    return true;
+  }
 
   virtual void finalizeDefaultAtomValues() {
-    return ExecutableWriter<ELFT>::finalizeDefaultAtomValues();
+    return ExecutableWriter::finalizeDefaultAtomValues();
   }
 
   virtual void addDefaultAtoms() {
-    return ExecutableWriter<ELFT>::addDefaultAtoms();
+    return ExecutableWriter::addDefaultAtoms();
   }
 
 private:
@@ -42,26 +53,8 @@ private:
 
   std::unique_ptr<GOTFile> _gotFile;
   X86_64LinkingContext &_context;
-  X86_64TargetLayout<ELFT> &_x86_64Layout;
 };
 
-template <class ELFT>
-X86_64ExecutableWriter<ELFT>::X86_64ExecutableWriter(
-    X86_64LinkingContext &context, X86_64TargetLayout<ELFT> &layout)
-    : ExecutableWriter<ELFT>(context, layout), _gotFile(new GOTFile(context)),
-      _context(context), _x86_64Layout(layout) {}
-
-template <class ELFT>
-bool X86_64ExecutableWriter<ELFT>::createImplicitFiles(
-    std::vector<std::unique_ptr<File>> &result) {
-  ExecutableWriter<ELFT>::createImplicitFiles(result);
-  _gotFile->addAtom(*new (_gotFile->_alloc) GLOBAL_OFFSET_TABLEAtom(*_gotFile));
-  if (_context.isDynamic())
-    _gotFile->addAtom(*new (_gotFile->_alloc) DYNAMICAtom(*_gotFile));
-  result.push_back(std::move(_gotFile));
-  return true;
-}
-
 } // namespace elf
 } // namespace lld
 
index 1b282ba..9e2c217 100644 (file)
@@ -16,11 +16,11 @@ namespace lld {
 namespace elf {
 typedef llvm::object::ELFType<llvm::support::little, 2, true> X86_64ELFType;
 
-template <class ELFT> class X86_64TargetLayout;
+class X86_64TargetLayout;
 
 class X86_64TargetRelocationHandler final : public TargetRelocationHandler {
 public:
-  X86_64TargetRelocationHandler(X86_64TargetLayout<X86_64ELFType> &layout)
+  X86_64TargetRelocationHandler(X86_64TargetLayout &layout)
       : _tlsSize(0), _x86_64Layout(layout) {}
 
   std::error_code applyRelocation(ELFWriter &, llvm::FileOutputBuffer &,
@@ -30,7 +30,7 @@ public:
 private:
   // Cached size of the TLS segment.
   mutable uint64_t _tlsSize;
-  X86_64TargetLayout<X86_64ELFType> &_x86_64Layout;
+  X86_64TargetLayout &_x86_64Layout;
 };
 
 } // end namespace elf
index 32d5fd9..f35330e 100644 (file)
@@ -17,10 +17,9 @@ using namespace lld;
 using namespace elf;
 
 X86_64TargetHandler::X86_64TargetHandler(X86_64LinkingContext &context)
-    : _context(context),
-      _x86_64TargetLayout(new X86_64TargetLayout<X86_64ELFType>(context)),
-      _x86_64RelocationHandler(new X86_64TargetRelocationHandler(
-          *_x86_64TargetLayout.get())) {}
+    : _context(context), _x86_64TargetLayout(new X86_64TargetLayout(context)),
+      _x86_64RelocationHandler(
+          new X86_64TargetRelocationHandler(*_x86_64TargetLayout.get())) {}
 
 void X86_64TargetHandler::registerRelocationNames(Registry &registry) {
   registry.addKindTable(Reference::KindNamespace::ELF,
@@ -30,12 +29,11 @@ void X86_64TargetHandler::registerRelocationNames(Registry &registry) {
 std::unique_ptr<Writer> X86_64TargetHandler::getWriter() {
   switch (this->_context.getOutputELFType()) {
   case llvm::ELF::ET_EXEC:
-    return std::unique_ptr<Writer>(new X86_64ExecutableWriter<X86_64ELFType>(
-        _context, *_x86_64TargetLayout.get()));
+    return std::unique_ptr<Writer>(
+        new X86_64ExecutableWriter(_context, *_x86_64TargetLayout.get()));
   case llvm::ELF::ET_DYN:
     return std::unique_ptr<Writer>(
-        new X86_64DynamicLibraryWriter<X86_64ELFType>(
-            _context, *_x86_64TargetLayout.get()));
+        new X86_64DynamicLibraryWriter(_context, *_x86_64TargetLayout.get()));
   case llvm::ELF::ET_REL:
     llvm_unreachable("TODO: support -r mode");
   default:
index a8ab3a5..5bd02c2 100644 (file)
@@ -11,6 +11,7 @@
 #define LLD_READER_WRITER_ELF_X86_64_X86_64_TARGET_HANDLER_H
 
 #include "DefaultTargetHandler.h"
+#include "X86_64LinkingContext.h"
 #include "TargetLayout.h"
 #include "X86_64ELFFile.h"
 #include "X86_64ELFReader.h"
 
 namespace lld {
 namespace elf {
-class X86_64LinkingContext;
-
-template <class ELFT> class X86_64TargetLayout : public TargetLayout<ELFT> {
+class X86_64TargetLayout : public TargetLayout<X86_64ELFType> {
 public:
   X86_64TargetLayout(X86_64LinkingContext &context)
-      : TargetLayout<ELFT>(context) {}
+      : TargetLayout(context) {}
 };
 
 class X86_64TargetHandler final
@@ -32,7 +31,7 @@ class X86_64TargetHandler final
 public:
   X86_64TargetHandler(X86_64LinkingContext &context);
 
-  X86_64TargetLayout<X86_64ELFType> &getTargetLayout() override {
+  X86_64TargetLayout &getTargetLayout() override {
     return *(_x86_64TargetLayout.get());
   }
 
@@ -55,7 +54,7 @@ public:
 private:
   static const Registry::KindStrings kindStrings[];
   X86_64LinkingContext &_context;
-  std::unique_ptr<X86_64TargetLayout<X86_64ELFType>> _x86_64TargetLayout;
+  std::unique_ptr<X86_64TargetLayout> _x86_64TargetLayout;
   std::unique_ptr<X86_64TargetRelocationHandler> _x86_64RelocationHandler;
 };