1// REQUIRES: x86
2// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
3// RUN: ld.lld --hash-style=sysv -shared %t -o %tout
4// RUN: llvm-readobj --sections -r %tout | FileCheck %s
5// RUN: llvm-objdump -d %tout | FileCheck %s --check-prefix=DIS
6
7  leaq  a@tlsld(%rip), %rdi
8  callq __tls_get_addr@PLT
9  leaq  b@tlsld(%rip), %rdi
10  callq __tls_get_addr@PLT
11  leaq  a@dtpoff(%rax), %rcx
12  leaq  b@dtpoff(%rax), %rcx
13  .long b@dtpoff, 0
14  leaq  c@tlsgd(%rip), %rdi
15  rex64
16  callq __tls_get_addr@PLT
17  leaq  a@dtpoff(%rax), %rcx
18  // Initial Exec Model Code Sequence, II
19  movq c@gottpoff(%rip),%rax
20  movq %fs:(%rax),%rax
21  movabs $a@dtpoff, %rax
22  movabs $b@dtpoff, %rax
23  movabs $a@dtpoff, %rax
24
25  .global a
26  .hidden a
27  .section .tbss,"awT",@nobits
28  .align 4
29a:
30  .long 0
31
32  .section .tbss,"awT",@nobits
33  .align 4
34b:
35  .long 0
36  .global c
37  .section .tbss,"awT",@nobits
38  .align 4
39c:
40  .long 0
41
42// Get the address of the got, and check that it has 4 entries.
43
44// CHECK:      Sections [
45// CHECK:          Name: .got (
46// CHECK-NEXT:     Type: SHT_PROGBITS
47// CHECK-NEXT:     Flags [
48// CHECK-NEXT:       SHF_ALLOC
49// CHECK-NEXT:       SHF_WRITE
50// CHECK-NEXT:     ]
51// CHECK-NEXT:     Address: 0x24A0
52// CHECK-NEXT:     Offset:
53// CHECK-NEXT:     Size: 40
54
55// CHECK:      Relocations [
56// CHECK:        Section ({{.+}}) .rela.dyn {
57// CHECK-NEXT:     0x24A0 R_X86_64_DTPMOD64 - 0x0
58// CHECK-NEXT:     0x24B0 R_X86_64_DTPMOD64 c 0x0
59// CHECK-NEXT:     0x24B8 R_X86_64_DTPOFF64 c 0x0
60// CHECK-NEXT:     0x24C0 R_X86_64_TPOFF64 c 0x0
61// CHECK-NEXT:   }
62
63// 4457 = (0x24A0 + -4) - (0x1330 + 3) // PC relative offset to got entry.
64// 4445 = (0x24B0 + -4) - (0x133c + 3) // PC relative offset to got entry.
65// 4427 = (0x24B8 + -4) - (0x135e + 3) // PC relative offset to got entry.
66// 4423 = (0x24C0 + -4) - (0x1372 + 3) // PC relative offset to got entry.
67
68// DIS:      Disassembly of section .text:
69// DIS-EMPTY:
70// DIS-NEXT: <.text>:
71// DIS-NEXT:     1330: {{.+}} leaq    4457(%rip), %rdi
72// DIS-NEXT:           {{.+}} callq
73// DIS-NEXT:     133c: {{.+}} leaq    4445(%rip), %rdi
74// DIS-NEXT:           {{.+}} callq
75// DIS-NEXT:           {{.+}} leaq    (%rax), %rcx
76// DIS-NEXT:           {{.+}} leaq    4(%rax), %rcx
77// DIS-NEXT:           04 00
78// DIS-NEXT:           00 00
79// DIS-NEXT:           00 00
80// DIS-NEXT:           00 00
81// DIS-NEXT:     135e: {{.+}} leaq    4427(%rip), %rdi
82// DIS-NEXT:           {{.+}} callq
83// DIS-NEXT:           {{.+}} leaq    (%rax), %rcx
84// DIS-NEXT:     1372: {{.+}} movq    4423(%rip), %rax
85// DIS-NEXT:           {{.+}} movq    %fs:(%rax), %rax
86// DIS-NEXT:           {{.+}} movabsq $0, %rax
87// DIS-NEXT:           {{.+}} movabsq $4, %rax
88// DIS-NEXT:           {{.+}} movabsq $0, %rax
89