[lld] r254428 - [ELF] - Refactor of tls_index implementation for tls local dynamic model.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 1 09:45:31 PST 2015
Author: grimar
Date: Tue Dec 1 11:45:31 2015
New Revision: 254428
URL: http://llvm.org/viewvc/llvm-project?rev=254428&view=rev
Log:
[ELF] - Refactor of tls_index implementation for tls local dynamic model.
Patch contains the next 2 changes:
1) static variable Out<ELFT>::LocalModuleTlsIndexOffset moved to Out<ELFT>::Got. At fact there is no meaning for it to be separated from GOT class because at each place of using it anyways needs to call GOT`s getVA(). Also it is impossible to have that offset and not have GOT.
2) addLocalModuleTlsIndex -> addLocalModelTlsIndex (word "Module" changed to "Model"). Not sure was it a mistype or not but I think that update is closer to Urlich terminology.
Differential revision: http://reviews.llvm.org/D15113
Modified:
lld/trunk/ELF/InputSection.cpp
lld/trunk/ELF/OutputSections.cpp
lld/trunk/ELF/OutputSections.h
lld/trunk/ELF/Writer.cpp
Modified: lld/trunk/ELF/InputSection.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=254428&r1=254427&r2=254428&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.cpp (original)
+++ lld/trunk/ELF/InputSection.cpp Tue Dec 1 11:45:31 2015
@@ -113,8 +113,7 @@ void InputSectionBase<ELFT>::relocate(
if (Target->isTlsLocalDynamicReloc(Type) &&
!Target->isTlsOptimized(Type, nullptr)) {
Target->relocateOne(BufLoc, BufEnd, Type, AddrLoc,
- Out<ELFT>::Got->getVA() +
- Out<ELFT>::LocalModuleTlsIndexOffset +
+ Out<ELFT>::Got->getLocalTlsIndexVA() +
getAddend<ELFT>(RI));
continue;
}
Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=254428&r1=254427&r2=254428&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Tue Dec 1 11:45:31 2015
@@ -87,10 +87,13 @@ template <class ELFT> void GotSection<EL
Entries.push_back(nullptr);
}
-template <class ELFT> uint32_t GotSection<ELFT>::addLocalModuleTlsIndex() {
+template <class ELFT> bool GotSection<ELFT>::addLocalModelTlsIndex() {
+ if (LocalTlsIndexOff != uint32_t(-1))
+ return false;
Entries.push_back(nullptr);
Entries.push_back(nullptr);
- return (Entries.size() - 2) * sizeof(uintX_t);
+ LocalTlsIndexOff = (Entries.size() - 2) * sizeof(uintX_t);
+ return true;
}
template <class ELFT>
@@ -201,8 +204,7 @@ bool RelocationSection<ELFT>::applyTlsDy
Elf_Rel *N) {
if (Target->isTlsLocalDynamicReloc(Type)) {
P->setSymbolAndType(0, Target->getTlsModuleIndexReloc(), Config->Mips64EL);
- P->r_offset =
- Out<ELFT>::Got->getVA() + Out<ELFT>::LocalModuleTlsIndexOffset;
+ P->r_offset = Out<ELFT>::Got->getLocalTlsIndexVA();
return true;
}
Modified: lld/trunk/ELF/OutputSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=254428&r1=254427&r2=254428&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.h (original)
+++ lld/trunk/ELF/OutputSections.h Tue Dec 1 11:45:31 2015
@@ -119,7 +119,7 @@ public:
void writeTo(uint8_t *Buf) override;
void addEntry(SymbolBody *Sym);
void addDynTlsEntry(SymbolBody *Sym);
- uint32_t addLocalModuleTlsIndex();
+ bool addLocalModelTlsIndex();
bool empty() const { return Entries.empty(); }
uintX_t getEntryAddr(const SymbolBody &B) const;
@@ -133,8 +133,11 @@ 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>
@@ -430,7 +433,6 @@ 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;
@@ -452,7 +454,6 @@ template <class ELFT> StringTableSection
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
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=254428&r1=254427&r2=254428&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Tue Dec 1 11:45:31 2015
@@ -205,11 +205,8 @@ void Writer<ELFT>::scanRelocs(
if (Target->isTlsLocalDynamicReloc(Type)) {
if (Target->isTlsOptimized(Type, nullptr))
continue;
- if (Out<ELFT>::LocalModuleTlsIndexOffset == uint32_t(-1)) {
- Out<ELFT>::LocalModuleTlsIndexOffset =
- Out<ELFT>::Got->addLocalModuleTlsIndex();
+ if (Out<ELFT>::Got->addLocalModelTlsIndex())
Out<ELFT>::RelaDyn->addReloc({&C, &RI});
- }
continue;
}
More information about the llvm-commits
mailing list