From 92a32559fdf62dcba0f43a2acf91c76368cf4c0f Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Sat, 12 Mar 2016 11:58:15 +0000 Subject: [PATCH] [ELF][MIPS] Put type of symbol (local/global) to the findMipsPairedReloc and call it from the single place. NFC. llvm-svn: 263339 --- lld/ELF/InputSection.cpp | 21 +++++++++++---------- lld/ELF/InputSection.h | 4 ++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index b4802cdf234b..e24432528a1c 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -132,12 +132,14 @@ void InputSection::copyRelocations(uint8_t *Buf, } } -static uint32_t getMipsPairedRelocType(uint32_t Type) { +static uint32_t getMipsPairedRelocType(uint32_t Type, bool IsLocal) { if (Config->EMachine != EM_MIPS) return R_MIPS_NONE; switch (Type) { case R_MIPS_HI16: return R_MIPS_LO16; + case R_MIPS_GOT16: + return IsLocal ? R_MIPS_LO16 : R_MIPS_NONE; case R_MIPS_PCHI16: return R_MIPS_PCLO16; case R_MICROMIPS_HI16: @@ -150,9 +152,10 @@ static uint32_t getMipsPairedRelocType(uint32_t Type) { template template uint8_t * -InputSectionBase::findMipsPairedReloc(uint8_t *Buf, uint32_t SymIndex, - uint32_t Type, +InputSectionBase::findMipsPairedReloc(uint32_t Type, uint8_t *Buf, + uint32_t SymIndex, bool IsLocal, RelIteratorRange Rels) { + Type = getMipsPairedRelocType(Type, IsLocal); // Some MIPS relocations use addend calculated from addend of the relocation // itself and addend of paired relocation. ABI requires to compute such // combined addend in case of REL relocation record format only. @@ -231,6 +234,9 @@ void InputSectionBase::relocate(uint8_t *Buf, uint8_t *BufEnd, uintX_t SymVA = Body.getVA(A); bool CBP = canBePreempted(Body); uint8_t *PairedLoc = nullptr; + if (Config->EMachine == EM_MIPS) + PairedLoc = + findMipsPairedReloc(Type, Buf, SymIndex, Body.isLocal(), NextRelocs); if (Target->needsPlt(Type, Body)) { SymVA = Body.getPltVA() + A; @@ -243,11 +249,9 @@ void InputSectionBase::relocate(uint8_t *Buf, uint8_t *BufEnd, // is calculated using addends from R_MIPS_GOT16 and paired // R_MIPS_LO16 relocations. const endianness E = ELFT::TargetEndianness; - uint8_t *LowLoc = - findMipsPairedReloc(Buf, SymIndex, R_MIPS_LO16, NextRelocs); uint64_t AHL = read32(BufLoc) << 16; - if (LowLoc) - AHL += SignExtend64<16>(read32(LowLoc)); + if (PairedLoc) + AHL += SignExtend64<16>(read32(PairedLoc)); SymVA = Out::Got->getMipsLocalPageAddr(SymVA + AHL); } else { // For non-local symbols GOT entries should contain their full @@ -280,9 +284,6 @@ void InputSectionBase::relocate(uint8_t *Buf, uint8_t *BufEnd, // relocations because they use the following expression to calculate // the relocation's result for local symbol: S + A + GP0 - G. SymVA += File->getMipsGp0(); - } else { - PairedLoc = findMipsPairedReloc( - Buf, SymIndex, getMipsPairedRelocType(Type), NextRelocs); } } else if (!Target->needsCopyRel(Type, Body) && CBP) { continue; diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h index f7c977b87401..69d5a0d0e48a 100644 --- a/lld/ELF/InputSection.h +++ b/lld/ELF/InputSection.h @@ -84,8 +84,8 @@ public: private: template - uint8_t *findMipsPairedReloc(uint8_t *Buf, uint32_t SymIndex, uint32_t Type, - RelIteratorRange Rels); + uint8_t *findMipsPairedReloc(uint32_t Type, uint8_t *Buf, uint32_t SymIndex, + bool IsLocal, RelIteratorRange Rels); }; template