[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