diff options
-rw-r--r-- | lld/lib/ReaderWriter/ELF/CMakeLists.txt | 5 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp | 14 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/HexagonReference.cpp | 170 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.cpp | 4 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/PPCReference.cpp | 115 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/ReferenceKinds.cpp | 42 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/ReferenceKinds.h | 181 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Writer.cpp | 5 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Writer.h | 5 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.cpp | 4 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86Reference.cpp | 111 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/X86_64Reference.cpp | 125 |
12 files changed, 11 insertions, 770 deletions
diff --git a/lld/lib/ReaderWriter/ELF/CMakeLists.txt b/lld/lib/ReaderWriter/ELF/CMakeLists.txt index 3b758562186..52ab5af5f7f 100644 --- a/lld/lib/ReaderWriter/ELF/CMakeLists.txt +++ b/lld/lib/ReaderWriter/ELF/CMakeLists.txt @@ -1,12 +1,7 @@ add_lld_library(lldELF ELFTargetInfo.cpp - HexagonReference.cpp - PPCReference.cpp Reader.cpp - ReferenceKinds.cpp Writer.cpp - X86Reference.cpp - X86_64Reference.cpp ) target_link_libraries(lldELF diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp index 90e2e0515c9..c457dde8570 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp @@ -23,9 +23,9 @@ int relocB22PCREL(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { 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 0; } - return HexagonKindHandler::Overflow; + return 1; } /// \brief Word32_B15: 0x00df20fe : (S + A - P) >> 2 : Verify @@ -35,9 +35,9 @@ int relocB15PCREL(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { 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 0; } - return HexagonKindHandler::Overflow; + return 1; } /// \brief Word32_LO: 0x00c03fff : (S + A) : Truncate @@ -46,7 +46,7 @@ int relocLO16(uint8_t *location, uint64_t P, uint64_t S, uint64_t 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; + return 0; } /// \brief Word32_LO: 0x00c03fff : (S + A) >> 16 : Truncate @@ -55,7 +55,7 @@ int relocHI16(uint8_t *location, uint64_t P, uint64_t S, uint64_t 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; + return 0; } /// \brief Word32: 0xffffffff : (S + A) : Truncate @@ -63,7 +63,7 @@ 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; + return 0; } } // end anon namespace diff --git a/lld/lib/ReaderWriter/ELF/HexagonReference.cpp b/lld/lib/ReaderWriter/ELF/HexagonReference.cpp deleted file mode 100644 index 286af00257d..00000000000 --- a/lld/lib/ReaderWriter/ELF/HexagonReference.cpp +++ /dev/null @@ -1,170 +0,0 @@ -//===- lib/ReaderWriter/ELF/HexagonReference.cpp ----------------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - - -#include "ReferenceKinds.h" - -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/StringSwitch.h" -#include "llvm/Support/Endian.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/ELF.h" - -namespace lld { -namespace elf { - -//===----------------------------------------------------------------------===// -// HexagonKindHandler -// TODO: more to do here -//===----------------------------------------------------------------------===// - -HexagonKindHandler::~HexagonKindHandler() { -} - -/// \brief The following relocation routines are derived from the -/// Hexagon ABI specification, Section 11.6: Relocation -/// 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 hexagon { -int relocNONE(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { - return HexagonKindHandler::NoError; -} - -/// \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; -} -} // namespace hexagon - -HexagonKindHandler::HexagonKindHandler(){ - _fixupHandler[llvm::ELF::R_HEX_B22_PCREL] = hexagon::relocB22PCREL; - _fixupHandler[llvm::ELF::R_HEX_B15_PCREL] = hexagon::relocB15PCREL; - _fixupHandler[llvm::ELF::R_HEX_LO16] = hexagon::relocLO16; - _fixupHandler[llvm::ELF::R_HEX_HI16] = hexagon::relocHI16; - _fixupHandler[llvm::ELF::R_HEX_32] = hexagon::reloc32; -} - -Reference::Kind HexagonKindHandler::stringToKind(StringRef str) { - return llvm::StringSwitch<Reference::Kind>(str) - .Case("none", none) - .Case("R_HEX_B22_PCREL", llvm::ELF::R_HEX_B22_PCREL) - .Case("R_HEX_B15_PCREL", llvm::ELF::R_HEX_B15_PCREL) - .Case("R_HEX_LO16", llvm::ELF::R_HEX_LO16) - .Case("R_HEX_HI16", llvm::ELF::R_HEX_HI16) - .Case("R_HEX_32", llvm::ELF::R_HEX_32) - .Default(invalid); -} - -StringRef HexagonKindHandler::kindToString(Reference::Kind kind) { - switch (static_cast<int32_t>(kind)) { - case llvm::ELF::R_HEX_B22_PCREL: - return "R_HEX_B22_PCREL"; - case llvm::ELF::R_HEX_B15_PCREL: - return "R_HEX_B15_PCREL"; - case llvm::ELF::R_HEX_LO16: - return "R_HEX_LO16"; - case llvm::ELF::R_HEX_HI16: - return "R_HEX_HI16"; - case llvm::ELF::R_HEX_32: - return "R_HEX_32"; - default: - return "none"; - } -} - -bool HexagonKindHandler::isCallSite(Kind kind) { - llvm_unreachable("Unimplemented: HexagonKindHandler::isCallSite"); - return false; -} - -bool HexagonKindHandler::isPointer(Kind kind) { - llvm_unreachable("Unimplemented: HexagonKindHandler::isPointer"); - return false; -} - -bool HexagonKindHandler::isLazyImmediate(Kind kind) { - llvm_unreachable("Unimplemented: HexagonKindHandler::isLazyImmediate"); - return false; -} - -bool HexagonKindHandler::isLazyTarget(Kind kind) { - llvm_unreachable("Unimplemented: HexagonKindHandler::isLazyTarget"); - return false; -} - -void HexagonKindHandler::applyFixup(int32_t reloc, uint64_t addend, - uint8_t *location, uint64_t fixupAddress, - uint64_t targetAddress) { - int error; - if (_fixupHandler[reloc]) - { - error = (_fixupHandler[reloc])(location, - fixupAddress, targetAddress, addend); - - switch ((RelocationError)error) { - case NoError: - return; - case Overflow: - llvm::report_fatal_error("applyFixup relocation overflow"); - return; - } - } -} - - -} // namespace elf -} // namespace lld diff --git a/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.cpp b/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.cpp index 9a5d102050c..2bf02a654aa 100644 --- a/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.cpp +++ b/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.cpp @@ -29,9 +29,9 @@ int relocB24PCREL(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { result &= ~-(0x1000000); *reinterpret_cast<llvm::support::ubig32_t *>(location) = result | (uint32_t)*reinterpret_cast<llvm::support::ubig32_t *>(location); - return PPCKindHandler::NoError; + return 0; } - return PPCKindHandler::Overflow; + return 1; } } // end anon namespace diff --git a/lld/lib/ReaderWriter/ELF/PPCReference.cpp b/lld/lib/ReaderWriter/ELF/PPCReference.cpp deleted file mode 100644 index 9cfe2844de2..00000000000 --- a/lld/lib/ReaderWriter/ELF/PPCReference.cpp +++ /dev/null @@ -1,115 +0,0 @@ -//===- lib/ReaderWriter/ELF/PPCReference.cpp ----------------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - - -#include "ReferenceKinds.h" - -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/StringSwitch.h" -#include "llvm/Support/Endian.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/ELF.h" - -namespace lld { -namespace elf { - -//===----------------------------------------------------------------------===// -// PPCKindHandler -// TODO: more to do here -//===----------------------------------------------------------------------===// - -PPCKindHandler::~PPCKindHandler() { -} - -/// \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 ppc { -int relocNONE(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { - return PPCKindHandler::NoError; -} - -/// \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; -} -} // namespace ppc - -PPCKindHandler::PPCKindHandler(llvm::support::endianness endian){ - _fixupHandler[llvm::ELF::R_PPC_REL24] = ppc::relocB24PCREL; -} - -Reference::Kind PPCKindHandler::stringToKind(StringRef str) { - return llvm::StringSwitch<Reference::Kind>(str) - .Case("none", none) - .Case("R_PPC_REL24", llvm::ELF::R_PPC_REL24) - .Default(invalid); -} - -StringRef PPCKindHandler::kindToString(Reference::Kind kind) { - switch ((int32_t)kind) { - case llvm::ELF::R_PPC_REL24: - return "R_PPC_REL24"; - default: - return "none"; - } -} - -bool PPCKindHandler::isCallSite(Kind kind) { - llvm_unreachable("Unimplemented: PPCKindHandler::isCallSite"); - return false; -} - -bool PPCKindHandler::isPointer(Kind kind) { - llvm_unreachable("Unimplemented: PPCKindHandler::isPointer"); - return false; -} - -bool PPCKindHandler::isLazyImmediate(Kind kind) { - llvm_unreachable("Unimplemented: PPCKindHandler::isLazyImmediate"); - return false; -} - -bool PPCKindHandler::isLazyTarget(Kind kind) { - llvm_unreachable("Unimplemented: PPCKindHandler::isLazyTarget"); - return false; -} - -void PPCKindHandler::applyFixup(int32_t reloc, uint64_t addend, - uint8_t *location, uint64_t fixupAddress, - uint64_t targetAddress) { - int error; - if (_fixupHandler[reloc]) - { - error = (_fixupHandler[reloc])(location, - fixupAddress, targetAddress, addend); - - switch ((RelocationError)error) { - case NoError: - return; - case Overflow: - llvm::report_fatal_error("applyFixup relocation overflow"); - return; - } - } -} - -} // namespace elf -} // namespace lld diff --git a/lld/lib/ReaderWriter/ELF/ReferenceKinds.cpp b/lld/lib/ReaderWriter/ELF/ReferenceKinds.cpp deleted file mode 100644 index edf029c92f8..00000000000 --- a/lld/lib/ReaderWriter/ELF/ReferenceKinds.cpp +++ /dev/null @@ -1,42 +0,0 @@ -//===- lib/ReaderWriter/ELF/ReferenceKinds.cpp ----------------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "ReferenceKinds.h" - -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/StringSwitch.h" -#include "llvm/ADT/Triple.h" -#include "llvm/Support/ELF.h" -#include "llvm/Support/ErrorHandling.h" - -namespace lld { -namespace elf { -KindHandler::KindHandler() {} - -KindHandler::~KindHandler() {} - -std::unique_ptr<KindHandler> -KindHandler::makeHandler(llvm::Triple::ArchType arch, bool isLittleEndian) { - switch(arch) { - case llvm::Triple::hexagon: - return std::unique_ptr<KindHandler>(new HexagonKindHandler()); - case llvm::Triple::x86: - return std::unique_ptr<KindHandler>(new X86KindHandler()); - case llvm::Triple::x86_64: - return std::unique_ptr<KindHandler>(new X86_64KindHandler()); - case llvm::Triple::ppc: - return std::unique_ptr<KindHandler>( - new PPCKindHandler(isLittleEndian ? llvm::support::little - : llvm::support::big)); - default: - llvm_unreachable("arch not supported"); - } -} -} // namespace elf -} // namespace lld diff --git a/lld/lib/ReaderWriter/ELF/ReferenceKinds.h b/lld/lib/ReaderWriter/ELF/ReferenceKinds.h deleted file mode 100644 index 18ff5bad2e4..00000000000 --- a/lld/lib/ReaderWriter/ELF/ReferenceKinds.h +++ /dev/null @@ -1,181 +0,0 @@ -//===- lib/ReaderWriter/ELF/ReferenceKinds.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_REFERENCE_KINDS_H -#define LLD_READER_WRITER_ELF_REFERENCE_KINDS_H - -#include "lld/Core/LLVM.h" -#include "lld/Core/Reference.h" -#include "lld/ReaderWriter/Writer.h" - -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/Triple.h" -#include "llvm/Support/ELF.h" -#include "llvm/Support/Endian.h" - -#include <functional> -#include <map> -#include <memory> - -namespace lld { -namespace elf { -/// \brief the abstract interface to Reference::Kind values for ELF files. -/// -/// Particular Kind values (e.g. 3) has a different meaning for each -/// architecture. -/// -/// TODO: Needs to be updated for ELF, stubs for now. -class KindHandler { -public: - typedef Reference::Kind Kind; - - static std::unique_ptr<KindHandler> makeHandler(llvm::Triple::ArchType arch, - bool isLittleEndian); - virtual ~KindHandler(); - virtual Kind stringToKind(StringRef str) = 0; - virtual StringRef kindToString(Kind) = 0; - virtual bool isCallSite(Kind) = 0; - virtual bool isPointer(Kind) = 0; - virtual bool isLazyImmediate(Kind) = 0; - virtual bool isLazyTarget(Kind) = 0; - virtual void applyFixup(int32_t reloc, uint64_t addend, - uint8_t *location, - uint64_t fixupAddress, - uint64_t targetAddress) = 0; - -protected: - KindHandler(); -}; - -class HexagonKindHandler : public KindHandler { -public: - // Note: Reference::Kinds are a another representation of relocation types, - // using negative values to represent architecture independent reference type. - // The positive values are the same ones defined in ELF.h and that is what we - // are using. - enum Kinds { - none = llvm::ELF::R_HEX_NONE, - invalid = 255 // used to denote an error creating a Reference - }; - - enum RelocationError { - NoError, - Overflow - }; - - virtual ~HexagonKindHandler(); - HexagonKindHandler(); - virtual Kind stringToKind(StringRef str); - virtual StringRef kindToString(Kind); - virtual bool isCallSite(Kind); - virtual bool isPointer(Kind); - virtual bool isLazyImmediate(Kind); - virtual bool isLazyTarget(Kind); - virtual void applyFixup(int32_t reloc, uint64_t addend, - uint8_t *location, - uint64_t fixupAddress, uint64_t targetAddress); - -private: - // A map is used here and in the other handlers but if performace overhead - // becomes an issue this could be implemented as an array of function - // pointers. - llvm::DenseMap<int32_t, - std::function<int (uint8_t *location, uint64_t fixupAddress, - uint64_t targetAddress, uint64_t addend)> > _fixupHandler; -}; - -class X86KindHandler : public KindHandler { -public: - enum Kinds { - invalid, // used to denote an error creating a Reference - none, - }; - - enum RelocationError { - NoError, - }; - - virtual ~X86KindHandler(); - X86KindHandler(); - virtual Kind stringToKind(StringRef str); - virtual StringRef kindToString(Kind); - virtual bool isCallSite(Kind); - virtual bool isPointer(Kind); - virtual bool isLazyImmediate(Kind); - virtual bool isLazyTarget(Kind); - virtual void applyFixup(int32_t reloc, uint64_t addend, uint8_t *location, - uint64_t fixupAddress, uint64_t targetAddress); - -private: - llvm::DenseMap<int32_t, - std::function<int (uint8_t *location, uint64_t fixupAddress, - uint64_t targetAddress, uint64_t addend)> > _fixupHandler; -}; - -class X86_64KindHandler : public KindHandler { -public: - enum Kinds { - invalid, // used to denote an error creating a Reference - none, - }; - - enum RelocationError { - NoError, - }; - - virtual ~X86_64KindHandler(); - X86_64KindHandler(); - virtual Kind stringToKind(StringRef str); - virtual StringRef kindToString(Kind); - virtual bool isCallSite(Kind); - virtual bool isPointer(Kind); - virtual bool isLazyImmediate(Kind); - virtual bool isLazyTarget(Kind); - virtual void applyFixup(int32_t reloc, uint64_t addend, uint8_t *location, - uint64_t fixupAddress, uint64_t targetAddress); - -private: - llvm::DenseMap<int32_t, - std::function<int (uint8_t *location, uint64_t fixupAddress, - uint64_t targetAddress, uint64_t addend)> > _fixupHandler; -}; - -class PPCKindHandler : public KindHandler { -public: - enum Kinds { - none = llvm::ELF::R_PPC_NONE, - invalid = 255, // used to denote an error creating a Reference - }; - - enum RelocationError { - NoError, - Overflow - }; - - virtual ~PPCKindHandler(); - PPCKindHandler(llvm::support::endianness endian); - virtual Kind stringToKind(StringRef str); - virtual StringRef kindToString(Kind); - virtual bool isCallSite(Kind); - virtual bool isPointer(Kind); - virtual bool isLazyImmediate(Kind); - virtual bool isLazyTarget(Kind); - virtual void applyFixup(int32_t reloc, uint64_t addend, - uint8_t *location, - uint64_t fixupAddress, uint64_t targetAddress); - -private: - llvm::DenseMap<int32_t, - std::function<int (uint8_t *location, uint64_t fixupAddress, - uint64_t targetAddress, uint64_t addend)> > _fixupHandler; -}; -} // end namespace elf -} // end namespace lld - -#endif diff --git a/lld/lib/ReaderWriter/ELF/Writer.cpp b/lld/lib/ReaderWriter/ELF/Writer.cpp index 5e03baa67fe..e85f38da74b 100644 --- a/lld/lib/ReaderWriter/ELF/Writer.cpp +++ b/lld/lib/ReaderWriter/ELF/Writer.cpp @@ -50,15 +50,12 @@ private: return _atomToAddressMap[atom]; } - KindHandler *kindHandler() { return _referenceKindHandler.get(); } - void createDefaultSections(); const ELFTargetInfo &_targetInfo; TargetHandler<ELFT> &_targetHandler; typedef llvm::DenseMap<const Atom *, uint64_t> AtomToAddress; - std::unique_ptr<KindHandler> _referenceKindHandler; AtomToAddress _atomToAddressMap; llvm::BumpPtrAllocator _chunkAllocate; TargetLayout<ELFT> *_layout; @@ -77,8 +74,6 @@ private: template <class ELFT> ExecutableWriter<ELFT>::ExecutableWriter(const ELFTargetInfo &ti) : _targetInfo(ti), _targetHandler(ti.getTargetHandler<ELFT>()), - _referenceKindHandler(KindHandler::makeHandler(ti.getTriple().getArch(), - ti.isLittleEndian())), _runtimeFile(ti) { _layout = new TargetLayout<ELFT>(_targetInfo); } diff --git a/lld/lib/ReaderWriter/ELF/Writer.h b/lld/lib/ReaderWriter/ELF/Writer.h index b621856f5c1..7e67c31369d 100644 --- a/lld/lib/ReaderWriter/ELF/Writer.h +++ b/lld/lib/ReaderWriter/ELF/Writer.h @@ -10,8 +10,6 @@ #ifndef LLD_READER_WRITER_ELF_WRITER_H #define LLD_READER_WRITER_ELF_WRITER_H -#include "ReferenceKinds.h" - #include "lld/Core/File.h" #include "lld/Core/InputFiles.h" #include "lld/ReaderWriter/Writer.h" @@ -34,9 +32,6 @@ public: /// \brief Get the virtual address of \p atom after layout. virtual uint64_t addressOfAtom(const Atom *atom) = 0; - - /// \brief Return the processing function to apply Relocations - virtual KindHandler *kindHandler() = 0; }; } // end namespace elf } // end namespace lld diff --git a/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.cpp b/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.cpp index df9109bacbf..8e8040474b4 100644 --- a/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.cpp +++ b/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.cpp @@ -21,7 +21,7 @@ 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; + return 0; } /// \brief R_386_PC32 - word32: S + A - P @@ -29,7 +29,7 @@ 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; + return 0; } } // end anon namespace diff --git a/lld/lib/ReaderWriter/ELF/X86Reference.cpp b/lld/lib/ReaderWriter/ELF/X86Reference.cpp deleted file mode 100644 index b79f8dfef2d..00000000000 --- a/lld/lib/ReaderWriter/ELF/X86Reference.cpp +++ /dev/null @@ -1,111 +0,0 @@ -//===- lib/ReaderWriter/ELF/X86Reference.cpp ----------------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -/// -/// \file -/// The following relocation routines are derived from the -/// SYSTEM V APPLICATION BINARY INTERFACE: Intel386 Architecture Processor -/// Supplement (Fourth Edition) -/// Symbols used: -/// P: Place, address of the field being relocated, r_offset -/// S: Value of the symbol whose index resides in the relocation entry. -/// A: Addend used to compute the value, r_addend -/// -//===----------------------------------------------------------------------===// - -#include "ReferenceKinds.h" - -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/StringSwitch.h" -#include "llvm/Support/ELF.h" -#include "llvm/Support/Endian.h" -#include "llvm/Support/ErrorHandling.h" - -namespace lld { -namespace elf { -X86KindHandler::~X86KindHandler() { -} - -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 - -X86KindHandler::X86KindHandler(){ - _fixupHandler[llvm::ELF::R_386_32] = reloc32; - _fixupHandler[llvm::ELF::R_386_PC32] = relocPC32; -} - -Reference::Kind X86KindHandler::stringToKind(StringRef str) { - return llvm::StringSwitch<Reference::Kind>(str) - .Case("none", none) - .Case("R_386_32", llvm::ELF::R_386_32) - .Case("R_386_PC32", llvm::ELF::R_386_PC32) - .Default(invalid); -} - -StringRef X86KindHandler::kindToString(Reference::Kind kind) { - switch ((int32_t)kind) { - case llvm::ELF::R_386_32: - return "R_386_32"; - case llvm::ELF::R_386_PC32: - return "R_386_PC32"; - default: - return "none"; - } -} - -bool X86KindHandler::isCallSite(Kind kind) { - llvm_unreachable("Unimplemented: X86KindHandler::isCallSite"); - return false; -} - -bool X86KindHandler::isPointer(Kind kind) { - llvm_unreachable("Unimplemented: X86KindHandler::isPointer"); - return false; -} - -bool X86KindHandler::isLazyImmediate(Kind kind) { - llvm_unreachable("Unimplemented: X86KindHandler::isLazyImmediate"); - return false; -} - -bool X86KindHandler::isLazyTarget(Kind kind) { - llvm_unreachable("Unimplemented: X86KindHandler::isLazyTarget"); - return false; -} - -void X86KindHandler::applyFixup(int32_t reloc, uint64_t addend, - uint8_t *location, uint64_t fixupAddress, - uint64_t targetAddress) { - int error; - if (_fixupHandler[reloc]) { - error = (_fixupHandler[reloc])(location, - fixupAddress, targetAddress, addend); - - switch ((RelocationError)error) { - case NoError: - return; - } - } -} -} // end namespace elf -} // end namespace lld diff --git a/lld/lib/ReaderWriter/ELF/X86_64Reference.cpp b/lld/lib/ReaderWriter/ELF/X86_64Reference.cpp deleted file mode 100644 index c60cc5f2344..00000000000 --- a/lld/lib/ReaderWriter/ELF/X86_64Reference.cpp +++ /dev/null @@ -1,125 +0,0 @@ -//===- lib/ReaderWriter/ELF/X86_64Reference.cpp ---------------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "ReferenceKinds.h" - -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/StringSwitch.h" - -#include "llvm/Support/ELF.h" -#include "llvm/Support/Endian.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/raw_ostream.h" - -using namespace llvm::ELF; - -namespace { -/// \brief R_X86_64_64 - word64: S + A -int reloc64(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { - uint64_t result = S + A; - *reinterpret_cast<llvm::support::ulittle64_t *>(location) = result | - (uint64_t)*reinterpret_cast<llvm::support::ulittle64_t *>(location); - return 0; -} - -/// \brief R_X86_64_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 0; -} - -/// \brief R_X86_64_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); - // TODO: Make sure that the result zero extends to the 64bit value. - return 0; -} - -/// \brief R_X86_64_32S - word32: S + A -int reloc32S(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) { - int32_t result = (int32_t)(S + A); - *reinterpret_cast<llvm::support::little32_t *>(location) = result | - (int32_t)*reinterpret_cast<llvm::support::little32_t *>(location); - // TODO: Make sure that the result sign extends to the 64bit value. - return 0; -} -} // end anon namespace - -namespace lld { -namespace elf { -X86_64KindHandler::X86_64KindHandler(){ - _fixupHandler[R_X86_64_64] = reloc64; - _fixupHandler[R_X86_64_PC32] = relocPC32; - _fixupHandler[R_X86_64_32] = reloc32; - _fixupHandler[R_X86_64_32S] = reloc32S; -} - -X86_64KindHandler::~X86_64KindHandler() { -} - -Reference::Kind X86_64KindHandler::stringToKind(StringRef str) { - return llvm::StringSwitch<Reference::Kind>(str) - .Case("none", none) - .Case("R_X86_64_64", R_X86_64_64) - .Case("R_X86_64_PC32", R_X86_64_PC32) - .Case("R_X86_64_32S", R_X86_64_32S) - .Default(invalid); -} - -StringRef X86_64KindHandler::kindToString(Reference::Kind kind) { - switch ((int32_t)kind) { - case R_X86_64_64: - return "R_X86_64_64"; - case R_X86_64_PC32: - return "R_X86_64_PC32"; - case R_X86_64_32S: - return "R_X86_64_32S"; - default: - return "none"; - } -} - -bool X86_64KindHandler::isCallSite(Kind kind) { - llvm_unreachable("Unimplemented: X86KindHandler::isCallSite"); - return false; -} - -bool X86_64KindHandler::isPointer(Kind kind) { - llvm_unreachable("Unimplemented: X86KindHandler::isPointer"); - return false; -} - -bool X86_64KindHandler::isLazyImmediate(Kind kind) { - llvm_unreachable("Unimplemented: X86KindHandler::isLazyImmediate"); - return false; -} - -bool X86_64KindHandler::isLazyTarget(Kind kind) { - llvm_unreachable("Unimplemented: X86KindHandler::isLazyTarget"); - return false; -} - -void X86_64KindHandler::applyFixup(int32_t reloc, uint64_t addend, - uint8_t *location, uint64_t fixupAddress, - uint64_t targetAddress) { - if (reloc == llvm::ELF::R_X86_64_IRELATIVE) - return; - if (_fixupHandler[reloc]) - _fixupHandler[reloc](location, fixupAddress, targetAddress, addend); - else { - llvm::errs() << "Unknown relocation type: " << reloc << "\n"; - llvm_unreachable("Unknown relocation type."); - } -} -} // end namespace elf -} // end namespace lld |