diff options
| -rw-r--r-- | lld/ELF/Symbols.cpp | 11 | ||||
| -rw-r--r-- | lld/ELF/Symbols.h | 2 | ||||
| -rw-r--r-- | lld/ELF/Target.cpp | 13 | ||||
| -rw-r--r-- | lld/ELF/Writer.cpp | 2 | 
4 files changed, 15 insertions, 13 deletions
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index aea97c49ab8..8a7a18ca979 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -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; diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index 82dd8207f0b..e72c717127a 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -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; } diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index ed89aade3ab..eee5f3b0301 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -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>(); diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 81d8c048299..9e063da6e87 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -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);  | 

