diff options
author | George Rimar <grimar@accesssoftek.com> | 2015-12-01 18:11:16 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2015-12-01 18:11:16 +0000 |
commit | 60849f291340b3599219eb42dce91062b2f3596c (patch) | |
tree | 25926968db83c4958bba27232652da21448828b5 | |
parent | 98ad82a6a1e33400f657e26dd0daabc49862a325 (diff) | |
download | bcm5719-llvm-60849f291340b3599219eb42dce91062b2f3596c.tar.gz bcm5719-llvm-60849f291340b3599219eb42dce91062b2f3596c.zip |
revert r254428 [ELF] - Refactor of tls_index implementation for tls local dynamic model.
It failed buildbot:
http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/builds/3782/steps/build/logs/stdio
Target.cpp
In file included from /home/buildbot/Buildbot/Slave/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/tools/lld/ELF/Target.cpp:20:
/home/buildbot/Buildbot/Slave/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/tools/lld/ELF/OutputSections.h:136:42: error: use of undeclared identifier 'getVA'
uint32_t getLocalTlsIndexVA() { return getVA() + LocalTlsIndexOff; }
llvm-svn: 254432
-rw-r--r-- | lld/ELF/InputSection.cpp | 3 | ||||
-rw-r--r-- | lld/ELF/OutputSections.cpp | 10 | ||||
-rw-r--r-- | lld/ELF/OutputSections.h | 7 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 5 |
4 files changed, 13 insertions, 12 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 3cc979077dd..64559f7fc3f 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -113,7 +113,8 @@ void InputSectionBase<ELFT>::relocate( if (Target->isTlsLocalDynamicReloc(Type) && !Target->isTlsOptimized(Type, nullptr)) { Target->relocateOne(BufLoc, BufEnd, Type, AddrLoc, - Out<ELFT>::Got->getLocalTlsIndexVA() + + Out<ELFT>::Got->getVA() + + Out<ELFT>::LocalModuleTlsIndexOffset + getAddend<ELFT>(RI)); continue; } diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 57d1e76b617..e3c910f5230 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -87,13 +87,10 @@ template <class ELFT> void GotSection<ELFT>::addDynTlsEntry(SymbolBody *Sym) { Entries.push_back(nullptr); } -template <class ELFT> bool GotSection<ELFT>::addLocalModelTlsIndex() { - if (LocalTlsIndexOff != uint32_t(-1)) - return false; +template <class ELFT> uint32_t GotSection<ELFT>::addLocalModuleTlsIndex() { Entries.push_back(nullptr); Entries.push_back(nullptr); - LocalTlsIndexOff = (Entries.size() - 2) * sizeof(uintX_t); - return true; + return (Entries.size() - 2) * sizeof(uintX_t); } template <class ELFT> @@ -204,7 +201,8 @@ bool RelocationSection<ELFT>::applyTlsDynamicReloc(SymbolBody *Body, Elf_Rel *N) { if (Target->isTlsLocalDynamicReloc(Type)) { P->setSymbolAndType(0, Target->getTlsModuleIndexReloc(), Config->Mips64EL); - P->r_offset = Out<ELFT>::Got->getLocalTlsIndexVA(); + P->r_offset = + Out<ELFT>::Got->getVA() + Out<ELFT>::LocalModuleTlsIndexOffset; return true; } diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h index a676ce31f37..dea9bb3c120 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -119,7 +119,7 @@ public: void writeTo(uint8_t *Buf) override; void addEntry(SymbolBody *Sym); void addDynTlsEntry(SymbolBody *Sym); - bool addLocalModelTlsIndex(); + uint32_t addLocalModuleTlsIndex(); bool empty() const { return Entries.empty(); } uintX_t getEntryAddr(const SymbolBody &B) const; @@ -133,11 +133,8 @@ public: // the number of reserved entries. This method is MIPS-specific. unsigned getMipsLocalEntriesNum() const; - uint32_t getLocalTlsIndexVA() { return getVA() + LocalTlsIndexOff; } - private: std::vector<const SymbolBody *> Entries; - uint32_t LocalTlsIndexOff = -1; }; template <class ELFT> @@ -433,6 +430,7 @@ template <class ELFT> struct Out { static SymbolTableSection<ELFT> *DynSymTab; static SymbolTableSection<ELFT> *SymTab; static Elf_Phdr *TlsPhdr; + static uint32_t LocalModuleTlsIndexOffset; }; template <class ELFT> DynamicSection<ELFT> *Out<ELFT>::Dynamic; @@ -454,6 +452,7 @@ template <class ELFT> StringTableSection<ELFT> *Out<ELFT>::StrTab; template <class ELFT> SymbolTableSection<ELFT> *Out<ELFT>::DynSymTab; template <class ELFT> SymbolTableSection<ELFT> *Out<ELFT>::SymTab; template <class ELFT> typename Out<ELFT>::Elf_Phdr *Out<ELFT>::TlsPhdr; +template <class ELFT> uint32_t Out<ELFT>::LocalModuleTlsIndexOffset = -1; } // namespace elf2 } // namespace lld diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 16dedc53a4e..11fb9b020d4 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -205,8 +205,11 @@ void Writer<ELFT>::scanRelocs( if (Target->isTlsLocalDynamicReloc(Type)) { if (Target->isTlsOptimized(Type, nullptr)) continue; - if (Out<ELFT>::Got->addLocalModelTlsIndex()) + if (Out<ELFT>::LocalModuleTlsIndexOffset == uint32_t(-1)) { + Out<ELFT>::LocalModuleTlsIndexOffset = + Out<ELFT>::Got->addLocalModuleTlsIndex(); Out<ELFT>::RelaDyn->addReloc({&C, &RI}); + } continue; } |