summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/HexagonReference.cpp
diff options
context:
space:
mode:
authorSid Manning <sidneym@codeaurora.org>2012-10-25 17:53:04 +0000
committerSid Manning <sidneym@codeaurora.org>2012-10-25 17:53:04 +0000
commit823e8bb7beff0296ad6b1cb1df76f8cbcbbb175e (patch)
treec9d20dc178a2d0ee0225365e6e90ebad25327642 /lld/lib/ReaderWriter/ELF/HexagonReference.cpp
parent8fe3a6bda46d5f36a409d5203f05ea8e99602eee (diff)
downloadbcm5719-llvm-823e8bb7beff0296ad6b1cb1df76f8cbcbbb175e.tar.gz
bcm5719-llvm-823e8bb7beff0296ad6b1cb1df76f8cbcbbb175e.zip
This patch changes the following:
* Use conventional naming for KindHandlers. * Add X86 relocation routines. * Use std::function instead of function pointers in _fixupHandler map. * Change _fixupHandler map from std::map to llvm::DenseMap. * Add simple testcase for x86 relocations. llvm-svn: 166700
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/HexagonReference.cpp')
-rw-r--r--lld/lib/ReaderWriter/ELF/HexagonReference.cpp70
1 files changed, 35 insertions, 35 deletions
diff --git a/lld/lib/ReaderWriter/ELF/HexagonReference.cpp b/lld/lib/ReaderWriter/ELF/HexagonReference.cpp
index 42758c5b97d..0024c197b99 100644
--- a/lld/lib/ReaderWriter/ELF/HexagonReference.cpp
+++ b/lld/lib/ReaderWriter/ELF/HexagonReference.cpp
@@ -21,11 +21,11 @@ namespace lld {
namespace elf {
//===----------------------------------------------------------------------===//
-// KindHandler_hexagon
+// HexagonKindHandler
// TODO: more to do here
//===----------------------------------------------------------------------===//
-KindHandler_hexagon::~KindHandler_hexagon() {
+HexagonKindHandler::~HexagonKindHandler() {
}
/// \brief The following relocation routines are derived from the
@@ -36,70 +36,70 @@ KindHandler_hexagon::~KindHandler_hexagon() {
/// S: Value of the symbol whose index resides in the relocation entry.
namespace hexagon {
-int reloc_NONE(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) {
- return KindHandler_hexagon::NoError;
+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 reloc_B22_PCREL(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) {
+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 |
*reinterpret_cast<llvm::support::ulittle32_t *>(location);
- return KindHandler_hexagon::NoError;
+ return HexagonKindHandler::NoError;
}
- return KindHandler_hexagon::Overflow;
+ return HexagonKindHandler::Overflow;
}
/// \brief Word32_B15: 0x00df20fe : (S + A - P) >> 2 : Verify
-int reloc_B15_PCREL(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) {
+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 |
*reinterpret_cast<llvm::support::ulittle32_t *>(location);
- return KindHandler_hexagon::NoError;
+ return HexagonKindHandler::NoError;
}
- return KindHandler_hexagon::Overflow;
+ return HexagonKindHandler::Overflow;
}
/// \brief Word32_LO: 0x00c03fff : (S + A) : Truncate
-int reloc_LO16(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) {
+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 << 2) & 0x00c00000));
*reinterpret_cast<llvm::support::ulittle32_t *>(location) = result |
*reinterpret_cast<llvm::support::ulittle32_t *>(location);
- return KindHandler_hexagon::NoError;
+ return HexagonKindHandler::NoError;
}
/// \brief Word32_LO: 0x00c03fff : (S + A) >> 16 : Truncate
-int reloc_HI16(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) {
+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 << 2) & 0x00c00000));
*reinterpret_cast<llvm::support::ulittle32_t *>(location) = result |
*reinterpret_cast<llvm::support::ulittle32_t *>(location);
- return KindHandler_hexagon::NoError;
+ return HexagonKindHandler::NoError;
}
/// \brief Word32: 0xffffffff : (S + A) : Truncate
-int reloc_32(uint8_t *location, uint64_t P, uint64_t S, uint64_t A) {
+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 |
*reinterpret_cast<llvm::support::ulittle32_t *>(location);
- return KindHandler_hexagon::NoError;
+ return HexagonKindHandler::NoError;
}
} // namespace hexagon
-KindHandler_hexagon::KindHandler_hexagon(){
- _fixupHandler[llvm::ELF::R_HEX_B22_PCREL] = hexagon::reloc_B22_PCREL;
- _fixupHandler[llvm::ELF::R_HEX_B15_PCREL] = hexagon::reloc_B15_PCREL;
- _fixupHandler[llvm::ELF::R_HEX_LO16] = hexagon::reloc_LO16;
- _fixupHandler[llvm::ELF::R_HEX_HI16] = hexagon::reloc_HI16;
- _fixupHandler[llvm::ELF::R_HEX_32] = hexagon::reloc_32;
+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 KindHandler_hexagon::stringToKind(StringRef str) {
+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)
@@ -110,7 +110,7 @@ Reference::Kind KindHandler_hexagon::stringToKind(StringRef str) {
.Default(invalid);
}
-StringRef KindHandler_hexagon::kindToString(Reference::Kind kind) {
+StringRef HexagonKindHandler::kindToString(Reference::Kind kind) {
switch (static_cast<int32_t>(kind)) {
case llvm::ELF::R_HEX_B22_PCREL:
return "R_HEX_B22_PCREL";
@@ -127,34 +127,34 @@ StringRef KindHandler_hexagon::kindToString(Reference::Kind kind) {
}
}
-bool KindHandler_hexagon::isCallSite(Kind kind) {
- llvm_unreachable("Unimplemented: KindHandler_hexagon::isCallSite");
+bool HexagonKindHandler::isCallSite(Kind kind) {
+ llvm_unreachable("Unimplemented: HexagonKindHandler::isCallSite");
return false;
}
-bool KindHandler_hexagon::isPointer(Kind kind) {
- llvm_unreachable("Unimplemented: KindHandler_hexagon::isPointer");
+bool HexagonKindHandler::isPointer(Kind kind) {
+ llvm_unreachable("Unimplemented: HexagonKindHandler::isPointer");
return false;
}
-bool KindHandler_hexagon::isLazyImmediate(Kind kind) {
- llvm_unreachable("Unimplemented: KindHandler_hexagon::isLazyImmediate");
+bool HexagonKindHandler::isLazyImmediate(Kind kind) {
+ llvm_unreachable("Unimplemented: HexagonKindHandler::isLazyImmediate");
return false;
}
-bool KindHandler_hexagon::isLazyTarget(Kind kind) {
- llvm_unreachable("Unimplemented: KindHandler_hexagon::isLazyTarget");
+bool HexagonKindHandler::isLazyTarget(Kind kind) {
+ llvm_unreachable("Unimplemented: HexagonKindHandler::isLazyTarget");
return false;
}
-void KindHandler_hexagon::applyFixup(int32_t reloc, uint64_t addend,
+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);
+ error = (_fixupHandler[reloc])(location,
+ fixupAddress, targetAddress, addend);
switch ((RelocationError)error) {
case NoError:
OpenPOWER on IntegriCloud