Redefine isGnuIfunc as a member function of SymbolBody.
authorRui Ueyama <ruiu@google.com>
Sun, 13 Mar 2016 04:40:14 +0000 (04:40 +0000)
committerRui Ueyama <ruiu@google.com>
Sun, 13 Mar 2016 04:40:14 +0000 (04:40 +0000)
llvm-svn: 263365

lld/ELF/Symbols.cpp
lld/ELF/Symbols.h
lld/ELF/Target.cpp
lld/ELF/Writer.cpp

index aea97c4..8a7a18c 100644 (file)
@@ -81,6 +81,12 @@ getSymVA(const SymbolBody &Body, typename ELFFile<ELFT>::uintX_t &Addend) {
   llvm_unreachable("invalid symbol kind");
 }
 
+template <class ELFT> bool SymbolBody::isGnuIfunc() const {
+  if (auto *D = dyn_cast<DefinedElf<ELFT>>(this))
+    return D->Sym.getType() == STT_GNU_IFUNC;
+  return false;
+}
+
 template <class ELFT>
 typename ELFFile<ELFT>::uintX_t
 SymbolBody::getVA(typename ELFFile<ELFT>::uintX_t Addend) const {
@@ -245,6 +251,11 @@ std::string elf::demangle(StringRef Name) {
 #endif
 }
 
+template bool SymbolBody::template isGnuIfunc<ELF32LE>() const;
+template bool SymbolBody::template isGnuIfunc<ELF32BE>() const;
+template bool SymbolBody::template isGnuIfunc<ELF64LE>() const;
+template bool SymbolBody::template isGnuIfunc<ELF64BE>() const;
+
 template uint32_t SymbolBody::template getVA<ELF32LE>(uint32_t) const;
 template uint32_t SymbolBody::template getVA<ELF32BE>(uint32_t) const;
 template uint64_t SymbolBody::template getVA<ELF64LE>(uint64_t) const;
index 82dd820..e72c717 100644 (file)
@@ -74,6 +74,8 @@ public:
   bool isLocal() const { return IsLocal; }
   bool isUsedInRegularObj() const { return IsUsedInRegularObj; }
 
+  template <class ELFT> bool isGnuIfunc() const;
+
   // Returns the symbol name.
   StringRef getName() const { return Name; }
 
index ed89aad..eee5f3b 100644 (file)
@@ -70,12 +70,6 @@ template <unsigned N> static void checkAlignment(uint64_t V, uint32_t Type) {
   error("improper alignment for relocation " + S);
 }
 
-template <class ELFT> bool isGnuIFunc(const SymbolBody &S) {
-  if (auto *SS = dyn_cast<DefinedElf<ELFT>>(&S))
-    return SS->Sym.getType() == STT_GNU_IFUNC;
-  return false;
-}
-
 namespace {
 class X86TargetInfo final : public TargetInfo {
 public:
@@ -315,7 +309,7 @@ bool TargetInfo::refersToGotEntry(uint32_t Type) const { return false; }
 template <class ELFT>
 TargetInfo::PltNeed TargetInfo::needsPlt(uint32_t Type,
                                          const SymbolBody &S) const {
-  if (isGnuIFunc<ELFT>(S))
+  if (S.isGnuIfunc<ELFT>())
     return Plt_Explicit;
   if (canBePreempted(S) && needsPltImpl(Type))
     return Plt_Explicit;
@@ -1806,11 +1800,6 @@ template <class ELFT> typename ELFFile<ELFT>::uintX_t getMipsGpAddr() {
   return 0;
 }
 
-template bool isGnuIFunc<ELF32LE>(const SymbolBody &S);
-template bool isGnuIFunc<ELF32BE>(const SymbolBody &S);
-template bool isGnuIFunc<ELF64LE>(const SymbolBody &S);
-template bool isGnuIFunc<ELF64BE>(const SymbolBody &S);
-
 template uint32_t getMipsGpAddr<ELF32LE>();
 template uint32_t getMipsGpAddr<ELF32BE>();
 template uint64_t getMipsGpAddr<ELF64LE>();
index 81d8c04..9e063da 100644 (file)
@@ -366,7 +366,7 @@ void Writer<ELFT>::scanRelocs(
     // An STT_GNU_IFUNC symbol always uses a PLT entry, and all references
     // to the symbol go through the PLT. This is true even for a local
     // symbol, although local symbols normally do not require PLT entries.
-    if (isGnuIFunc<ELFT>(Body)) {
+    if (Body.isGnuIfunc<ELFT>()) {
       if (Body.isInPlt())
         continue;
       Out<ELFT>::Plt->addEntry(Body);