Skip to content

Commit cac28ae

Browse files
author
Sean Fertile
committedJun 15, 2018
[PowerPC] Add support for high and higha symbol modifiers on tls modifers.
Enables using the high and high-adjusted symbol modifiers on thread local storage modifers in powerpc assembly. Needed to be able to support 64 bit thread-pointer and dynamic-thread-pointer access sequences. Differential Revision: https://reviews.llvm.org/D47754 llvm-svn: 334856
1 parent 80b8f82 commit cac28ae

File tree

8 files changed

+349
-1
lines changed

8 files changed

+349
-1
lines changed
 

‎llvm/include/llvm/BinaryFormat/ELFRelocs/PowerPC64.def

+8
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@
9191
#undef R_PPC64_TLSLD
9292
#undef R_PPC64_ADDR16_HIGH
9393
#undef R_PPC64_ADDR16_HIGHA
94+
#undef R_PPC64_TPREL16_HIGH
95+
#undef R_PPC64_TPREL16_HIGHA
96+
#undef R_PPC64_DTPREL16_HIGH
97+
#undef R_PPC64_DTPREL16_HIGHA
9498
#undef R_PPC64_IRELATIVE
9599
#undef R_PPC64_REL16
96100
#undef R_PPC64_REL16_LO
@@ -180,6 +184,10 @@ ELF_RELOC(R_PPC64_TLSGD, 107)
180184
ELF_RELOC(R_PPC64_TLSLD, 108)
181185
ELF_RELOC(R_PPC64_ADDR16_HIGH, 110)
182186
ELF_RELOC(R_PPC64_ADDR16_HIGHA, 111)
187+
ELF_RELOC(R_PPC64_TPREL16_HIGH, 112)
188+
ELF_RELOC(R_PPC64_TPREL16_HIGHA, 113)
189+
ELF_RELOC(R_PPC64_DTPREL16_HIGH, 114)
190+
ELF_RELOC(R_PPC64_DTPREL16_HIGHA, 115)
183191
ELF_RELOC(R_PPC64_IRELATIVE, 248)
184192
ELF_RELOC(R_PPC64_REL16, 249)
185193
ELF_RELOC(R_PPC64_REL16_LO, 250)

‎llvm/include/llvm/MC/MCExpr.h

