[lld] r254428 - [ELF] - Refactor of tls_index implementation for tls local dynamic model.

Michael Spencer via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 2 20:09:12 PST 2015


On Tue, Dec 1, 2015 at 9:45 AM, George Rimar via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> 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() {

addLocalModuleTlsIndex was the correct name. It is the TLS Index
object for the local module.

- Michael Spencer

> +  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;
>      }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list