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); |