From: Simon Atanasyan Date: Thu, 4 Feb 2016 11:51:45 +0000 (+0000) Subject: [ELF][MIPS] Replace needsMipsLocalGot function by canBePreempted X-Git-Tag: llvmorg-3.9.0-rc1~15116 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4b03451cac039db35e7cb76168ccd1c8c26fb006;p=platform%2Fupstream%2Fllvm.git [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 @@ void InputSectionBase::relocate(uint8_t *Buf, uint8_t *BufEnd, if (Target->needsPlt(Type, *Body)) { SymVA = Body->getPltVA(); } 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 @@ template typename ELFFile::uintX_t getMipsGpAddr() { 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(const SymbolBody &S); template bool isGnuIFunc(const SymbolBody &S); template bool isGnuIFunc(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 @@ uint64_t getPPC64TocBase(); template typename llvm::object::ELFFile::uintX_t getMipsGpAddr(); -// Returns true if the relocation requires entry in the local part of GOT. -bool needsMipsLocalGot(uint32_t Type, SymbolBody *Body); - template bool isGnuIFunc(const SymbolBody &S); extern std::unique_ptr 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 @@ void Writer::scanRelocs( } // 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::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::Got->addMipsLocalEntry(); + continue; + } } // If a symbol in a DSO is referenced directly instead of through GOT,