if (Target->isTlsLocalDynamicRel(Type) &&
!Target->canRelaxTls(Type, nullptr)) {
Target->relocateOne(BufLoc, BufEnd, Type, AddrLoc,
- Out<ELFT>::Got->getLocalTlsIndexVA() +
+ Out<ELFT>::Got->getTlsIndexVA() +
getAddend<ELFT>(RI));
continue;
}
return true;
}
-template <class ELFT> bool GotSection<ELFT>::addCurrentModuleTlsIndex() {
- if (LocalTlsIndexOff != uint32_t(-1))
+// Reserves TLS entries for a TLS module ID and a TLS block offset.
+// In total it takes two GOT slots.
+template <class ELFT> bool GotSection<ELFT>::addTlsIndex() {
+ if (TlsIndexOff != uint32_t(-1))
return false;
- LocalTlsIndexOff = Entries.size() * sizeof(uintX_t);
+ TlsIndexOff = Entries.size() * sizeof(uintX_t);
Entries.push_back(nullptr);
Entries.push_back(nullptr);
return true;
case DynamicReloc<ELFT>::Off_GTlsOffset:
return Out<ELFT>::Got->getGlobalDynAddr(*Sym) + sizeof(uintX_t);
case DynamicReloc<ELFT>::Off_LTlsIndex:
- return Out<ELFT>::Got->getLocalTlsIndexVA();
+ return Out<ELFT>::Got->getTlsIndexVA();
case DynamicReloc<ELFT>::Off_Sec:
return Rel.OffsetSec->getOffset(Rel.OffsetInSec) +
Rel.OffsetSec->OutSec->getVA();
void addEntry(SymbolBody *Sym);
void addMipsLocalEntry();
bool addDynTlsEntry(SymbolBody *Sym);
- bool addCurrentModuleTlsIndex();
+ bool addTlsIndex();
bool empty() const { return MipsLocalEntries == 0 && Entries.empty(); }
uintX_t getMipsLocalFullAddr(const SymbolBody &B);
uintX_t getMipsLocalPageAddr(uintX_t Addr);
// the number of reserved entries. This method is MIPS-specific.
unsigned getMipsLocalEntriesNum() const;
- uintX_t getLocalTlsIndexVA() { return Base::getVA() + LocalTlsIndexOff; }
+ uintX_t getTlsIndexVA() { return Base::getVA() + TlsIndexOff; }
private:
std::vector<const SymbolBody *> Entries;
- uint32_t LocalTlsIndexOff = -1;
+ uint32_t TlsIndexOff = -1;
uint32_t MipsLocalEntries = 0;
llvm::DenseMap<uintX_t, size_t> MipsLocalGotPos;
if (Target->isTlsLocalDynamicRel(Type)) {
if (Target->canRelaxTls(Type, nullptr))
return true;
- if (Out<ELFT>::Got->addCurrentModuleTlsIndex())
+ if (Out<ELFT>::Got->addTlsIndex())
Out<ELFT>::RelaDyn->addReloc({Target->TlsModuleIndexRel,
DynamicReloc<ELFT>::Off_LTlsIndex,
nullptr});
return false;
if (Target->isTlsGlobalDynamicRel(Type)) {
- bool Opt = Target->canRelaxTls(Type, Body);
- if (!Opt && Out<ELFT>::Got->addDynTlsEntry(Body)) {
+ if (!Target->canRelaxTls(Type, Body) &&
+ Out<ELFT>::Got->addDynTlsEntry(Body)) {
Out<ELFT>::RelaDyn->addReloc(
{Target->TlsModuleIndexRel, DynamicReloc<ELFT>::Off_GTlsIndex, Body});
Out<ELFT>::RelaDyn->addReloc(