[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
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index 67432dd..61170c4 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -209,7 +209,7 @@
     if (Target->needsPlt(Type, *Body)) {
       SymVA = Body->getPltVA<ELFT>();
     } 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 7f90bd3..7782c0f 100644
--- a/lld/ELF/Target.cpp
+++ b/lld/ELF/Target.cpp
@@ -1562,20 +1562,6 @@
   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<ELF32BE>(const SymbolBody &S);
 template bool isGnuIFunc<ELF64LE>(const SymbolBody &S);
diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h
index 2b1e14d..2f9cd3a 100644
--- a/lld/ELF/Target.h
+++ b/lld/ELF/Target.h
@@ -98,9 +98,6 @@
 template <class ELFT>
 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);
 
 extern std::unique_ptr<TargetInfo> Target;
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 58299b1..e4fb84f 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -291,10 +291,12 @@
     }
 
     // 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<ELFT>::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<ELFT>::Got->addMipsLocalEntry();
+        continue;
+      }
     }
 
     // If a symbol in a DSO is referenced directly instead of through GOT,