From 751bb41be491d5f287629e8ec4cfc543838c3171 Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Wed, 25 Feb 2015 23:27:13 +0000 Subject: [PATCH] [ELF][x86] Detemplatify ELFT. There's only a single valid instantiation. llvm-svn: 230574 --- .../ELF/X86_64/X86_64DynamicLibraryWriter.h | 27 +++++++------- lld/lib/ReaderWriter/ELF/X86_64/X86_64ElfType.h | 21 +++++++++++ .../ELF/X86_64/X86_64ExecutableWriter.h | 41 +++++++++------------- .../ELF/X86_64/X86_64RelocationHandler.h | 6 ++-- .../ELF/X86_64/X86_64TargetHandler.cpp | 14 ++++---- .../ReaderWriter/ELF/X86_64/X86_64TargetHandler.h | 11 +++--- 6 files changed, 64 insertions(+), 56 deletions(-) create mode 100644 lld/lib/ReaderWriter/ELF/X86_64/X86_64ElfType.h diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h index aec229b..d25c739 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h @@ -10,28 +10,28 @@ #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 X86_64DynamicLibraryWriter : public DynamicLibraryWriter { +class X86_64DynamicLibraryWriter : public DynamicLibraryWriter { public: X86_64DynamicLibraryWriter(X86_64LinkingContext &context, - X86_64TargetLayout &layout); + X86_64TargetLayout &layout); protected: // Add any runtime files and their atoms to the output virtual bool createImplicitFiles(std::vector> &); virtual void finalizeDefaultAtomValues() { - return DynamicLibraryWriter::finalizeDefaultAtomValues(); + return DynamicLibraryWriter::finalizeDefaultAtomValues(); } virtual void addDefaultAtoms() { - return DynamicLibraryWriter::addDefaultAtoms(); + return DynamicLibraryWriter::addDefaultAtoms(); } private: @@ -43,20 +43,17 @@ private: std::unique_ptr _gotFile; X86_64LinkingContext &_context; - X86_64TargetLayout &_x86_64Layout; + X86_64TargetLayout &_x86_64Layout; }; -template -X86_64DynamicLibraryWriter::X86_64DynamicLibraryWriter( - X86_64LinkingContext &context, X86_64TargetLayout &layout) - : DynamicLibraryWriter(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 -bool X86_64DynamicLibraryWriter::createImplicitFiles( +bool X86_64DynamicLibraryWriter::createImplicitFiles( std::vector> &result) { - DynamicLibraryWriter::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 index 0000000..0b982e7 --- /dev/null +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ElfType.h @@ -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 X86_64ELFType; +} +} + +#endif diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ExecutableWriter.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ExecutableWriter.h index 1b7a26a..f549ed6 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ExecutableWriter.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ExecutableWriter.h @@ -10,27 +10,38 @@ #define X86_64_EXECUTABLE_WRITER_H #include "ExecutableWriter.h" +#include "X86_64ElfType.h" #include "X86_64LinkingContext.h" namespace lld { namespace elf { -template -class X86_64ExecutableWriter : public ExecutableWriter { +class X86_64ExecutableWriter : public ExecutableWriter { public: X86_64ExecutableWriter(X86_64LinkingContext &context, - X86_64TargetLayout &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> &); + virtual bool + createImplicitFiles(std::vector> &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::finalizeDefaultAtomValues(); + return ExecutableWriter::finalizeDefaultAtomValues(); } virtual void addDefaultAtoms() { - return ExecutableWriter::addDefaultAtoms(); + return ExecutableWriter::addDefaultAtoms(); } private: @@ -42,26 +53,8 @@ private: std::unique_ptr _gotFile; X86_64LinkingContext &_context; - X86_64TargetLayout &_x86_64Layout; }; -template -X86_64ExecutableWriter::X86_64ExecutableWriter( - X86_64LinkingContext &context, X86_64TargetLayout &layout) - : ExecutableWriter(context, layout), _gotFile(new GOTFile(context)), - _context(context), _x86_64Layout(layout) {} - -template -bool X86_64ExecutableWriter::createImplicitFiles( - std::vector> &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; -} - } // namespace elf } // namespace lld diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h index 1b282ba..9e2c2171 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h @@ -16,11 +16,11 @@ namespace lld { namespace elf { typedef llvm::object::ELFType X86_64ELFType; -template class X86_64TargetLayout; +class X86_64TargetLayout; class X86_64TargetRelocationHandler final : public TargetRelocationHandler { public: - X86_64TargetRelocationHandler(X86_64TargetLayout &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_64Layout; + X86_64TargetLayout &_x86_64Layout; }; } // end namespace elf diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp index 32d5fd9..f35330e 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp @@ -17,10 +17,9 @@ using namespace lld; using namespace elf; X86_64TargetHandler::X86_64TargetHandler(X86_64LinkingContext &context) - : _context(context), - _x86_64TargetLayout(new X86_64TargetLayout(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 ®istry) { registry.addKindTable(Reference::KindNamespace::ELF, @@ -30,12 +29,11 @@ void X86_64TargetHandler::registerRelocationNames(Registry ®istry) { std::unique_ptr X86_64TargetHandler::getWriter() { switch (this->_context.getOutputELFType()) { case llvm::ELF::ET_EXEC: - return std::unique_ptr(new X86_64ExecutableWriter( - _context, *_x86_64TargetLayout.get())); + return std::unique_ptr( + new X86_64ExecutableWriter(_context, *_x86_64TargetLayout.get())); case llvm::ELF::ET_DYN: return std::unique_ptr( - new X86_64DynamicLibraryWriter( - _context, *_x86_64TargetLayout.get())); + new X86_64DynamicLibraryWriter(_context, *_x86_64TargetLayout.get())); case llvm::ELF::ET_REL: llvm_unreachable("TODO: support -r mode"); default: diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h index a8ab3a5..5bd02c2 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h @@ -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" @@ -19,12 +20,10 @@ namespace lld { namespace elf { -class X86_64LinkingContext; - -template class X86_64TargetLayout : public TargetLayout { +class X86_64TargetLayout : public TargetLayout { public: X86_64TargetLayout(X86_64LinkingContext &context) - : TargetLayout(context) {} + : TargetLayout(context) {} }; class X86_64TargetHandler final @@ -32,7 +31,7 @@ class X86_64TargetHandler final public: X86_64TargetHandler(X86_64LinkingContext &context); - X86_64TargetLayout &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; + std::unique_ptr _x86_64TargetLayout; std::unique_ptr _x86_64RelocationHandler; }; -- 2.7.4