summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2015-12-01 18:11:16 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2015-12-01 18:11:16 +0000
commit60849f291340b3599219eb42dce91062b2f3596c (patch)
tree25926968db83c4958bba27232652da21448828b5
parent98ad82a6a1e33400f657e26dd0daabc49862a325 (diff)
downloadbcm5719-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.cpp3
-rw-r--r--lld/ELF/OutputSections.cpp10
-rw-r--r--lld/ELF/OutputSections.h7
-rw-r--r--lld/ELF/Writer.cpp5
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;
}
OpenPOWER on IntegriCloud