[ELF][MIPS] Replace needsMipsLocalGot function by canBePreempted
Symbol does not need an entry i the 'global' part of GOT if it cannot be preempted. So canBePreempted fully satisfies us at least for now. llvm-svn: 259779
This commit is contained in:
parent
170356ba32
commit
4b03451cac
|
@ -209,7 +209,7 @@ void InputSectionBase<ELFT>::relocate(uint8_t *Buf, uint8_t *BufEnd,
|
||||||
if (Target->needsPlt(Type, *Body)) {
|
if (Target->needsPlt(Type, *Body)) {
|
||||||
SymVA = Body->getPltVA<ELFT>();
|
SymVA = Body->getPltVA<ELFT>();
|
||||||
} else if (Target->needsGot(Type, *Body)) {
|
} else if (Target->needsGot(Type, *Body)) {
|
||||||
if (Config->EMachine == EM_MIPS && needsMipsLocalGot(Type, Body))
|
if (Config->EMachine == EM_MIPS && !canBePreempted(Body, true))
|
||||||
// Under some conditions relocations against non-local symbols require
|
// Under some conditions relocations against non-local symbols require
|
||||||
// entries in the local part of MIPS GOT. In that case we need an entry
|
// entries in the local part of MIPS GOT. In that case we need an entry
|
||||||
// initialized by full address of the symbol.
|
// initialized by full address of the symbol.
|
||||||
|
|
|
@ -1562,20 +1562,6 @@ template <class ELFT> typename ELFFile<ELFT>::uintX_t getMipsGpAddr() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool needsMipsLocalGot(uint32_t Type, SymbolBody *Body) {
|
|
||||||
// The R_MIPS_GOT16 relocation requires creation of entry in the local part
|
|
||||||
// of GOT if its target is a local symbol or non-local symbol with 'local'
|
|
||||||
// visibility.
|
|
||||||
if (Type != R_MIPS_GOT16)
|
|
||||||
return false;
|
|
||||||
if (!Body)
|
|
||||||
return true;
|
|
||||||
uint8_t V = Body->getVisibility();
|
|
||||||
if (V != STV_DEFAULT && V != STV_PROTECTED)
|
|
||||||
return true;
|
|
||||||
return !Config->Shared;
|
|
||||||
}
|
|
||||||
|
|
||||||
template bool isGnuIFunc<ELF32LE>(const SymbolBody &S);
|
template bool isGnuIFunc<ELF32LE>(const SymbolBody &S);
|
||||||
template bool isGnuIFunc<ELF32BE>(const SymbolBody &S);
|
template bool isGnuIFunc<ELF32BE>(const SymbolBody &S);
|
||||||
template bool isGnuIFunc<ELF64LE>(const SymbolBody &S);
|
template bool isGnuIFunc<ELF64LE>(const SymbolBody &S);
|
||||||
|
|
|
@ -98,9 +98,6 @@ uint64_t getPPC64TocBase();
|
||||||
template <class ELFT>
|
template <class ELFT>
|
||||||
typename llvm::object::ELFFile<ELFT>::uintX_t getMipsGpAddr();
|
typename llvm::object::ELFFile<ELFT>::uintX_t getMipsGpAddr();
|
||||||
|
|
||||||
// Returns true if the relocation requires entry in the local part of GOT.
|
|
||||||
bool needsMipsLocalGot(uint32_t Type, SymbolBody *Body);
|
|
||||||
|
|
||||||
template <class ELFT> bool isGnuIFunc(const SymbolBody &S);
|
template <class ELFT> bool isGnuIFunc(const SymbolBody &S);
|
||||||
|
|
||||||
extern std::unique_ptr<TargetInfo> Target;
|
extern std::unique_ptr<TargetInfo> Target;
|
||||||
|
|
|
@ -291,10 +291,12 @@ void Writer<ELFT>::scanRelocs(
|
||||||
}
|
}
|
||||||
|
|
||||||
// MIPS has a special rule to create GOTs for local symbols.
|
// MIPS has a special rule to create GOTs for local symbols.
|
||||||
if (Config->EMachine == EM_MIPS && needsMipsLocalGot(Type, Body)) {
|
if (Config->EMachine == EM_MIPS && !canBePreempted(Body, true)) {
|
||||||
// FIXME (simon): Do not add so many redundant entries.
|
if (Type == R_MIPS_GOT16 || Type == R_MIPS_CALL16) {
|
||||||
Out<ELFT>::Got->addMipsLocalEntry();
|
// FIXME (simon): Do not add so many redundant entries.
|
||||||
continue;
|
Out<ELFT>::Got->addMipsLocalEntry();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If a symbol in a DSO is referenced directly instead of through GOT,
|
// If a symbol in a DSO is referenced directly instead of through GOT,
|
||||||
|
|
Loading…
Reference in New Issue