[ELF][MIPS] Put type of symbol (local/global) to the findMipsPairedReloc and call it from the single place. NFC.

llvm-svn: 263339
This commit is contained in:
Simon Atanasyan 2016-03-12 11:58:15 +00:00
parent bd56e4e25a
commit 92a32559fd
2 changed files with 13 additions and 12 deletions

View File

@ -132,12 +132,14 @@ void InputSection<ELFT>::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 <class ELFT>
template <bool isRela>
uint8_t *
InputSectionBase<ELFT>::findMipsPairedReloc(uint8_t *Buf, uint32_t SymIndex,
uint32_t Type,
InputSectionBase<ELFT>::findMipsPairedReloc(uint32_t Type, uint8_t *Buf,
uint32_t SymIndex, bool IsLocal,
RelIteratorRange<isRela> 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<ELFT>::relocate(uint8_t *Buf, uint8_t *BufEnd,
uintX_t SymVA = Body.getVA<ELFT>(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<ELFT>(Type, Body)) {
SymVA = Body.getPltVA<ELFT>() + A;
@ -243,11 +249,9 @@ void InputSectionBase<ELFT>::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<E>(BufLoc) << 16;
if (LowLoc)
AHL += SignExtend64<16>(read32<E>(LowLoc));
if (PairedLoc)
AHL += SignExtend64<16>(read32<E>(PairedLoc));
SymVA = Out<ELFT>::Got->getMipsLocalPageAddr(SymVA + AHL);
} else {
// For non-local symbols GOT entries should contain their full
@ -280,9 +284,6 @@ void InputSectionBase<ELFT>::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<ELFT>(Type, Body) && CBP) {
continue;

View File

@ -84,8 +84,8 @@ public:
private:
template <bool isRela>
uint8_t *findMipsPairedReloc(uint8_t *Buf, uint32_t SymIndex, uint32_t Type,
RelIteratorRange<isRela> Rels);
uint8_t *findMipsPairedReloc(uint32_t Type, uint8_t *Buf, uint32_t SymIndex,
bool IsLocal, RelIteratorRange<isRela> Rels);
};
template <class ELFT>