1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
// REQUIRES: x86
// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
// RUN: ld.lld %t.o -o %t1
// RUN: llvm-readobj -r %t1 | FileCheck --check-prefix=NORELOC %s
// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn %t1 | FileCheck --check-prefix=DISASM %s
// NORELOC: Relocations [
// NORELOC-NEXT: ]
// DISASM: <_start>:
// DISASM-NEXT: movq $-8, %rax
// DISASM-NEXT: movq $-8, %r15
// DISASM-NEXT: leaq -8(%rax), %rax
// DISASM-NEXT: leaq -8(%r15), %r15
// DISASM-NEXT: addq $-8, %rsp
// DISASM-NEXT: addq $-8, %r12
// DISASM-NEXT: movq $-4, %rax
// DISASM-NEXT: movq $-4, %r15
// DISASM-NEXT: leaq -4(%rax), %rax
// DISASM-NEXT: leaq -4(%r15), %r15
// DISASM-NEXT: addq $-4, %rsp
// DISASM-NEXT: addq $-4, %r12
# EGPR
// DISASM-NEXT: movq $-8, %r16
// DISASM-NEXT: movq $-8, %r20
// DISASM-NEXT: movq $-4, %r16
// DISASM-NEXT: addq $-8, %r16
// DISASM-NEXT: addq $-8, %r28
// DISASM-NEXT: addq $-4, %r16
# NDD
// DISASM-NEXT: addq $-8, %r16, %r16
// DISASM-NEXT: addq $-8, %r16, %r20
// DISASM-NEXT: addq $-8, %r16, %rax
// DISASM-NEXT: addq $-8, %rax, %r16
// DISASM-NEXT: addq $-8, %r8, %r16
// DISASM-NEXT: addq $-8, %rax, %r12
# NDD + NF
// DISASM-NEXT: {nf} addq $-8, %r8, %r16
// DISASM-NEXT: {nf} addq $-8, %rax, %r12
# NF
// DISASM-NEXT: {nf} addq $-8, %r12
// LD to LE:
// DISASM-NEXT: movq %fs:0, %rax
// DISASM-NEXT: leaq -8(%rax), %rcx
// DISASM-NEXT: movq %fs:0, %rax
// DISASM-NEXT: leaq -4(%rax), %rcx
// GD to LE:
// DISASM-NEXT: movq %fs:0, %rax
// DISASM-NEXT: leaq -8(%rax), %rax
// DISASM-NEXT: movq %fs:0, %rax
// DISASM-NEXT: leaq -4(%rax), %rax
// LD to LE:
// DISASM: <_DTPOFF64_1>:
// DISASM-NEXT: clc
// DISASM: <_DTPOFF64_2>:
// DISASM-NEXT: cld
.type tls0,@object
.section .tbss,"awT",@nobits
.globl tls0
.align 4
tls0:
.long 0
.size tls0, 4
.type tls1,@object
.globl tls1
.align 4
tls1:
.long 0
.size tls1, 4
.section .text
.globl _start
_start:
movq tls0@GOTTPOFF(%rip), %rax
movq tls0@GOTTPOFF(%rip), %r15
addq tls0@GOTTPOFF(%rip), %rax
addq tls0@GOTTPOFF(%rip), %r15
addq tls0@GOTTPOFF(%rip), %rsp
addq tls0@GOTTPOFF(%rip), %r12
movq tls1@GOTTPOFF(%rip), %rax
movq tls1@GOTTPOFF(%rip), %r15
addq tls1@GOTTPOFF(%rip), %rax
addq tls1@GOTTPOFF(%rip), %r15
addq tls1@GOTTPOFF(%rip), %rsp
addq tls1@GOTTPOFF(%rip), %r12
# EGPR
movq tls0@GOTTPOFF(%rip), %r16
movq tls0@GOTTPOFF(%rip), %r20
movq tls1@GOTTPOFF(%rip), %r16
addq tls0@GOTTPOFF(%rip), %r16
addq tls0@GOTTPOFF(%rip), %r28
addq tls1@GOTTPOFF(%rip), %r16
# NDD
addq tls0@GOTTPOFF(%rip), %r16, %r16
addq tls0@GOTTPOFF(%rip), %r16, %r20
addq tls0@GOTTPOFF(%rip), %r16, %rax
addq tls0@GOTTPOFF(%rip), %rax, %r16
addq %r8, tls0@GOTTPOFF(%rip), %r16
addq tls0@GOTTPOFF(%rip), %rax, %r12
# NDD + NF
{nf} addq %r8, tls0@GOTTPOFF(%rip), %r16
{nf} addq tls0@GOTTPOFF(%rip), %rax, %r12
# NF
{nf} addq tls0@GOTTPOFF(%rip), %r12
// LD to LE
leaq tls0@tlsld(%rip), %rdi
callq __tls_get_addr@PLT
leaq tls0@dtpoff(%rax),%rcx
leaq tls1@tlsld(%rip), %rdi
callq __tls_get_addr@PLT
leaq tls1@dtpoff(%rax),%rcx
// GD to LE
.byte 0x66
leaq tls0@tlsgd(%rip),%rdi
.word 0x6666
rex64
call __tls_get_addr@plt
.byte 0x66
leaq tls1@tlsgd(%rip),%rdi
.word 0x6666
rex64
call __tls_get_addr@plt
// LD to LE
_DTPOFF64_1:
.quad tls0@DTPOFF
nop
_DTPOFF64_2:
.quad tls1@DTPOFF
nop
|