diff options
5 files changed, 36 insertions, 74 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h index b8e5a31afd4..3dac56f180a 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h @@ -19,8 +19,7 @@ namespace elf { template <typename ELFT> class HexagonTargetLayout; template <class ELFT> -class HexagonDynamicLibraryWriter : public DynamicLibraryWriter<ELFT>, - public HexagonELFWriter<ELFT> { +class HexagonDynamicLibraryWriter : public DynamicLibraryWriter<ELFT> { public: HexagonDynamicLibraryWriter(HexagonLinkingContext &ctx, HexagonTargetLayout<ELFT> &layout); @@ -33,7 +32,7 @@ protected: virtual std::error_code setELFHeader() { DynamicLibraryWriter<ELFT>::setELFHeader(); - HexagonELFWriter<ELFT>::setELFHeader(*this->_elfHeader); + setHexagonELFHeader(*this->_elfHeader); return std::error_code(); } @@ -51,8 +50,7 @@ private: template <class ELFT> HexagonDynamicLibraryWriter<ELFT>::HexagonDynamicLibraryWriter( HexagonLinkingContext &ctx, HexagonTargetLayout<ELFT> &layout) - : DynamicLibraryWriter<ELFT>(ctx, layout), - HexagonELFWriter<ELFT>(ctx, layout), _ctx(ctx), + : DynamicLibraryWriter<ELFT>(ctx, layout), _ctx(ctx), _hexagonTargetLayout(layout), _hexagonRuntimeFile(new HexagonRuntimeFile<ELFT>(ctx)) {} @@ -70,7 +68,8 @@ template <class ELFT> void HexagonDynamicLibraryWriter<ELFT>::finalizeDefaultAtomValues() { // Finalize the atom values that are part of the parent. DynamicLibraryWriter<ELFT>::finalizeDefaultAtomValues(); - HexagonELFWriter<ELFT>::finalizeHexagonRuntimeAtomValues(); + if (_ctx.isDynamic()) + finalizeHexagonRuntimeAtomValues(_hexagonTargetLayout); } } // namespace elf diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFWriters.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFWriters.h deleted file mode 100644 index 757237fff61..00000000000 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFWriters.h +++ /dev/null @@ -1,61 +0,0 @@ -//===- lib/ReaderWriter/ELF/Hexagon/HexagonELFWriters.h -------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef HEXAGON_ELF_WRITERS_H -#define HEXAGON_ELF_WRITERS_H - -#include "HexagonLinkingContext.h" -#include "OutputELFWriter.h" - -namespace lld { -namespace elf { - -template <class ELFT> class HexagonTargetLayout; - -template <typename ELFT> class HexagonELFWriter { -public: - HexagonELFWriter(HexagonLinkingContext &ctx, - HexagonTargetLayout<ELFT> &targetLayout) - : _ctx(ctx), _hexagonTargetLayout(targetLayout) {} - -protected: - bool setELFHeader(ELFHeader<ELFT> &elfHeader) { - elfHeader.e_ident(llvm::ELF::EI_VERSION, 1); - elfHeader.e_ident(llvm::ELF::EI_OSABI, 0); - elfHeader.e_version(1); - elfHeader.e_flags(0x3); - return true; - } - - void finalizeHexagonRuntimeAtomValues() { - if (_ctx.isDynamic()) { - auto gotAtomIter = - _hexagonTargetLayout.findAbsoluteAtom("_GLOBAL_OFFSET_TABLE_"); - auto gotpltSection = _hexagonTargetLayout.findOutputSection(".got.plt"); - if (gotpltSection) - (*gotAtomIter)->_virtualAddr = gotpltSection->virtualAddr(); - else - (*gotAtomIter)->_virtualAddr = 0; - auto dynamicAtomIter = _hexagonTargetLayout.findAbsoluteAtom("_DYNAMIC"); - auto dynamicSection = _hexagonTargetLayout.findOutputSection(".dynamic"); - if (dynamicSection) - (*dynamicAtomIter)->_virtualAddr = dynamicSection->virtualAddr(); - else - (*dynamicAtomIter)->_virtualAddr = 0; - } - } - -private: - HexagonLinkingContext &_ctx; - HexagonTargetLayout<ELFT> &_hexagonTargetLayout; -}; - -} // elf -} // lld -#endif // HEXAGON_ELF_WRITERS_H diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h index d52fb328f4a..f29ec623fb0 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h @@ -10,7 +10,6 @@ #define HEXAGON_EXECUTABLE_WRITER_H #include "ExecutableWriter.h" -#include "HexagonELFWriters.h" #include "HexagonExecutableAtoms.h" #include "HexagonLinkingContext.h" @@ -20,8 +19,7 @@ namespace elf { template <typename ELFT> class HexagonTargetLayout; template <class ELFT> -class HexagonExecutableWriter : public ExecutableWriter<ELFT>, - public HexagonELFWriter<ELFT> { +class HexagonExecutableWriter : public ExecutableWriter<ELFT> { public: HexagonExecutableWriter(HexagonLinkingContext &ctx, HexagonTargetLayout<ELFT> &layout); @@ -34,7 +32,7 @@ protected: virtual std::error_code setELFHeader() { ExecutableWriter<ELFT>::setELFHeader(); - HexagonELFWriter<ELFT>::setELFHeader(*this->_elfHeader); + setHexagonELFHeader(*this->_elfHeader); return std::error_code(); } @@ -55,8 +53,8 @@ private: template <class ELFT> HexagonExecutableWriter<ELFT>::HexagonExecutableWriter( HexagonLinkingContext &ctx, HexagonTargetLayout<ELFT> &layout) - : ExecutableWriter<ELFT>(ctx, layout), HexagonELFWriter<ELFT>(ctx, layout), - _ctx(ctx), _hexagonTargetLayout(layout), + : ExecutableWriter<ELFT>(ctx, layout), _ctx(ctx), + _hexagonTargetLayout(layout), _hexagonRuntimeFile(new HexagonRuntimeFile<ELFT>(ctx)) {} template <class ELFT> @@ -76,7 +74,8 @@ void HexagonExecutableWriter<ELFT>::finalizeDefaultAtomValues() { auto sdabaseAtomIter = _hexagonTargetLayout.findAbsoluteAtom("_SDA_BASE_"); (*sdabaseAtomIter)->_virtualAddr = _hexagonTargetLayout.getSDataSection()->virtualAddr(); - HexagonELFWriter<ELFT>::finalizeHexagonRuntimeAtomValues(); + if (_ctx.isDynamic()) + finalizeHexagonRuntimeAtomValues(_hexagonTargetLayout); } } // namespace elf diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h index c920cdf153a..e727a839b40 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h @@ -10,6 +10,7 @@ #ifndef LLD_READER_WRITER_ELF_HEXAGON_HEXAGON_LINKING_CONTEXT_H #define LLD_READER_WRITER_ELF_HEXAGON_HEXAGON_LINKING_CONTEXT_H +#include "OutputELFWriter.h" #include "lld/ReaderWriter/ELFLinkingContext.h" #include "llvm/Object/ELF.h" #include "llvm/Support/ELF.h" @@ -63,6 +64,13 @@ public: } }; +template <class ELFT> void setHexagonELFHeader(ELFHeader<ELFT> &elfHeader) { + elfHeader.e_ident(llvm::ELF::EI_VERSION, 1); + elfHeader.e_ident(llvm::ELF::EI_OSABI, 0); + elfHeader.e_version(1); + elfHeader.e_flags(0x3); +} + } // elf } // lld diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h index 454d60d26f9..9d07a891e91 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h @@ -135,6 +135,23 @@ private: std::unique_ptr<HexagonTargetLayout<HexagonELFType>> _hexagonTargetLayout; std::unique_ptr<HexagonTargetRelocationHandler> _hexagonRelocationHandler; }; + +template <class ELFT> +void finalizeHexagonRuntimeAtomValues(HexagonTargetLayout<ELFT> &layout) { + auto gotAtomIter = layout.findAbsoluteAtom("_GLOBAL_OFFSET_TABLE_"); + auto gotpltSection = layout.findOutputSection(".got.plt"); + if (gotpltSection) + (*gotAtomIter)->_virtualAddr = gotpltSection->virtualAddr(); + else + (*gotAtomIter)->_virtualAddr = 0; + auto dynamicAtomIter = layout.findAbsoluteAtom("_DYNAMIC"); + auto dynamicSection = layout.findOutputSection(".dynamic"); + if (dynamicSection) + (*dynamicAtomIter)->_virtualAddr = dynamicSection->virtualAddr(); + else + (*dynamicAtomIter)->_virtualAddr = 0; +} + } // end namespace elf } // end namespace lld |