+4
Original file line numberDiff line numberDiff line change
@@ -236,13 +236,17 @@ class MCSymbolRefExpr : public MCExpr {
236236
VK_PPC_TPREL_LO, // symbol@tprel@l
237237
VK_PPC_TPREL_HI, // symbol@tprel@h
238238
VK_PPC_TPREL_HA, // symbol@tprel@ha
239+
VK_PPC_TPREL_HIGH, // symbol@tprel@high
240+
VK_PPC_TPREL_HIGHA, // symbol@tprel@higha
239241
VK_PPC_TPREL_HIGHER, // symbol@tprel@higher
240242
VK_PPC_TPREL_HIGHERA, // symbol@tprel@highera
241243
VK_PPC_TPREL_HIGHEST, // symbol@tprel@highest
242244
VK_PPC_TPREL_HIGHESTA, // symbol@tprel@highesta
243245
VK_PPC_DTPREL_LO, // symbol@dtprel@l
244246
VK_PPC_DTPREL_HI, // symbol@dtprel@h
245247
VK_PPC_DTPREL_HA, // symbol@dtprel@ha
248+
VK_PPC_DTPREL_HIGH, // symbol@dtprel@high
249+
VK_PPC_DTPREL_HIGHA, // symbol@dtprel@higha
246250
VK_PPC_DTPREL_HIGHER, // symbol@dtprel@higher
247251
VK_PPC_DTPREL_HIGHERA, // symbol@dtprel@highera
248252
VK_PPC_DTPREL_HIGHEST, // symbol@dtprel@highest

‎llvm/lib/MC/MCELFStreamer.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -411,13 +411,17 @@ void MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
411411
case MCSymbolRefExpr::VK_PPC_TPREL_LO:
412412
case MCSymbolRefExpr::VK_PPC_TPREL_HI:
413413
case MCSymbolRefExpr::VK_PPC_TPREL_HA:
414+
case MCSymbolRefExpr::VK_PPC_TPREL_HIGH:
415+
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHA:
414416
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER:
415417
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA:
416418
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST:
417419
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA:
418420
case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
419421
case MCSymbolRefExpr::VK_PPC_DTPREL_HI:
420422
case MCSymbolRefExpr::VK_PPC_DTPREL_HA:
423+
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGH:
424+
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHA:
421425
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER:
422426
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA:
423427
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST:

‎llvm/lib/MC/MCExpr.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -257,13 +257,17 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
257257
case VK_PPC_TPREL_LO: return "tprel@l";
258258
case VK_PPC_TPREL_HI: return "tprel@h";
259259
case VK_PPC_TPREL_HA: return "tprel@ha";
260+
case VK_PPC_TPREL_HIGH: return "tprel@high";
261+
case VK_PPC_TPREL_HIGHA: return "tprel@higha";
260262
case VK_PPC_TPREL_HIGHER: return "tprel@higher";
261263
case VK_PPC_TPREL_HIGHERA: return "tprel@highera";
262264
case VK_PPC_TPREL_HIGHEST: return "tprel@highest";
263265
case VK_PPC_TPREL_HIGHESTA: return "tprel@highesta";
264266
case VK_PPC_DTPREL_LO: return "dtprel@l";
265267
case VK_PPC_DTPREL_HI: return "dtprel@h";
266268
case VK_PPC_DTPREL_HA: return "dtprel@ha";
269+
case VK_PPC_DTPREL_HIGH: return "dtprel@high";
270+
case VK_PPC_DTPREL_HIGHA: return "dtprel@higha";
267271
case VK_PPC_DTPREL_HIGHER: return "dtprel@higher";
268272
case VK_PPC_DTPREL_HIGHERA: return "dtprel@highera";
269273
case VK_PPC_DTPREL_HIGHEST: return "dtprel@highest";
@@ -365,13 +369,17 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
365369
.Case("tprel@l", VK_PPC_TPREL_LO)
366370
.Case("tprel@h", VK_PPC_TPREL_HI)
367371
.Case("tprel@ha", VK_PPC_TPREL_HA)
372+
.Case("tprel@high", VK_PPC_TPREL_HIGH)
373+
.Case("tprel@higha", VK_PPC_TPREL_HIGHA)
368374
.Case("tprel@higher", VK_PPC_TPREL_HIGHER)
369375
.Case("tprel@highera", VK_PPC_TPREL_HIGHERA)
370376
.Case("tprel@highest", VK_PPC_TPREL_HIGHEST)
371377
.Case("tprel@highesta", VK_PPC_TPREL_HIGHESTA)
372378
.Case("dtprel@l", VK_PPC_DTPREL_LO)
373379
.Case("dtprel@h", VK_PPC_DTPREL_HI)
374380
.Case("dtprel@ha", VK_PPC_DTPREL_HA)
381+
.Case("dtprel@high", VK_PPC_DTPREL_HIGH)
382+
.Case("dtprel@higha", VK_PPC_DTPREL_HIGHA)
375383
.Case("dtprel@higher", VK_PPC_DTPREL_HIGHER)
376384
.Case("dtprel@highera", VK_PPC_DTPREL_HIGHERA)
377385
.Case("dtprel@highest", VK_PPC_DTPREL_HIGHEST)

‎llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,12 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
209209
case MCSymbolRefExpr::VK_PPC_TPREL_HA:
210210
Type = ELF::R_PPC_TPREL16_HA;
211211
break;
212+
case MCSymbolRefExpr::VK_PPC_TPREL_HIGH:
213+
Type = ELF::R_PPC64_TPREL16_HIGH;
214+
break;
215+
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHA:
216+
Type = ELF::R_PPC64_TPREL16_HIGHA;
217+
break;
212218
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER:
213219
Type = ELF::R_PPC64_TPREL16_HIGHER;
214220
break;
@@ -233,6 +239,12 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
233239
case MCSymbolRefExpr::VK_PPC_DTPREL_HA:
234240
Type = ELF::R_PPC64_DTPREL16_HA;
235241
break;
242+
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGH:
243+
Type = ELF::R_PPC64_DTPREL16_HIGH;
244+
break;
245+
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHA:
246+
Type = ELF::R_PPC64_DTPREL16_HIGHA;
247+
break;
236248
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER:
237249
Type = ELF::R_PPC64_DTPREL16_HIGHER;
238250
break;

‎llvm/test/MC/PowerPC/ppc64-fixups.s

+32-1
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,6 @@ base:
338338
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_GOT16_LO_DS target 0x0
339339
ld 1, target@got@l(3)
340340

341-
342341
# CHECK-BE: addis 3, 2, target@tprel@ha # encoding: [0x3c,0x62,A,A]
343342
# CHECK-LE: addis 3, 2, target@tprel@ha # encoding: [A,A,0x62,0x3c]
344343
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@tprel@ha, kind: fixup_ppc_half16
@@ -347,6 +346,22 @@ base:
347346
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_TPREL16_HA target 0x0
348347
addis 3, 2, target@tprel@ha
349348

349+
# CHECK-BE: addis 3, 2, target@tprel@higha # encoding: [0x3c,0x62,A,A]
350+
# CHECK-LE: addis 3, 2, target@tprel@higha # encoding: [A,A,0x62,0x3c]
351+
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@tprel@higha, kind: fixup_ppc_half16
352+
# CHECK-LE-NEXT: # fixup A - offset: 0, value: target@tprel@higha, kind: fixup_ppc_half16
353+
# CHECK-BE-REL: 0x{{[0-9A-F]*[26AE]}} R_PPC64_TPREL16_HIGHA target 0x0
354+
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_TPREL16_HIGHA target 0x0
355+
addis 3, 2, target@tprel@higha
356+
357+
# CHECK-BE: addis 3, 2, target@tprel@high # encoding: [0x3c,0x62,A,A]
358+
# CHECK-LE: addis 3, 2, target@tprel@high # encoding: [A,A,0x62,0x3c]
359+
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@tprel@high, kind: fixup_ppc_half16
360+
# CHECK-LE-NEXT: # fixup A - offset: 0, value: target@tprel@high, kind: fixup_ppc_half16
361+
# CHECK-BE-REL: 0x{{[0-9A-F]*[26AE]}} R_PPC64_TPREL16_HIGH target 0x0
362+
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_TPREL16_HIGH target 0x0
363+
addis 3, 2, target@tprel@high
364+
350365
# CHECK-BE: addi 3, 3, target@tprel@l # encoding: [0x38,0x63,A,A]
351366
# CHECK-LE: addi 3, 3, target@tprel@l # encoding: [A,A,0x63,0x38]
352367
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@tprel@l, kind: fixup_ppc_half16
@@ -427,6 +442,22 @@ base:
427442
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_DTPREL16_HA target 0x0
428443
addis 3, 2, target@dtprel@ha
429444

445+
# CHECK-BE: addis 3, 2, target@dtprel@higha # encoding: [0x3c,0x62,A,A]
446+
# CHECK-LE: addis 3, 2, target@dtprel@higha # encoding: [A,A,0x62,0x3c]
447+
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@dtprel@higha, kind: fixup_ppc_half16
448+
# CHECK-LE-NEXT: # fixup A - offset: 0, value: target@dtprel@higha, kind: fixup_ppc_half16
449+
# CHECK-BE-REL: 0x{{[0-9A-F]*[26AE]}} R_PPC64_DTPREL16_HIGHA target 0x0
450+
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_DTPREL16_HIGHA target 0x0
451+
addis 3, 2, target@dtprel@higha
452+
453+
# CHECK-BE: addis 3, 2, target@dtprel@high # encoding: [0x3c,0x62,A,A]
454+
# CHECK-LE: addis 3, 2, target@dtprel@high # encoding: [A,A,0x62,0x3c]
455+
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@dtprel@high, kind: fixup_ppc_half16
456+
# CHECK-LE-NEXT: # fixup A - offset: 0, value: target@dtprel@high, kind: fixup_ppc_half16
457+
# CHECK-BE-REL: 0x{{[0-9A-F]*[26AE]}} R_PPC64_DTPREL16_HIGH target 0x0
458+
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_DTPREL16_HIGH target 0x0
459+
addis 3, 2, target@dtprel@high
460+
430461
# CHECK-BE: addi 3, 3, target@dtprel@l # encoding: [0x38,0x63,A,A]
431462
# CHECK-LE: addi 3, 3, target@dtprel@l # encoding: [A,A,0x63,0x38]
432463
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@dtprel@l, kind: fixup_ppc_half16

‎llvm/test/MC/PowerPC/tls-ld-v2-abi.s

+177
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
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
17+
short_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
42+
medium_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
65+
medium_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
89+
large_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
116+
not_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
143+
i:
144+
.long 55
145+
.size i, 4
146+
147+
.type j,@object
148+
.data
149+
.p2align 3
150+
j:
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: ]

0 commit comments

Comments
 (0)
Please sign in to comment.