• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// REQUIRES: x86
2
3// Checks whether the TLS optimizations match the cases in Chapter 11 of
4// https://raw.githubusercontent.com/wiki/hjl-tools/x86-psABI/x86-64-psABI-1.0.pdf
5
6// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
7// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/tls-opt-gdie.s -o %tso.o
8// RUN: ld.lld -shared %tso.o -soname=t.so -o %t.so
9// RUN: ld.lld %t.o %t.so -o %t1
10// RUN: llvm-readobj -r %t1 | FileCheck --check-prefix=RELOC %s
11// RUN: llvm-objdump -d --no-show-raw-insn %t1 | FileCheck --check-prefix=DISASM %s
12
13// RELOC:      Relocations [
14// RELOC-NEXT:  Section {{.*}} .rela.dyn {
15// RELOC-NEXT:    0x202420 R_X86_64_TPOFF64 tlsshared0 0x0
16// RELOC-NEXT:    0x202428 R_X86_64_TPOFF64 tlsshared1 0x0
17// RELOC-NEXT:  }
18// RELOC-NEXT: ]
19
20// DISASM:      <_start>:
21
22// Table 11.5: GD -> IE Code Transition (LP64)
23// DISASM-NEXT:               movq %fs:0, %rax
24// DISASM-NEXT: 201309:       addq 4368(%rip), %rax
25// DISASM-NEXT:               movq %fs:0, %rax
26// DISASM-NEXT: 201319:       addq 4360(%rip), %rax
27
28// Table 11.7: GD -> LE Code Transition (LP64)
29// DISASM-NEXT:               movq %fs:0, %rax
30// DISASM-NEXT:               leaq -8(%rax), %rax
31// DISASM-NEXT:               movq %fs:0, %rax
32// DISASM-NEXT:               leaq -4(%rax), %rax
33
34
35// Table 11.9: LD -> LE Code Transition (LP64)
36// DISASM-NEXT:               movq %fs:0, %rax
37// DISASM-NEXT:               movq %fs:0, %rax
38
39.type tls0,@object
40.section .tbss,"awT",@nobits
41.globl tls0
42.align 4
43tls0:
44 .long 0
45 .size tls0, 4
46
47.type  tls1,@object
48.globl tls1
49.align 4
50tls1:
51 .long 0
52 .size tls1, 4
53
54.section .text
55.globl _start
56_start:
57 // Table 11.5: GD -> IE Code Transition (LP64)
58 .byte  0x66
59 leaq   tlsshared0@tlsgd(%rip),%rdi
60 .byte  0x66
61 rex64
62 call   *__tls_get_addr@GOTPCREL(%rip)
63
64 .byte  0x66
65 leaq   tlsshared1@tlsgd(%rip),%rdi
66 .byte  0x66
67 rex64
68 call   *__tls_get_addr@GOTPCREL(%rip)
69
70 // Table 11.7: GD -> LE Code Transition (LP64)
71 .byte  0x66
72 leaq   tls0@tlsgd(%rip),%rdi
73 .byte  0x66
74 rex64
75 call   *__tls_get_addr@GOTPCREL(%rip)
76
77 .byte  0x66
78 leaq   tls1@tlsgd(%rip),%rdi
79 .byte  0x66
80 rex64
81 call   *__tls_get_addr@GOTPCREL(%rip)
82
83 // Table 11.9: LD -> LE Code Transition (LP64)
84 leaq   tls0@tlsld(%rip),%rdi
85 call   *__tls_get_addr@GOTPCREL(%rip)
86
87 leaq   tls1@tlsld(%rip),%rdi
88 call   *__tls_get_addr@GOTPCREL(%rip)
89