|  | // REQUIRES: x86 | 
|  | // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t | 
|  | // RUN: ld.lld --hash-style=sysv -shared %t -o %tout | 
|  | // RUN: llvm-readobj -sections -relocations %tout | FileCheck %s | 
|  | // RUN: llvm-objdump -d %tout | FileCheck %s --check-prefix=DIS | 
|  |  | 
|  | leaq  a@tlsld(%rip), %rdi | 
|  | callq __tls_get_addr@PLT | 
|  | leaq  b@tlsld(%rip), %rdi | 
|  | callq __tls_get_addr@PLT | 
|  | leaq  a@dtpoff(%rax), %rcx | 
|  | leaq  b@dtpoff(%rax), %rcx | 
|  | .long b@dtpoff, 0 | 
|  | leaq  c@tlsgd(%rip), %rdi | 
|  | rex64 | 
|  | callq __tls_get_addr@PLT | 
|  | leaq  a@dtpoff(%rax), %rcx | 
|  | // Initial Exec Model Code Sequence, II | 
|  | movq c@gottpoff(%rip),%rax | 
|  | movq %fs:(%rax),%rax | 
|  | movabs $a@dtpoff, %rax | 
|  | movabs $b@dtpoff, %rax | 
|  | movabs $a@dtpoff, %rax | 
|  |  | 
|  | .global a | 
|  | .hidden a | 
|  | .section .tbss,"awT",@nobits | 
|  | .align 4 | 
|  | a: | 
|  | .long 0 | 
|  |  | 
|  | .section .tbss,"awT",@nobits | 
|  | .align 4 | 
|  | b: | 
|  | .long 0 | 
|  | .global c | 
|  | .section .tbss,"awT",@nobits | 
|  | .align 4 | 
|  | c: | 
|  | .long 0 | 
|  |  | 
|  | // Get the address of the got, and check that it has 4 entries. | 
|  |  | 
|  | // CHECK:      Sections [ | 
|  | // CHECK:          Name: .got ( | 
|  | // CHECK-NEXT:     Type: SHT_PROGBITS | 
|  | // CHECK-NEXT:     Flags [ | 
|  | // CHECK-NEXT:       SHF_ALLOC | 
|  | // CHECK-NEXT:       SHF_WRITE | 
|  | // CHECK-NEXT:     ] | 
|  | // CHECK-NEXT:     Address: 0x30D0 | 
|  | // CHECK-NEXT:     Offset: | 
|  | // CHECK-NEXT:     Size: 40 | 
|  |  | 
|  | // CHECK:      Relocations [ | 
|  | // CHECK:        Section ({{.+}}) .rela.dyn { | 
|  | // CHECK-NEXT:     0x30D0 R_X86_64_DTPMOD64 - 0x0 | 
|  | // CHECK-NEXT:     0x30E0 R_X86_64_DTPMOD64 c 0x0 | 
|  | // CHECK-NEXT:     0x30E8 R_X86_64_DTPOFF64 c 0x0 | 
|  | // CHECK-NEXT:     0x30F0 R_X86_64_TPOFF64 c 0x0 | 
|  | // CHECK-NEXT:   } | 
|  |  | 
|  | // 4297 = (0x20D0 + -4) - (0x1000 + 3) // PC relative offset to got entry. | 
|  | // 4285 = (0x20D0 + -4) - (0x100c + 3) // PC relative offset to got entry. | 
|  | // 4267 = (0x20E0 + -4) - (0x102e + 3) // PC relative offset to got entry. | 
|  | // 4263 = (0x20F0 + -4) - (0x1042 + 3) // PC relative offset to got entry. | 
|  |  | 
|  | // DIS:      Disassembly of section .text: | 
|  | // DIS-NEXT: .text: | 
|  | // DIS-NEXT:     1000: {{.+}} leaq    8393(%rip), %rdi | 
|  | // DIS-NEXT:     1007: {{.+}} callq | 
|  | // DIS-NEXT:     100c: {{.+}} leaq    8381(%rip), %rdi | 
|  | // DIS-NEXT:     1013: {{.+}} callq | 
|  | // DIS-NEXT:     1018: {{.+}} leaq    (%rax), %rcx | 
|  | // DIS-NEXT:     101f: {{.+}} leaq    4(%rax), %rcx | 
|  | // DIS-NEXT:     1026: 04 00 | 
|  | // DIS-NEXT:     1028: 00 00 | 
|  | // DIS-NEXT:     102a: 00 00 | 
|  | // DIS-NEXT:     102c: 00 00 | 
|  | // DIS-NEXT:     102e: {{.+}} leaq    8363(%rip), %rdi | 
|  | // DIS-NEXT:     1035: {{.+}} callq | 
|  | // DIS-NEXT:     103b: {{.+}} leaq    (%rax), %rcx | 
|  | // DIS-NEXT:     1042: {{.+}} movq    8359(%rip), %rax | 
|  | // DIS-NEXT:     1049: {{.+}} movq    %fs:(%rax), %rax | 
|  | // DIS-NEXT:     104d: {{.+}} movabsq $0, %rax | 
|  | // DIS-NEXT:     1057: {{.+}} movabsq $4, %rax | 
|  | // DIS-NEXT:     1061: {{.+}} movabsq $0, %rax |