summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
diff options
context:
space:
mode:
authorSimon Atanasyan <simon@atanasyan.com>2014-04-11 04:33:21 +0000
committerSimon Atanasyan <simon@atanasyan.com>2014-04-11 04:33:21 +0000
commit62377c68750933c5ca0a9e53bd1b0019c5da1df8 (patch)
tree691629ba9e580aea62ed54ca6037cfd393b20faa /lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
parent42ac0dd3c35c9e2fedcfaeb4814776789bbcdaec (diff)
downloadbcm5719-llvm-62377c68750933c5ca0a9e53bd1b0019c5da1df8.tar.gz
bcm5719-llvm-62377c68750933c5ca0a9e53bd1b0019c5da1df8.zip
[Mips] R_MIPS_PC32 relocation support.
llvm-svn: 206018
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp')
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp b/lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
index 0cc5630bb6f..7407ad58ed9 100644
--- a/lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
+++ b/lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
@@ -34,6 +34,12 @@ static void reloc32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
applyReloc(location, S + A, 0xffffffff);
}
+/// \brief R_MIPS_PC32
+/// local/external: word32 S + A i- P (truncate)
+void relocpc32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
+ applyReloc(location, S + A - P, 0xffffffff);
+}
+
/// \brief R_MIPS_26
/// local : ((A | ((P + 4) & 0x3F000000)) + S) >> 2
static void reloc26loc(uint8_t *location, uint64_t P, uint64_t S, int32_t A) {
@@ -154,6 +160,9 @@ error_code MipsTargetRelocationHandler::applyRelocation(
case R_MIPS_JUMP_SLOT:
// Ignore runtime relocations.
break;
+ case R_MIPS_PC32:
+ relocpc32(location, relocVAddress, targetVAddress, ref.addend());
+ break;
case LLD_R_MIPS_GLOBAL_GOT:
// Do nothing.
break;
OpenPOWER on IntegriCloud