Index: lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h +++ lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h @@ -19,8 +19,7 @@ template class HexagonTargetLayout; template -class HexagonDynamicLibraryWriter : public DynamicLibraryWriter, - public HexagonELFWriter { +class HexagonDynamicLibraryWriter : public DynamicLibraryWriter { public: HexagonDynamicLibraryWriter(HexagonLinkingContext &ctx, HexagonTargetLayout &layout); @@ -33,7 +32,7 @@ virtual std::error_code setELFHeader() { DynamicLibraryWriter::setELFHeader(); - HexagonELFWriter::setELFHeader(*this->_elfHeader); + setHexagonELFHeader(*this->_elfHeader); return std::error_code(); } @@ -51,8 +50,7 @@ template HexagonDynamicLibraryWriter::HexagonDynamicLibraryWriter( HexagonLinkingContext &ctx, HexagonTargetLayout &layout) - : DynamicLibraryWriter(ctx, layout), - HexagonELFWriter(ctx, layout), _ctx(ctx), + : DynamicLibraryWriter(ctx, layout), _ctx(ctx), _hexagonTargetLayout(layout), _hexagonRuntimeFile(new HexagonRuntimeFile(ctx)) {} @@ -70,7 +68,8 @@ void HexagonDynamicLibraryWriter::finalizeDefaultAtomValues() { // Finalize the atom values that are part of the parent. DynamicLibraryWriter::finalizeDefaultAtomValues(); - HexagonELFWriter::finalizeHexagonRuntimeAtomValues(); + if (_ctx.isDynamic()) + finalizeHexagonRuntimeAtomValues(_hexagonTargetLayout); } } // namespace elf Index: lib/ReaderWriter/ELF/Hexagon/HexagonELFWriters.h =================================================================== --- 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 HexagonTargetLayout; - -template class HexagonELFWriter { -public: - HexagonELFWriter(HexagonLinkingContext &ctx, - HexagonTargetLayout &targetLayout) - : _ctx(ctx), _hexagonTargetLayout(targetLayout) {} - -protected: - bool setELFHeader(ELFHeader &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 &_hexagonTargetLayout; -}; - -} // elf -} // lld -#endif // HEXAGON_ELF_WRITERS_H Index: lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h +++ 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 @@ template class HexagonTargetLayout; template -class HexagonExecutableWriter : public ExecutableWriter, - public HexagonELFWriter { +class HexagonExecutableWriter : public ExecutableWriter { public: HexagonExecutableWriter(HexagonLinkingContext &ctx, HexagonTargetLayout &layout); @@ -34,7 +32,7 @@ virtual std::error_code setELFHeader() { ExecutableWriter::setELFHeader(); - HexagonELFWriter::setELFHeader(*this->_elfHeader); + setHexagonELFHeader(*this->_elfHeader); return std::error_code(); } @@ -55,8 +53,8 @@ template HexagonExecutableWriter::HexagonExecutableWriter( HexagonLinkingContext &ctx, HexagonTargetLayout &layout) - : ExecutableWriter(ctx, layout), HexagonELFWriter(ctx, layout), - _ctx(ctx), _hexagonTargetLayout(layout), + : ExecutableWriter(ctx, layout), _ctx(ctx), + _hexagonTargetLayout(layout), _hexagonRuntimeFile(new HexagonRuntimeFile(ctx)) {} template @@ -76,7 +74,8 @@ auto sdabaseAtomIter = _hexagonTargetLayout.findAbsoluteAtom("_SDA_BASE_"); (*sdabaseAtomIter)->_virtualAddr = _hexagonTargetLayout.getSDataSection()->virtualAddr(); - HexagonELFWriter::finalizeHexagonRuntimeAtomValues(); + if (_ctx.isDynamic()) + finalizeHexagonRuntimeAtomValues(_hexagonTargetLayout); } } // namespace elf Index: lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h +++ 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 @@ } }; +template void setHexagonELFHeader(ELFHeader &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 Index: lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h +++ lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h @@ -135,6 +135,23 @@ std::unique_ptr> _hexagonTargetLayout; std::unique_ptr _hexagonRelocationHandler; }; + +template +void finalizeHexagonRuntimeAtomValues(HexagonTargetLayout &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