xref: /llvm-project/lld/test/ELF/mips-tls-64.s (revision 75cdab6dc2453a508157a9c383b93373a93078d6)
1# REQUIRES: mips
2# Check MIPS TLS 64-bit relocations handling.
3
4# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux \
5# RUN:         %p/Inputs/mips-tls.s -o %t.so.o
6# RUN: ld.lld -shared %t.so.o -soname=t.so -o %t.so
7# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux %s -o %t.o
8
9# RUN: echo "SECTIONS { \
10# RUN:         . = 0x10000; .text : { *(.text) } \
11# RUN:         . = 0x30000; .got  : { *(.got)  } \
12# RUN:       }" > %t.script
13
14# RUN: ld.lld %t.o %t.so -script %t.script -o %t.exe
15# RUN: llvm-objdump --no-print-imm-hex -d -s -t --no-show-raw-insn %t.exe \
16# RUN:   | FileCheck -check-prefix=DIS %s
17# RUN: llvm-readobj -r -A %t.exe | FileCheck %s
18
19# RUN: ld.lld -pie %t.o %t.so -script %t.script -o %t.pie
20# RUN: llvm-objdump --no-print-imm-hex -d -s -t --no-show-raw-insn %t.pie \
21# RUN:   | FileCheck -check-prefix=DIS %s
22# RUN: llvm-readobj -r -A %t.pie | FileCheck %s
23
24# RUN: ld.lld -shared %t.o %t.so -script %t.script -o %t-out.so
25# RUN: llvm-objdump --no-print-imm-hex -d -s -t --no-show-raw-insn %t-out.so \
26# RUN:   | FileCheck -check-prefix=DIS-SO %s
27# RUN: llvm-readobj -r -A %t-out.so | FileCheck -check-prefix=SO %s
28
29# DIS: 0000000000000000 l       .tdata  0000000000000000 loc
30# DIS: 0000000000000000         *UND*   0000000000000000 foo
31# DIS: 0000000000000004 g       .tdata  0000000000000000 bar
32
33# DIS:      Contents of section .got:
34# DIS-NEXT:  30000 00000000 00000000 80000000 00000000
35# DIS-NEXT:  30010 00000000 00000000 ffffffff ffff9000
36# DIS-NEXT:  30020 ffffffff ffff9004 00000000 00000000
37# DIS-NEXT:  30030 00000000 00000000 00000000 00000001
38# DIS-NEXT:  30040 00000000 00000000 00000000 00000001
39# DIS-NEXT:  30050 ffffffff ffff8004
40
41# DIS:      <__start>:
42# DIS-NEXT:    addiu   $2, $3, -32712
43# DIS-NEXT:    addiu   $2, $3, -32736
44# DIS-NEXT:    addiu   $2, $3, -32696
45# DIS-NEXT:    addiu   $2, $3, -32728
46# DIS-NEXT:    addiu   $2, $3, -32680
47# DIS-NEXT:    addiu   $2, $3, -32720
48
49# CHECK:      Relocations [
50# CHECK-NEXT:   Section (7) .rel.dyn {
51# CHECK-NEXT:     0x30010 R_MIPS_TLS_TPREL64/R_MIPS_NONE/R_MIPS_NONE foo
52# CHECK-NEXT:     0x30028 R_MIPS_TLS_DTPMOD64/R_MIPS_NONE/R_MIPS_NONE foo
53# CHECK-NEXT:     0x30030 R_MIPS_TLS_DTPREL64/R_MIPS_NONE/R_MIPS_NONE foo
54# CHECK-NEXT:   }
55# CHECK-NEXT: ]
56# CHECK:      Primary GOT {
57# CHECK-NEXT:   Canonical gp value: 0x37FF0
58# CHECK-NEXT:   Reserved entries [
59# CHECK:        ]
60# CHECK-NEXT:   Local entries [
61# CHECK-NEXT:   ]
62# CHECK-NEXT:   Global entries [
63# CHECK-NEXT:   ]
64# CHECK-NEXT:   Number of TLS and multi-GOT entries: 9
65#               ^-- -32736 R_MIPS_TLS_GOTTPREL R_MIPS_TLS_TPREL64  foo
66#               ^-- -32728 R_MIPS_TLS_GOTTPREL VA - 0x7000 loc
67#               ^-- -32720 R_MIPS_TLS_GOTTPREL VA - 0x7000 bar
68#               ^-- -32712 R_MIPS_TLS_GD       R_MIPS_TLS_DTPMOD64 foo
69#               ^-- -32704                     R_MIPS_TLS_DTPREL64 foo
70#               ^-- -32696 R_MIPS_TLS_LDM      1 loc
71#               ^-- -32688                     0 loc
72#               ^-- -32680 R_MIPS_TLS_GD       1 bar
73#               ^-- -32672                     VA - 0x8000 bar
74
75# DIS-SO:      Contents of section .got:
76# DIS-SO-NEXT:  30000 00000000 00000000 80000000 00000000
77# DIS-SO-NEXT:  30010 00000000 00000000 00000000 00000000
78# DIS-SO-NEXT:  30020 00000000 00000004 00000000 00000000
79# DIS-SO-NEXT:  30030 00000000 00000000 00000000 00000000
80# DIS-SO-NEXT:  30040 00000000 00000000 00000000 00000000
81# DIS-SO-NEXT:  30050 00000000 00000000
82
83# SO:      Relocations [
84# SO-NEXT:   Section (7) .rel.dyn {
85# SO-NEXT:     0x30018 R_MIPS_TLS_TPREL64/R_MIPS_NONE/R_MIPS_NONE -
86# SO-NEXT:     0x30038 R_MIPS_TLS_DTPMOD64/R_MIPS_NONE/R_MIPS_NONE -
87# SO-NEXT:     0x30010 R_MIPS_TLS_TPREL64/R_MIPS_NONE/R_MIPS_NONE foo
88# SO-NEXT:     0x30028 R_MIPS_TLS_DTPMOD64/R_MIPS_NONE/R_MIPS_NONE foo
89# SO-NEXT:     0x30030 R_MIPS_TLS_DTPREL64/R_MIPS_NONE/R_MIPS_NONE foo
90# SO-NEXT:     0x30020 R_MIPS_TLS_TPREL64/R_MIPS_NONE/R_MIPS_NONE bar
91# SO-NEXT:     0x30048 R_MIPS_TLS_DTPMOD64/R_MIPS_NONE/R_MIPS_NONE bar
92# SO-NEXT:     0x30050 R_MIPS_TLS_DTPREL64/R_MIPS_NONE/R_MIPS_NONE bar
93# SO-NEXT:   }
94# SO-NEXT: ]
95# SO:      Primary GOT {
96# SO-NEXT:   Canonical gp value: 0x37FF0
97# SO-NEXT:   Reserved entries [
98# SO:        ]
99# SO-NEXT:   Local entries [
100# SO-NEXT:   ]
101# SO-NEXT:   Global entries [
102# SO-NEXT:   ]
103# SO-NEXT:   Number of TLS and multi-GOT entries: 9
104#            ^-- -32736 R_MIPS_TLS_GOTTPREL R_MIPS_TLS_TPREL64  foo
105#            ^-- -32728 R_MIPS_TLS_GOTTPREL R_MIPS_TLS_TPREL64  loc
106#            ^-- -32720 R_MIPS_TLS_GOTTPREL R_MIPS_TLS_TPREL64  bar
107#            ^-- -32712 R_MIPS_TLS_GD       R_MIPS_TLS_DTPMOD64 foo
108#            ^-- -32704                     R_MIPS_TLS_DTPREL64 foo
109#            ^-- -32696 R_MIPS_TLS_LDM      R_MIPS_TLS_DTPMOD64 loc
110#            ^-- -32688                     0 loc
111#            ^-- -32680 R_MIPS_TLS_GD       R_MIPS_TLS_DTPMOD64 bar
112#            ^-- -32672                     R_MIPS_TLS_DTPREL64 bar
113
114  .text
115  .global  __start
116__start:
117  addiu $2, $3, %tlsgd(foo)     # R_MIPS_TLS_GD
118  addiu $2, $3, %gottprel(foo)  # R_MIPS_TLS_GOTTPREL
119  addiu $2, $3, %tlsldm(loc)    # R_MIPS_TLS_LDM
120  addiu $2, $3, %gottprel(loc)  # R_MIPS_TLS_GOTTPREL
121  addiu $2, $3, %tlsgd(bar)     # R_MIPS_TLS_GD
122  addiu $2, $3, %gottprel(bar)  # R_MIPS_TLS_GOTTPREL
123
124 .section .tdata,"awT",%progbits
125 .global bar
126loc:
127 .word 0
128bar:
129 .word 0
130