summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
diff options
context:
space:
mode:
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