[PATCH] D15769: [ELF] - implemented R_386_TLS_IE_32 relocation.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 24 06:18:43 PST 2015

grimar added a comment.

So problem I have in this patch is next. Assume we have the code below:
movl %gs:0,%eax
addl tls0 at gottpoff(%ebx),%eax

movl %gs:0,%eax
addl tls0 at gotntpoff(%ebx),%eax

First sequence generates R_386_TLS_IE_32, second generates R_386_TLS_IE. And the problem is
that such part of code looks to require 2 got entries. First one is entry for positive TLS offset,
second is GOT entry for positive TLS offset.
gold implementation contains enum allowing it to generate different GOT entries:

  enum Got_type
     GOT_TYPE_STANDARD = 0,      // GOT entry for a regular symbol
     GOT_TYPE_TLS_NOFFSET = 1,   // GOT entry for negative TLS offset
     GOT_TYPE_TLS_OFFSET = 2,    // GOT entry for positive TLS offset
     GOT_TYPE_TLS_PAIR = 3,      // GOT entry for TLS module/offset pair
     GOT_TYPE_TLS_DESC = 4       // GOT entry for TLS_DESC pair

We don`t have types of GOT entries. All we have now is uint32_t GotPltIndex; in SymbolBody.
Currently gold`s GOT_TYPE_TLS_OFFSET is only used for i386 R_386_TLS_IE_32 relocation so it is corner case.
I dont know how much is possible for one symbol to reproduce the case like above and require 2 entries.
So far I would suggest to check somehow that corner case and produce an "unsupported" error for now.
We could rewrite code in next way:
bool Regular = Target->requiresRegularGot(Type);

  unsigned IsRegularGot : 1;
  bool SymbolBody::isInGot(bool Regular) const {
    if (GotIndex == -1U)
      return false;
    if (IsRegularGot != Regular)
    return true;
  template <class ELFT> void GotSection<ELFT>::addEntry(SymbolBody *Sym, bool Regular) {
    Sym->GotIndex = Target->getGotHeaderEntriesNum() + Entries.size();
    Sym->IsRegularGot = Regular;

Another option would be to implement GOT entries types I think.


More information about the llvm-commits mailing list