[lld] r252131 - [elf2] Fix R_X86_64_TPOFF32 handling.
Michael Spencer via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 5 11:16:55 PST 2015
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