From 4e18a3163d22ddf550081c0becfbd49d2d6f7323 Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Fri, 4 Mar 2016 10:55:29 +0000 Subject: [PATCH] [ELF][MIPS] Factor out the code reading and sign-extending low 16-bits of 32-bit word. NFC llvm-svn: 262708 --- lld/ELF/Target.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 97fb676..8ac046c 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -1652,10 +1652,13 @@ static void writeMipsLo16(uint8_t *Loc, uint64_t V) { write32(Loc, (Instr & 0xffff0000) | (V & 0xffff)); } +template static int16_t readSignedLo16(uint8_t *Loc) { + return SignExtend32<16>(read32(Loc) & 0xffff); +} + template static int64_t readMipsAHL(uint8_t *HiLoc, uint8_t *LoLoc) { - return ((read32(HiLoc) & 0xffff) << 16) + - SignExtend64<16>(read32(LoLoc) & 0xffff); + return ((read32(HiLoc) & 0xffff) << 16) + readSignedLo16(LoLoc); } template @@ -1736,8 +1739,7 @@ void MipsTargetInfo::relocateOne(uint8_t *Loc, uint8_t *BufEnd, break; } case R_MIPS_GPREL16: { - uint32_t Instr = read32(Loc); - int64_t V = S + SignExtend64<16>(Instr & 0xffff) - getMipsGpAddr(); + int64_t V = S + readSignedLo16(Loc) - getMipsGpAddr(); checkInt<16>(V, Type); writeMipsLo16(Loc, V); break; @@ -1757,7 +1759,7 @@ void MipsTargetInfo::relocateOne(uint8_t *Loc, uint8_t *BufEnd, // Ignore this optimization relocation for now break; case R_MIPS_LO16: - writeMipsLo16(Loc, S + SignExtend64<16>(read32(Loc) & 0xffff)); + writeMipsLo16(Loc, S + readSignedLo16(Loc)); break; case R_MIPS_PC16: applyMipsPcReloc(Loc, Type, P, S); @@ -1783,7 +1785,7 @@ void MipsTargetInfo::relocateOne(uint8_t *Loc, uint8_t *BufEnd, } break; case R_MIPS_PCLO16: - writeMipsLo16(Loc, S + SignExtend64<16>(read32(Loc) & 0xffff) - P); + writeMipsLo16(Loc, S + readSignedLo16(Loc) - P); break; default: fatal("unrecognized reloc " + Twine(Type)); -- 2.7.4