[PATCH] D15060: [ELF] - Implemented some GD, LD and IE TLS access models for x86 target.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 30 11:04:02 PST 2015


grimar added inline comments.

================
Comment at: ELF/OutputSections.cpp:84
@@ -83,3 +83,3 @@
 template <class ELFT> void GotSection<ELFT>::addDynTlsEntry(SymbolBody *Sym) {
-  Sym->GotIndex = Target->getGotHeaderEntriesNum() + Entries.size();
+  Sym->GlobDynIndex = Target->getGotHeaderEntriesNum() + Entries.size();
   // Global Dynamic TLS entries take two GOT slots.
----------------
ruiu wrote:
> Why do we need a different member variable than GotIndex?
Thats needed for the next code sequence to work correctly:

```
leal tls0 at tlsgd(,%ebx,1),%eax
call __tls_get_addr at plt
movl %gs:0,%eax
addl tls0 at gotntpoff(%ebx),%eax
```

@tlsgd(x) - Allocates two contiguous entries in the GOT to hold a TLS_index structure.
@gotntpoff(x) - Allocates a entry in the GOT, and initializes it with the negative tlsoffset relative to the static TLS block. This is performed at runtime via the R_386_TLS_TPOFF relocation.

Problem is that next part of code terminates execution flow: 

```
void Writer<ELFT>::scanRelocs(
.....
    if (Body && Body->isTLS() && Target->isTlsGlobalDynamicReloc(Type)) {
      if (Target->isTlsOptimized(Type, Body))
        continue;
      if (Body->isInGot())
        continue;
```
Make it continue and unable to move forward and create R_386_TLS_TPOFF relocation (and single entry) below at the end of that method.


http://reviews.llvm.org/D15060





More information about the llvm-commits mailing list