diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 67432dd30b62..61170c432090 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -209,7 +209,7 @@ void InputSectionBase::relocate(uint8_t *Buf, uint8_t *BufEnd, if (Target->needsPlt(Type, *Body)) { SymVA = Body->getPltVA(); } 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 // entries in the local part of MIPS GOT. In that case we need an entry // initialized by full address of the symbol. diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 7f90bd3471af..7782c0fefcc3 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -1562,20 +1562,6 @@ template typename ELFFile::uintX_t getMipsGpAddr() { 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(const SymbolBody &S); template bool isGnuIFunc(const SymbolBody &S); template bool isGnuIFunc(const SymbolBody &S); diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h index 2b1e14d84e30..2f9cd3abfce6 100644 --- a/lld/ELF/Target.h +++ b/lld/ELF/Target.h @@ -98,9 +98,6 @@ uint64_t getPPC64TocBase(); template typename llvm::object::ELFFile::uintX_t getMipsGpAddr(); -// Returns true if the relocation requires entry in the local part of GOT. -bool needsMipsLocalGot(uint32_t Type, SymbolBody *Body); - template bool isGnuIFunc(const SymbolBody &S); extern std::unique_ptr Target; diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 58299b130c32..e4fb84f72af1 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -291,10 +291,12 @@ void Writer::scanRelocs( } // MIPS has a special rule to create GOTs for local symbols. - if (Config->EMachine == EM_MIPS && needsMipsLocalGot(Type, Body)) { - // FIXME (simon): Do not add so many redundant entries. - Out::Got->addMipsLocalEntry(); - continue; + if (Config->EMachine == EM_MIPS && !canBePreempted(Body, true)) { + if (Type == R_MIPS_GOT16 || Type == R_MIPS_CALL16) { + // FIXME (simon): Do not add so many redundant entries. + Out::Got->addMipsLocalEntry(); + continue; + } } // If a symbol in a DSO is referenced directly instead of through GOT,