<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, May 11, 2017 at 6:08 AM, Rafael Avila de Espindola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I just cloned musl and DF_STATIC_TLS is not used anywhere.<br>
<br>
glibc used to use it, but doesn't since 2002<br>
(<wbr>2430d57a13f4f10312e13c58962cd9<wbr>104e6428fd).<br>
<br>
It is also not used by the freebsd one.<br>
<br>
Given the above, I think we should remove support for the flag for now.<br></blockquote><div><br></div><div>I wouldn't object.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Cheers,<br>
Rafael<br>
<div><div class="h5"><br>
<br>
George Rimar via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> writes:<br>
<br>
> grimar created this revision.<br>
><br>
> DF_STATIC_TLS<br>
> If set in a shared object or executable, this flag instructs the dynamic linker to reject attempts to load this file dynamically. It indicates that the shared object or executable contains code using a static thread-local storage scheme. Implementations need not support any form of thread-local storage.<br>
><br>
> The is same as <a href="https://reviews.llvm.org/D32354" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D32354</a>, but for x86_64 target.<br>
><br>
><br>
> <a href="https://reviews.llvm.org/D33041" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D33041</a><br>
><br>
> Files:<br>
>   ELF/Target.cpp<br>
>   test/ELF/Inputs/x86-64-static-<wbr>tls-model1.s<br>
>   test/ELF/Inputs/x86-64-static-<wbr>tls-model2.s<br>
>   test/ELF/tls-dynamic.s<br>
>   test/ELF/tls-got.s<br>
>   test/ELF/tls-initial-exec-<wbr>local.s<br>
>   test/ELF/x86_64-static-tls-<wbr>model.s<br>
><br>
</div></div>> Index: test/ELF/x86_64-static-tls-<wbr>model.s<br>
> ==============================<wbr>==============================<wbr>=======<br>
> --- test/ELF/x86_64-static-tls-<wbr>model.s<br>
> +++ test/ELF/x86_64-static-tls-<wbr>model.s<br>
<span class="">> @@ -0,0 +1,12 @@<br>
> +# REQUIRES: x86<br>
> +<br>
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %S/Inputs/x86-64-static-tls-<wbr>model1.s -o %t.o<br>
> +# RUN: ld.lld %t.o -o %t1 -shared<br>
> +# RUN: llvm-readobj -dynamic-table %t1 | FileCheck %s<br>
> +<br>
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %S/Inputs/x86-64-static-tls-<wbr>model2.s -o %t.o<br>
> +# RUN: ld.lld %t.o -o %t2 -shared<br>
> +# RUN: llvm-readobj -dynamic-table %t2 | FileCheck %s<br>
</span>> +<br>
> +# CHECK: DynamicSection [<br>
> +# CHECK: FLAGS STATIC_TLS<br>
> Index: test/ELF/tls-initial-exec-<wbr>local.s<br>
> ==============================<wbr>==============================<wbr>=======<br>
> --- test/ELF/tls-initial-exec-<wbr>local.s<br>
> +++ test/ELF/tls-initial-exec-<wbr>local.s<br>
> @@ -10,21 +10,21 @@<br>
>  // CHECK-NEXT:   SHF_ALLOC (0x2)<br>
>  // CHECK-NEXT:   SHF_WRITE (0x1)<br>
>  // CHECK-NEXT: ]<br>
> -// CHECK-NEXT: Address: 0x2090<br>
> +// CHECK-NEXT: Address: 0x20A0<br>
><br>
>  // CHECK:      Relocations [<br>
>  // CHECK-NEXT:   Section ({{.*}}) .rela.dyn {<br>
> -// CHECK-NEXT:     0x2090 R_X86_64_TPOFF64 - 0x0<br>
> -// CHECK-NEXT:     0x2098 R_X86_64_TPOFF64 - 0x4<br>
> +// CHECK-NEXT:     0x20A0 R_X86_64_TPOFF64 - 0x0<br>
> +// CHECK-NEXT:     0x20A8 R_X86_64_TPOFF64 - 0x4<br>
>  // CHECK-NEXT:   }<br>
>  // CHECK-NEXT: ]<br>
><br>
> -// 0x1007 + 4233 = 0x2090<br>
> -// 0x100e + 4234 = 0x2098<br>
> +// 0x1007 + 4249 = 0x20A0<br>
> +// 0x100e + 4250 = 0x20A8<br>
>  // DISASM:      Disassembly of section .text:<br>
>  // DISASM-NEXT: .text:<br>
> -// DISASM-NEXT:  1000: {{.*}} addq      4233(%rip), %rax<br>
> -// DISASM-NEXT:  1007: {{.*}} addq      4234(%rip), %rax<br>
> +// DISASM-NEXT:  1000: {{.*}} addq      4249(%rip), %rax<br>
> +// DISASM-NEXT:  1007: {{.*}} addq      4250(%rip), %rax<br>
><br>
>          addq    foo@GOTTPOFF(%rip), %rax<br>
>          addq    bar@GOTTPOFF(%rip), %rax<br>
> Index: test/ELF/tls-got.s<br>
> ==============================<wbr>==============================<wbr>=======<br>
> --- test/ELF/tls-got.s<br>
> +++ test/ELF/tls-got.s<br>
> @@ -14,7 +14,7 @@<br>
>  // CHECK-NEXT:   SHF_WRITE<br>
>  // CHECK-NEXT: ]<br>
>  // CHECK-NEXT: Address: [[ADDR:.*]]<br>
> -// CHECK-NEXT: Offset: 0x20B0<br>
> +// CHECK-NEXT: Offset: 0x20C0<br>
>  // CHECK-NEXT: Size: 16<br>
>  // CHECK-NEXT: Link: 0<br>
>  // CHECK-NEXT: Info: 0<br>
> @@ -24,22 +24,22 @@<br>
><br>
>  // CHECK:      Relocations [<br>
>  // CHECK-NEXT:   Section (4) .rela.dyn {<br>
> -// CHECK-NEXT:     0x2020B8 R_X86_64_TPOFF64 tls0 0x0<br>
> +// CHECK-NEXT:     0x2020C8 R_X86_64_TPOFF64 tls0 0x0<br>
>  // CHECK-NEXT:     [[ADDR]] R_X86_64_TPOFF64 tls1 0x0<br>
>  // CHECK-NEXT:   }<br>
>  // CHECK-NEXT: ]<br>
><br>
> -//0x201000 + 4249 + 7 = 0x2020B0<br>
> -//0x20100A + 4247 + 7 = 0x2020B8<br>
> -//0x201014 + 4237 + 7 = 0x2020B8<br>
> +//0x201000 + 4281 + 7 = 0x2020C0<br>
> +//0x20100A + 4279 + 7 = 0x2020C8<br>
> +//0x201014 + 4269 + 7 = 0x2020C8<br>
>  //DISASM:      Disassembly of section .text:<br>
>  //DISASM-NEXT: main:<br>
> -//DISASM-NEXT: 201000: 48 8b 05 a9 10 00 00 movq 4265(%rip), %rax<br>
> -//DISASM-NEXT: 201007: 64 8b 00 movl %fs:(%rax), %eax<br>
> -//DISASM-NEXT: 20100a: 48 8b 05 a7 10 00 00 movq 4263(%rip), %rax<br>
> -//DISASM-NEXT: 201011: 64 8b 00 movl %fs:(%rax), %eax<br>
> -//DISASM-NEXT: 201014: 48 8b 05 9d 10 00 00 movq 4253(%rip), %rax<br>
> -//DISASM-NEXT: 20101b: 64 8b 00 movl %fs:(%rax), %eax<br>
> +//DISASM-NEXT: 201000: {{.*}} movq 4281(%rip), %rax<br>
> +//DISASM-NEXT: 201007: {{.*}} movl %fs:(%rax), %eax<br>
> +//DISASM-NEXT: 20100a: {{.*}} movq 4279(%rip), %rax<br>
> +//DISASM-NEXT: 201011: {{.*}} movl %fs:(%rax), %eax<br>
> +//DISASM-NEXT: 201014: {{.*}} movq 4269(%rip), %rax<br>
> +//DISASM-NEXT: 20101b: {{.*}} movl %fs:(%rax), %eax<br>
>  //DISASM-NEXT: 20101e: c3 retq<br>
><br>
>  .section .tdata,"awT",@progbits<br>
> Index: test/ELF/tls-dynamic.s<br>
> ==============================<wbr>==============================<wbr>=======<br>
> --- test/ELF/tls-dynamic.s<br>
> +++ test/ELF/tls-dynamic.s<br>
> @@ -48,39 +48,39 @@<br>
>  // CHECK-NEXT:       SHF_ALLOC<br>
>  // CHECK-NEXT:       SHF_WRITE<br>
>  // CHECK-NEXT:     ]<br>
> -// CHECK-NEXT:     Address: 0x30D0<br>
> +// CHECK-NEXT:     Address: 0x30E0<br>
>  // CHECK-NEXT:     Offset:<br>
>  // CHECK-NEXT:     Size: 40<br>
><br>
>  // CHECK:      Relocations [<br>
>  // CHECK:        Section ({{.+}}) .rela.dyn {<br>
> -// CHECK-NEXT:     0x30D0 R_X86_64_DTPMOD64 - 0x0<br>
> -// CHECK-NEXT:     0x30E0 R_X86_64_DTPMOD64 c 0x0<br>
> -// CHECK-NEXT:     0x30E8 R_X86_64_DTPOFF64 c 0x0<br>
> -// CHECK-NEXT:     0x30F0 R_X86_64_TPOFF64 c 0x0<br>
> +// CHECK-NEXT:     0x30E0 R_X86_64_DTPMOD64 - 0x0<br>
> +// CHECK-NEXT:     0x30F0 R_X86_64_DTPMOD64 c 0x0<br>
> +// CHECK-NEXT:     0x30F8 R_X86_64_DTPOFF64 c 0x0<br>
> +// CHECK-NEXT:     0x3100 R_X86_64_TPOFF64 c 0x0<br>
>  // CHECK-NEXT:   }<br>
><br>
> -// 4297 = (0x20D0 + -4) - (0x1000 + 3) // PC relative offset to got entry.<br>
> -// 4285 = (0x20D0 + -4) - (0x100c + 3) // PC relative offset to got entry.<br>
> -// 4267 = (0x20E0 + -4) - (0x102e + 3) // PC relative offset to got entry.<br>
> -// 4263 = (0x20F0 + -4) - (0x1042 + 3) // PC relative offset to got entry.<br>
> +// 8409 = (0x30E0 + -4) - (0x1000 + 3) // PC relative offset to got entry.<br>
> +// 8397 = (0x30F0 + -4) - (0x100c + 3) // PC relative offset to got entry.<br>
> +// 8379 = (0x30F8 + -4) - (0x102e + 3) // PC relative offset to got entry.<br>
> +// 8375 = (0x3100 + -4) - (0x1042 + 3) // PC relative offset to got entry.<br>
><br>
>  // DIS:      Disassembly of section .text:<br>
>  // DIS-NEXT: .text:<br>
> -// DIS-NEXT:     1000: {{.+}} leaq    8393(%rip), %rdi<br>
> +// DIS-NEXT:     1000: {{.+}} leaq    8409(%rip), %rdi<br>
>  // DIS-NEXT:     1007: {{.+}} callq<br>
> -// DIS-NEXT:     100c: {{.+}} leaq    8381(%rip), %rdi<br>
> +// DIS-NEXT:     100c: {{.+}} leaq    8397(%rip), %rdi<br>
>  // DIS-NEXT:     1013: {{.+}} callq<br>
>  // DIS-NEXT:     1018: {{.+}} leaq    (%rax), %rcx<br>
>  // DIS-NEXT:     101f: {{.+}} leaq    4(%rax), %rcx<br>
>  // DIS-NEXT:     1026: 04 00<br>
>  // DIS-NEXT:     1028: 00 00<br>
>  // DIS-NEXT:     102a: 00 00<br>
>  // DIS-NEXT:     102c: 00 00<br>
> -// DIS-NEXT:     102e: {{.+}} leaq    8363(%rip), %rdi<br>
> +// DIS-NEXT:     102e: {{.+}} leaq    8379(%rip), %rdi<br>
>  // DIS-NEXT:     1035: {{.+}} callq<br>
>  // DIS-NEXT:     103b: {{.+}} leaq    (%rax), %rcx<br>
> -// DIS-NEXT:     1042: {{.+}} movq    8359(%rip), %rax<br>
> +// DIS-NEXT:     1042: {{.+}} movq    8375(%rip), %rax<br>
>  // DIS-NEXT:     1049: {{.+}} movq    %fs:(%rax), %rax<br>
>  // DIS-NEXT:     104d: {{.+}} movabsq $0, %rax<br>
>  // DIS-NEXT:     1057: {{.+}} movabsq $4, %rax<br>
> Index: test/ELF/Inputs/x86-64-static-<wbr>tls-model2.s<br>
> ==============================<wbr>==============================<wbr>=======<br>
> --- test/ELF/Inputs/x86-64-static-<wbr>tls-model2.s<br>
> +++ test/ELF/Inputs/x86-64-static-<wbr>tls-model2.s<br>
> @@ -0,0 +1,6 @@<br>
> +.section ".tdata", "awT", @progbits<br>
> +.globl var<br>
> +var:<br>
> +<br>
> +movq %fs:0, %rax<br>
> +leaq var@TPOFF(%rax),%rax<br>
> Index: test/ELF/Inputs/x86-64-static-<wbr>tls-model1.s<br>
> ==============================<wbr>==============================<wbr>=======<br>
> --- test/ELF/Inputs/x86-64-static-<wbr>tls-model1.s<br>
> +++ test/ELF/Inputs/x86-64-static-<wbr>tls-model1.s<br>
> @@ -0,0 +1,6 @@<br>
> +.section ".tdata", "awT", @progbits<br>
> +.globl var<br>
> +var:<br>
> +<br>
> +movq var@GOTTPOFF(%rip), %rax<br>
> +movl %fs:0(%rax), %eax<br>
> Index: ELF/Target.cpp<br>
> ==============================<wbr>==============================<wbr>=======<br>
> --- ELF/Target.cpp<br>
> +++ ELF/Target.cpp<br>
> @@ -673,6 +673,9 @@<br>
>  template <class ELFT><br>
>  RelExpr X86_64TargetInfo<ELFT>::<wbr>getRelExpr(uint32_t Type, const SymbolBody &S,<br>
>                                             const uint8_t *Loc) const {<br>
> +  if (Type == R_X86_64_GOTTPOFF || Type == R_X86_64_TPOFF32)<br>
> +    Config->HasStaticTlsModel = true;<br>
> +<br>
>    switch (Type) {<br>
>    case R_X86_64_8:<br>
>    case R_X86_64_16:<br>
</blockquote></div><br></div></div>