• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// RUN: llvm-mc -triple=powerpc64le-pc-linux -filetype=obj %s -o - | \
2// RUN: llvm-readobj -r - | FileCheck %s
3
4// RUN: llvm-mc -triple=powerpc64-pc-linux -filetype=obj %s -o - | \
5// RUN: llvm-readobj -r - | FileCheck %s
6
7// Verify we can handle all the dtprel symbol modifiers for local-dynamic tls.
8// Tests a 16 bit offset on both DS-form and D-form instructions, 32 bit
9// adjusted and non-adjusted offsets, and 64 bit adjusted and non-adjusted
10// offsets.
11        .text
12        .abiversion 2
13
14        .globl	short_offset
15        .p2align	4
16        .type	short_offset,@function
17short_offset:
18.Lfunc_gep0:
19        addis 2, 12, .TOC.-.Lfunc_gep0@ha
20        addi 2, 2, .TOC.-.Lfunc_gep0@l
21.Lfunc_lep0:
22.localentry	short_offset, .Lfunc_lep0-.Lfunc_gep0
23        mflr 0
24        std 0, 16(1)
25        stdu 1, -32(1)
26        addis 3, 2, i@got@tlsld@ha
27        addi 3, 3, i@got@tlsld@l
28        bl __tls_get_addr(i@tlsld)
29        nop
30        lwa 4, i@dtprel(3)
31        addi 5, 3, i@dtprel
32        lwa 3, 0(5)
33        add 3, 4, 3
34        addi 1, 1, 32
35        ld 0, 16(1)
36        mtlr 0
37        blr
38
39        .globl	medium_offset
40        .p2align	4
41        .type	medium_offset,@function
42medium_offset:
43.Lfunc_gep1:
44        addis 2, 12, .TOC.-.Lfunc_gep1@ha
45        addi 2, 2, .TOC.-.Lfunc_gep1@l
46.Lfunc_lep1:
47        .localentry	medium_offset, .Lfunc_lep1-.Lfunc_gep1
48        mflr 0
49        std 0, 16(1)
50        stdu 1, -32(1)
51        addis 3, 2, i@got@tlsld@ha
52        addi 3, 3, i@got@tlsld@l
53        bl __tls_get_addr(i@tlsld)
54        nop
55        addis 3, 3, i@dtprel@ha
56        lwa 3, i@dtprel@l(3)
57        addi 1, 1, 32
58        ld 0, 16(1)
59        mtlr 0
60        blr
61
62        .globl  medium_not_adjusted
63        .p2align        4
64        .type   medium_not_adjusted,@function
65medium_not_adjusted:
66.Lfunc_gep2:
67        addis 2, 12, .TOC.-.Lfunc_gep2@ha
68        addi 2, 2, .TOC.-.Lfunc_gep2@l
69.Lfunc_lep2:
70        .localentry     medium_not_adjusted, .Lfunc_lep2-.Lfunc_gep2
71        mflr 0
72        std 0, 16(1)
73        stdu 1, -32(1)
74        addis 3, 2, i@got@tlsld@ha
75        addi 3, 3, i@got@tlsld@l
76        bl __tls_get_addr(i@tlsld)
77        nop
78        lis 4, i@dtprel@h
79        ori 4, 4, i@dtprel@l
80        add 3, 3, 4
81        addi 1, 1, 32
82        ld 0, 16(1)
83        mtlr 0
84        blr
85
86        .globl	large_offset
87        .p2align	4
88        .type	large_offset,@function
89large_offset:
90.Lfunc_gep3:
91        addis 2, 12, .TOC.-.Lfunc_gep3@ha
92        addi 2, 2, .TOC.-.Lfunc_gep3@l
93.Lfunc_lep3:
94        .localentry	large_offset, .Lfunc_lep3-.Lfunc_gep3
95        mflr 0
96        std 0, 16(1)
97        stdu 1, -32(1)
98        addis 3, 2, i@got@tlsld@ha
99        addi 3, 3, i@got@tlsld@l
100        bl __tls_get_addr(i@tlsld)
101        nop
102        lis 4, i@dtprel@highesta
103        ori 4, 4, i@dtprel@highera
104        sldi 4, 4, 32
105        addis 4, 4, i@dtprel@higha
106        addi  4, 4, i@dtprel@l
107        lwax 3, 4, 3
108        addi 1, 1, 32
109        ld 0, 16(1)
110        mtlr 0
111        blr
112
113         .globl not_adjusted
114         .p2align       4
115         .type not_adjusted,@function
116not_adjusted:
117.Lfunc_gep4:
118        addis 2, 12, .TOC.-.Lfunc_gep4@ha
119        addi 2, 2, .TOC.-.Lfunc_gep4@l
120.Lfunc_lep4:
121        .localentry	not_adjusted, .Lfunc_lep4-.Lfunc_gep4
122        mflr 0
123        std 0, 16(1)
124        stdu 1, -32(1)
125        addis 3, 2, i@got@tlsld@ha
126        addi 3, 3, i@got@tlsld@l
127        bl __tls_get_addr(i@tlsld)
128        nop
129        lis 4, i@dtprel@highest
130        ori 4, 4, i@dtprel@higher
131        sldi 4, 4, 32
132        oris 4, 4, i@dtprel@high
133        ori  4, 4, i@dtprel@l
134        lwax 3, 4, 3
135        addi 1, 1, 32
136        ld 0, 16(1)
137        mtlr 0
138        blr
139
140        .type	i,@object
141        .section	.tdata,"awT",@progbits
142        .p2align	2
143i:
144        .long	55
145        .size	i, 4
146
147        .type j,@object
148        .data
149        .p2align        3
150j:
151        .quad i@dtprel
152        .size j, 8
153
154# CHECK: Relocations [
155# CHECK:   Section {{.*}} .rela.text {
156# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_GOT_TLSLD16_HA i
157# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_GOT_TLSLD16_LO i
158# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_TLSLD i
159# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_REL24 __tls_get_addr
160# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_DS i
161# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16 i
162# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_HA i
163# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_LO_DS i
164# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_HI i
165# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_HIGHESTA i
166# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_HIGHERA i
167# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_HIGHA i
168# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_LO i
169# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_HIGHEST i
170# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_HIGHER i
171# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_HIGH i
172# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL16_LO i
173# CHECK: }
174# CHECK: Section {{.*}} .rela.data {
175# CHECK: 0x{{[0-9A-F]+}}  R_PPC64_DTPREL64 i
176# CHECK:   }
177# CHECK: ]
178