diff options
-rw-r--r-- | lld/lib/ReaderWriter/ELF/CMakeLists.txt | 3 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Hexagon/CMakeLists.txt | 5 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp | 110 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h | 48 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h | 12 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/PPC/CMakeLists.txt | 5 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.cpp | 66 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.h | 48 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/PPC/PPCTargetInfo.h | 10 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86/CMakeLists.txt | 5 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.cpp | 67 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h | 48 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86/X86TargetInfo.h | 5 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h | 2 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.h | 1 |
15 files changed, 416 insertions, 19 deletions
diff --git a/lld/lib/ReaderWriter/ELF/CMakeLists.txt b/lld/lib/ReaderWriter/ELF/CMakeLists.txt index 05deea13dcd..3b758562186 100644 --- a/lld/lib/ReaderWriter/ELF/CMakeLists.txt +++ b/lld/lib/ReaderWriter/ELF/CMakeLists.txt @@ -10,8 +10,11 @@ add_lld_library(lldELF ) target_link_libraries(lldELF + lldHexagonELFTarget + lldPPCELFTarget lldReaderWriter lldX86_64ELFTarget + lldX86ELFTarget ) include_directories(.) diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/CMakeLists.txt b/lld/lib/ReaderWriter/ELF/Hexagon/CMakeLists.txt index f86736f9977..40aafac376b 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/CMakeLists.txt +++ b/lld/lib/ReaderWriter/ELF/Hexagon/CMakeLists.txt @@ -1,5 +1,8 @@ add_lld_library(lldHexagonELFTarget + HexagonTargetHandler.cpp HexagonTargetInfo.cpp ) -target_link_libraries(lldHexagonELFTarget) +target_link_libraries(lldHexagonELFTarget + lldCore + ) diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp new file mode 100644 index 00000000000..90e2e0515c9 --- /dev/null +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp @@ -0,0 +1,110 @@ +//===- lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp --------------===// +// +// The LLVM Linker +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "HexagonTargetHandler.h" +#include "HexagonTargetInfo.h" + +using namespace lld; +using namespace elf; + +using namespace llvm::ELF; + +namespace { +/// \brief Word32_B22: 0x01ff3ffe : (S + A - P) >> 2 : Verify +int relocB22PCREL(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { + int32_t result = (uint32_t)(((S + A) - P)>>2); + if ((result < 0x200000) && (result > -0x200000)) { + result = ((result<<1) & 0x3ffe) | ((result<<3) & 0x01ff0000); + *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result | + (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t *>(location); + return HexagonKindHandler::NoError; + } + return HexagonKindHandler::Overflow; +} + +/// \brief Word32_B15: 0x00df20fe : (S + A - P) >> 2 : Verify +int relocB15PCREL(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { + int32_t result = (uint32_t)(((S + A) - P)>>2); + if ((result < 0x8000) && (result > -0x8000)) { + result = ((result<<1) & 0x20fe) | ((result<<7) & 0x00df0000); + *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result | + (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t *>(location); + return HexagonKindHandler::NoError; + } + return HexagonKindHandler::Overflow; +} + +/// \brief Word32_LO: 0x00c03fff : (S + A) : Truncate +int relocLO16(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { + uint32_t result = (uint32_t)(S + A); + result = ((result & 0x3fff) | ((result << 8) & 0x00c00000)); + *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result | + (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t *>(location); + return HexagonKindHandler::NoError; +} + +/// \brief Word32_LO: 0x00c03fff : (S + A) >> 16 : Truncate +int relocHI16(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { + uint32_t result = (uint32_t)((S + A)>>16); + result = ((result & 0x3fff) | ((result << 8) & 0x00c00000)); + *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result | + (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t *>(location); + return HexagonKindHandler::NoError; +} + +/// \brief Word32: 0xffffffff : (S + A) : Truncate +int reloc32(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { + uint32_t result = (uint32_t)(S + A); + *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result | + (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t *>(location); + return HexagonKindHandler::NoError; +} +} // end anon namespace + +ErrorOr<void> HexagonTargetRelocationHandler::applyRelocation( + ELFWriter &writer, llvm::FileOutputBuffer &buf, const AtomLayout &atom, + const Reference &ref) const { + uint8_t *atomContent = buf.getBufferStart() + atom._fileOffset; + uint8_t *location = atomContent + ref.offsetInAtom(); + uint64_t targetVAddress = writer.addressOfAtom(ref.target()); + uint64_t relocVAddress = atom._virtualAddr + ref.offsetInAtom(); + + switch (ref.kind()) { + case R_HEX_B22_PCREL: + relocB22PCREL(location, relocVAddress, targetVAddress, ref.addend()); + break; + case R_HEX_B15_PCREL: + relocB15PCREL(location, relocVAddress, targetVAddress, ref.addend()); + break; + case R_HEX_LO16: + relocLO16(location, relocVAddress, targetVAddress, ref.addend()); + break; + case R_HEX_HI16: + relocHI16(location, relocVAddress, targetVAddress, ref.addend()); + break; + case R_HEX_32: + reloc32(location, relocVAddress, targetVAddress, ref.addend()); + break; + default: { + std::string str; + llvm::raw_string_ostream s(str); + auto name = _targetInfo.stringFromRelocKind(ref.kind()); + s << "Unhandled relocation: " + << (name ? *name : "<unknown>" ) << " (" << ref.kind() << ")"; + s.flush(); + llvm_unreachable(str.c_str()); + } + } + + return error_code::success(); +} + +HexagonTargetHandler::HexagonTargetHandler(HexagonTargetInfo &targetInfo) + : DefaultTargetHandler(targetInfo), _relocationHandler(targetInfo) { +} diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h new file mode 100644 index 00000000000..cb247737ff7 --- /dev/null +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h @@ -0,0 +1,48 @@ +//===- lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.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_HEXAGON_TARGET_HANDLER_H +#define LLD_READER_WRITER_ELF_HEXAGON_TARGET_HANDLER_H + +#include "DefaultTargetHandler.h" + +namespace lld { +namespace elf { +typedef llvm::object::ELFType<llvm::support::little, 4, false> HexagonELFType; +class HexagonTargetInfo; + +class HexagonTargetRelocationHandler LLVM_FINAL + : public TargetRelocationHandler<HexagonELFType> { +public: + HexagonTargetRelocationHandler(const HexagonTargetInfo &ti) : _targetInfo(ti) {} + + virtual ErrorOr<void> applyRelocation(ELFWriter &, llvm::FileOutputBuffer &, + const AtomLayout &, + const Reference &)const; + +private: + const HexagonTargetInfo &_targetInfo; +}; + +class HexagonTargetHandler LLVM_FINAL + : public DefaultTargetHandler<HexagonELFType> { +public: + HexagonTargetHandler(HexagonTargetInfo &targetInfo); + + virtual const HexagonTargetRelocationHandler &getRelocationHandler() const { + return _relocationHandler; + } + +private: + HexagonTargetRelocationHandler _relocationHandler; +}; +} // end namespace elf +} // end namespace lld + +#endif diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h index b5dfeb8c5e6..8375fef9193 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h @@ -1,4 +1,4 @@ -//===- lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h ------------------===// +//===- lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h -------------------===// // // The LLVM Linker // @@ -10,21 +10,21 @@ #ifndef LLD_READER_WRITER_ELF_HEXAGON_TARGETINFO_H #define LLD_READER_WRITER_ELF_HEXAGON_TARGETINFO_H -#include "lld/ReaderWriter/ELFTargetInfo.h" +#include "HexagonTargetHandler.h" + #include "lld/Core/LinkerOptions.h" +#include "lld/ReaderWriter/ELFTargetInfo.h" + #include "llvm/Object/ELF.h" #include "llvm/Support/ELF.h" -#include "DefaultTargetHandler.h" - namespace lld { namespace elf { class HexagonTargetInfo LLVM_FINAL : public ELFTargetInfo { public: HexagonTargetInfo(const LinkerOptions &lo) : ELFTargetInfo(lo) { _targetHandler = std::unique_ptr<TargetHandlerBase>( - new DefaultTargetHandler<llvm::object::ELFType<llvm::support::little, - 4, false> >(*this)); + new HexagonTargetHandler(*this)); } virtual uint64_t getPageSize() const { return 0x1000; } diff --git a/lld/lib/ReaderWriter/ELF/PPC/CMakeLists.txt b/lld/lib/ReaderWriter/ELF/PPC/CMakeLists.txt index 8a825f5559b..6383555233e 100644 --- a/lld/lib/ReaderWriter/ELF/PPC/CMakeLists.txt +++ b/lld/lib/ReaderWriter/ELF/PPC/CMakeLists.txt @@ -1,5 +1,8 @@ add_lld_library(lldPPCELFTarget + PPCTargetHandler.cpp PPCTargetInfo.cpp ) -target_link_libraries(lldPPCELFTarget) +target_link_libraries(lldPPCELFTarget + lldCore + ) diff --git a/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.cpp b/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.cpp new file mode 100644 index 00000000000..9a5d102050c --- /dev/null +++ b/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.cpp @@ -0,0 +1,66 @@ +//===- lib/ReaderWriter/ELF/PPC/PPCTargetHandler.cpp ----------------------===// +// +// The LLVM Linker +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "PPCTargetHandler.h" +#include "PPCTargetInfo.h" + +using namespace lld; +using namespace elf; + +using namespace llvm::ELF; + +/// \brief The following relocation routines are derived from the +/// SYSTEM V APPLICATION BINARY INTERFACE: PowerPC Processor Supplement +/// Symbols used: +/// A: Added used to compute the value, r_addend +/// P: Place address of the field being relocated, r_offset +/// S: Value of the symbol whose index resides in the relocation entry. +namespace { +/// \brief low24 (S + A - P) >> 2 : Verify +int relocB24PCREL(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { + int32_t result = (uint32_t)(((S + A) - P)); + if ((result < 0x1000000) && (result > -0x1000000)) { + result &= ~-(0x1000000); + *reinterpret_cast<llvm::support::ubig32_t *>(location) = result | + (uint32_t)*reinterpret_cast<llvm::support::ubig32_t *>(location); + return PPCKindHandler::NoError; + } + return PPCKindHandler::Overflow; +} +} // end anon namespace + +ErrorOr<void> PPCTargetRelocationHandler::applyRelocation( + ELFWriter &writer, llvm::FileOutputBuffer &buf, const AtomLayout &atom, + const Reference &ref) const { + uint8_t *atomContent = buf.getBufferStart() + atom._fileOffset; + uint8_t *location = atomContent + ref.offsetInAtom(); + uint64_t targetVAddress = writer.addressOfAtom(ref.target()); + uint64_t relocVAddress = atom._virtualAddr + ref.offsetInAtom(); + + switch (ref.kind()) { + case R_PPC_REL24: + relocB24PCREL(location, relocVAddress, targetVAddress, ref.addend()); + break; + default: { + std::string str; + llvm::raw_string_ostream s(str); + auto name = _targetInfo.stringFromRelocKind(ref.kind()); + s << "Unhandled relocation: " + << (name ? *name : "<unknown>" ) << " (" << ref.kind() << ")"; + s.flush(); + llvm_unreachable(str.c_str()); + } + } + + return error_code::success(); +} + +PPCTargetHandler::PPCTargetHandler(PPCTargetInfo &targetInfo) + : DefaultTargetHandler(targetInfo), _relocationHandler(targetInfo) { +} diff --git a/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.h b/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.h new file mode 100644 index 00000000000..3a01fbb1541 --- /dev/null +++ b/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.h @@ -0,0 +1,48 @@ +//===- lib/ReaderWriter/ELF/PPC/PPCTargetHandler.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_PPC_TARGET_HANDLER_H +#define LLD_READER_WRITER_ELF_PPC_TARGET_HANDLER_H + +#include "DefaultTargetHandler.h" + +namespace lld { +namespace elf { +typedef llvm::object::ELFType<llvm::support::big, 4, false> PPCELFType; +class PPCTargetInfo; + +class PPCTargetRelocationHandler LLVM_FINAL + : public TargetRelocationHandler<PPCELFType> { +public: + PPCTargetRelocationHandler(const PPCTargetInfo &ti) : _targetInfo(ti) {} + + virtual ErrorOr<void> applyRelocation(ELFWriter &, llvm::FileOutputBuffer &, + const AtomLayout &, + const Reference &)const; + +private: + const PPCTargetInfo &_targetInfo; +}; + +class PPCTargetHandler LLVM_FINAL + : public DefaultTargetHandler<PPCELFType> { +public: + PPCTargetHandler(PPCTargetInfo &targetInfo); + + virtual const PPCTargetRelocationHandler &getRelocationHandler() const { + return _relocationHandler; + } + +private: + PPCTargetRelocationHandler _relocationHandler; +}; +} // end namespace elf +} // end namespace lld + +#endif diff --git a/lld/lib/ReaderWriter/ELF/PPC/PPCTargetInfo.h b/lld/lib/ReaderWriter/ELF/PPC/PPCTargetInfo.h index 23f648737c0..97ba655d4ab 100644 --- a/lld/lib/ReaderWriter/ELF/PPC/PPCTargetInfo.h +++ b/lld/lib/ReaderWriter/ELF/PPC/PPCTargetInfo.h @@ -10,21 +10,21 @@ #ifndef LLD_READER_WRITER_ELF_PPC_TARGETINFO_H #define LLD_READER_WRITER_ELF_PPC_TARGETINFO_H -#include "lld/ReaderWriter/ELFTargetInfo.h" +#include "PPCTargetHandler.h" + #include "lld/Core/LinkerOptions.h" +#include "lld/ReaderWriter/ELFTargetInfo.h" + #include "llvm/Object/ELF.h" #include "llvm/Support/ELF.h" -#include "DefaultTargetHandler.h" - namespace lld { namespace elf { class PPCTargetInfo LLVM_FINAL : public ELFTargetInfo { public: PPCTargetInfo(const LinkerOptions &lo) : ELFTargetInfo(lo) { _targetHandler = std::unique_ptr<TargetHandlerBase>( - new DefaultTargetHandler< - llvm::object::ELFType<llvm::support::big, 4, false> >(*this)); + new PPCTargetHandler(*this)); } virtual bool isLittleEndian() const { return false; } diff --git a/lld/lib/ReaderWriter/ELF/X86/CMakeLists.txt b/lld/lib/ReaderWriter/ELF/X86/CMakeLists.txt index c996757f523..7c11f7f0cac 100644 --- a/lld/lib/ReaderWriter/ELF/X86/CMakeLists.txt +++ b/lld/lib/ReaderWriter/ELF/X86/CMakeLists.txt @@ -1,5 +1,8 @@ add_lld_library(lldX86ELFTarget X86TargetInfo.cpp + X86TargetHandler.cpp ) -target_link_libraries(lldX86ELFTarget) +target_link_libraries(lldX86ELFTarget + lldCore + ) diff --git a/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.cpp b/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.cpp new file mode 100644 index 00000000000..df9109bacbf --- /dev/null +++ b/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.cpp @@ -0,0 +1,67 @@ +//===- lib/ReaderWriter/ELF/X86/X86TargetHandler.cpp ----------------------===// +// +// The LLVM Linker +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "X86TargetHandler.h" +#include "X86TargetInfo.h" + +using namespace lld; +using namespace elf; + +using namespace llvm::ELF; + +namespace { +/// \brief R_386_32 - word32: S + A +int reloc32(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { + int32_t result = (uint32_t)(S + A); + *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result | + (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t *>(location); + return X86KindHandler::NoError; +} + +/// \brief R_386_PC32 - word32: S + A - P +int relocPC32(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { + uint32_t result = (uint32_t)((S + A) - P); + *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result + + (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t *>(location); + return X86KindHandler::NoError; +} +} // end anon namespace + +ErrorOr<void> X86TargetRelocationHandler::applyRelocation( + ELFWriter &writer, llvm::FileOutputBuffer &buf, const AtomLayout &atom, + const Reference &ref) const { + uint8_t *atomContent = buf.getBufferStart() + atom._fileOffset; + uint8_t *location = atomContent + ref.offsetInAtom(); + uint64_t targetVAddress = writer.addressOfAtom(ref.target()); + uint64_t relocVAddress = atom._virtualAddr + ref.offsetInAtom(); + + switch (ref.kind()) { + case R_386_32: + reloc32(location, relocVAddress, targetVAddress, ref.addend()); + break; + case R_386_PC32: + relocPC32(location, relocVAddress, targetVAddress, ref.addend()); + break; + default: { + std::string str; + llvm::raw_string_ostream s(str); + auto name = _targetInfo.stringFromRelocKind(ref.kind()); + s << "Unhandled relocation: " + << (name ? *name : "<unknown>" ) << " (" << ref.kind() << ")"; + s.flush(); + llvm_unreachable(str.c_str()); + } + } + + return error_code::success(); +} + +X86TargetHandler::X86TargetHandler(X86TargetInfo &targetInfo) + : DefaultTargetHandler(targetInfo), _relocationHandler(targetInfo) { +} diff --git a/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h b/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h new file mode 100644 index 00000000000..3cdcecb8f25 --- /dev/null +++ b/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h @@ -0,0 +1,48 @@ +//===- lib/ReaderWriter/ELF/X86/X86TargetHandler.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_TARGET_HANDLER_H +#define LLD_READER_WRITER_ELF_X86_TARGET_HANDLER_H + +#include "DefaultTargetHandler.h" + +namespace lld { +namespace elf { +typedef llvm::object::ELFType<llvm::support::little, 4, false> X86ELFType; +class X86TargetInfo; + +class X86TargetRelocationHandler LLVM_FINAL + : public TargetRelocationHandler<X86ELFType> { +public: + X86TargetRelocationHandler(const X86TargetInfo &ti) : _targetInfo(ti) {} + + virtual ErrorOr<void> applyRelocation(ELFWriter &, llvm::FileOutputBuffer &, + const AtomLayout &, + const Reference &)const; + +private: + const X86TargetInfo &_targetInfo; +}; + +class X86TargetHandler LLVM_FINAL + : public DefaultTargetHandler<X86ELFType> { +public: + X86TargetHandler(X86TargetInfo &targetInfo); + + virtual const X86TargetRelocationHandler &getRelocationHandler() const { + return _relocationHandler; + } + +private: + X86TargetRelocationHandler _relocationHandler; +}; +} // end namespace elf +} // end namespace lld + +#endif diff --git a/lld/lib/ReaderWriter/ELF/X86/X86TargetInfo.h b/lld/lib/ReaderWriter/ELF/X86/X86TargetInfo.h index 7036daaecb8..c66a42f78d6 100644 --- a/lld/lib/ReaderWriter/ELF/X86/X86TargetInfo.h +++ b/lld/lib/ReaderWriter/ELF/X86/X86TargetInfo.h @@ -10,7 +10,7 @@ #ifndef LLD_READER_WRITER_ELF_X86_TARGETINFO_H #define LLD_READER_WRITER_ELF_X86_TARGETINFO_H -#include "DefaultTargetHandler.h" +#include "X86TargetHandler.h" #include "lld/Core/LinkerOptions.h" #include "lld/ReaderWriter/ELFTargetInfo.h" @@ -24,8 +24,7 @@ class X86TargetInfo LLVM_FINAL : public ELFTargetInfo { public: X86TargetInfo(const LinkerOptions &lo) : ELFTargetInfo(lo) { _targetHandler = std::unique_ptr<TargetHandlerBase>( - new DefaultTargetHandler<llvm::object::ELFType<llvm::support::little, - 4, false> >(*this)); + new X86TargetHandler(*this)); } virtual uint64_t getPageSize() const { return 0x1000; } diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h index 91294e9e9c3..12446243919 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h @@ -14,7 +14,7 @@ namespace lld { namespace elf { -typedef llvm::object::ELFType<llvm::support::little, 8, false> X86_64ELFType; +typedef llvm::object::ELFType<llvm::support::little, 8, true> X86_64ELFType; class X86_64TargetInfo; class X86_64TargetRelocationHandler LLVM_FINAL diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.h index d8674245010..146bd2538fe 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.h @@ -20,7 +20,6 @@ namespace lld { namespace elf { -typedef llvm::object::ELFType<llvm::support::little, 8, false> X86_64ELFType; class X86_64TargetInfo LLVM_FINAL : public ELFTargetInfo { public: |