[lld] r252131 - [elf2] Fix R_X86_64_TPOFF32 handling.
Michael Spencer via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 5 11:20:36 PST 2015
On Thu, Nov 5, 2015 at 11:19 AM, Rui Ueyama <ruiu at google.com> wrote:
> Does this test cover that?
No, I'll add that.
- Michael Spencer
>
> On Thu, Nov 5, 2015 at 11:16 AM, Michael Spencer <bigcheesegs at gmail.com>
> wrote:
>>
>> On Thu, Nov 5, 2015 at 10:13 AM, Rui Ueyama <ruiu at google.com> wrote:
>> > On Wed, Nov 4, 2015 at 6:00 PM, Michael J. Spencer via llvm-commits
>> > <llvm-commits at lists.llvm.org> wrote:
>> >>
>> >> Author: mspencer
>> >> Date: Wed Nov 4 20:00:35 2015
>> >> New Revision: 252131
>> >>
>> >> URL: http://llvm.org/viewvc/llvm-project?rev=252131&view=rev
>> >> Log:
>> >> [elf2] Fix R_X86_64_TPOFF32 handling.
>> >>
>> >> For x86-64 the initial executable TLS block is placed directly before
>> >> the
>> >> thread specific data register so compilers can directly access it via
>> >> R_X86_64_TPOFF32. Generate the correct (negative) offset for this case.
>> >>
>> >> Modified:
>> >> lld/trunk/ELF/OutputSections.h
>> >> lld/trunk/ELF/Target.cpp
>> >> lld/trunk/ELF/Writer.cpp
>> >> lld/trunk/test/elf2/tls.s
>> >>
>> >> Modified: lld/trunk/ELF/OutputSections.h
>> >> URL:
>> >>
>> >> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=252131&r1=252130&r2=252131&view=diff
>> >>
>> >>
>> >> ==============================================================================
>> >> --- lld/trunk/ELF/OutputSections.h (original)
>> >> +++ lld/trunk/ELF/OutputSections.h Wed Nov 4 20:00:35 2015
>> >> @@ -372,6 +372,7 @@ template <class ELFT> struct Out {
>> >> static SymbolTableSection<ELFT> *DynSymTab;
>> >> static SymbolTableSection<ELFT> *SymTab;
>> >> static uintX_t TlsInitImageVA;
>> >> + static size_t TlsInitImageAlignedSize;
>> >> };
>> >>
>> >> template <class ELFT> DynamicSection<ELFT> *Out<ELFT>::Dynamic;
>> >> @@ -392,6 +393,7 @@ 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>::uintX_t
>> >> Out<ELFT>::TlsInitImageVA;
>> >> +template <class ELFT> size_t Out<ELFT>::TlsInitImageAlignedSize;
>> >>
>> >> } // namespace elf2
>> >> } // namespace lld
>> >>
>> >> Modified: lld/trunk/ELF/Target.cpp
>> >> URL:
>> >>
>> >> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=252131&r1=252130&r2=252131&view=diff
>> >>
>> >>
>> >> ==============================================================================
>> >> --- lld/trunk/ELF/Target.cpp (original)
>> >> +++ lld/trunk/ELF/Target.cpp Wed Nov 4 20:00:35 2015
>> >> @@ -340,7 +340,7 @@ void X86_64TargetInfo::relocateOne(uint8
>> >> write32le(Loc, SA);
>> >> break;
>> >> case R_X86_64_TPOFF32:
>> >> - write32le(Loc, SA);
>> >> + write32le(Loc, SA -
>> >> Out<llvm::object::ELF64LE>::TlsInitImageAlignedSize);
>> >> break;
>> >> default:
>> >> error("unrecognized reloc " + Twine(Type));
>> >>
>> >> Modified: lld/trunk/ELF/Writer.cpp
>> >> URL:
>> >>
>> >> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=252131&r1=252130&r2=252131&view=diff
>> >>
>> >>
>> >> ==============================================================================
>> >> --- lld/trunk/ELF/Writer.cpp (original)
>> >> +++ lld/trunk/ELF/Writer.cpp Wed Nov 4 20:00:35 2015
>> >> @@ -740,8 +740,11 @@ template <class ELFT> void Writer<ELFT>:
>> >> }
>> >> }
>> >>
>> >> - if (TlsPhdr.p_vaddr)
>> >> + if (TlsPhdr.p_vaddr) {
>> >> Phdrs[++PhdrIdx] = TlsPhdr;
>> >> + Out<ELFT>::TlsInitImageAlignedSize =
>> >> + RoundUpToAlignment(TlsPhdr.p_memsz, TlsPhdr.p_align);
>> >> + }
>> >
>> >
>> > Can you give me the pointer to the spec that says "TLS block end" is an
>> > aligned value this way?
>>
>> Spec seems vague about it, but it's what glibc does.
>>
>> - Michael Spencer
>>
>> >
>> >>
>> >>
>> >> // Add an entry for .dynamic.
>> >> if (isOutputDynamic()) {
>> >>
>> >> Modified: lld/trunk/test/elf2/tls.s
>> >> URL:
>> >>
>> >> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/tls.s?rev=252131&r1=252130&r2=252131&view=diff
>> >>
>> >>
>> >> ==============================================================================
>> >> --- lld/trunk/test/elf2/tls.s (original)
>> >> +++ lld/trunk/test/elf2/tls.s Wed Nov 4 20:00:35 2015
>> >> @@ -164,7 +164,7 @@ d:
>> >>
>> >> // DIS: Disassembly of section .text:
>> >> // DIS-NEXT: _start:
>> >> -// DIS-NEXT: 11000: {{.+}} movl %fs:8, %eax
>> >> -// DIS-NEXT: 11008: {{.+}} movl %fs:0, %eax
>> >> -// DIS-NEXT: 11010: {{.+}} movl %fs:12, %eax
>> >> -// DIS-NEXT: 11018: {{.+}} movl %fs:4, %eax
>> >> +// DIS-NEXT: 11000: {{.+}} movl %fs:-8, %eax
>> >> +// DIS-NEXT: 11008: {{.+}} movl %fs:-16, %eax
>> >> +// DIS-NEXT: 11010: {{.+}} movl %fs:-4, %eax
>> >> +// DIS-NEXT: 11018: {{.+}} movl %fs:-12, %eax
>> >>
>> >>
>> >> _______________________________________________
>> >> 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