[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

llvm-svn: 254428
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index 5cabae3..eae8bd2 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -113,8 +113,7 @@
     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;
     }
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp
index e3c910f..57d1e76 100644
--- a/lld/ELF/OutputSections.cpp
+++ b/lld/ELF/OutputSections.cpp
@@ -87,10 +87,13 @@
   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 @@
                                                    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;
   }
 
diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h
index dea9bb3..a676ce3 100644
--- a/lld/ELF/OutputSections.h
+++ b/lld/ELF/OutputSections.h
@@ -119,7 +119,7 @@
   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 @@
   // 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 @@
   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> 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
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 11fb9b0..16dedc5 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -205,11 +205,8 @@
     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;
     }