forked from OSchip/llvm-project
Redefine isGnuIfunc as a member function of SymbolBody.
llvm-svn: 263365
This commit is contained in:
parent
cb8fd3ac68
commit
7ede54310a
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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>();
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue