[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