Skip to content

Commit 80b8f82

Browse files
author
Sean Fertile
committedJun 15, 2018
[PPC64] Support "symbol@high" and "symbol@higha" symbol modifers.
Add support for the "@high" and "@HighA" symbol modifiers in powerpc64 assembly. The modifiers represent accessing the segment consiting of bits 16-31 of a 64-bit address/offset. Differential Revision: https://reviews.llvm.org/D47729 llvm-svn: 334855
1 parent 72aed5e commit 80b8f82

File tree

10 files changed

+71
-5
lines changed

10 files changed

+71
-5
lines changed
 

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

+4
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@
8989
#undef R_PPC64_DTPREL16_HIGHESTA
9090
#undef R_PPC64_TLSGD
9191
#undef R_PPC64_TLSLD
92+
#undef R_PPC64_ADDR16_HIGH
93+
#undef R_PPC64_ADDR16_HIGHA
9294
#undef R_PPC64_IRELATIVE
9395
#undef R_PPC64_REL16
9496
#undef R_PPC64_REL16_LO
@@ -176,6 +178,8 @@ ELF_RELOC(R_PPC64_DTPREL16_HIGHEST, 105)
176178
ELF_RELOC(R_PPC64_DTPREL16_HIGHESTA, 106)
177179
ELF_RELOC(R_PPC64_TLSGD, 107)
178180
ELF_RELOC(R_PPC64_TLSLD, 108)
181+
ELF_RELOC(R_PPC64_ADDR16_HIGH, 110)
182+
ELF_RELOC(R_PPC64_ADDR16_HIGHA, 111)
179183
ELF_RELOC(R_PPC64_IRELATIVE, 248)
180184
ELF_RELOC(R_PPC64_REL16, 249)
181185
ELF_RELOC(R_PPC64_REL16_LO, 250)

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

+2
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ class MCSymbolRefExpr : public MCExpr {
218218
VK_PPC_LO, // symbol@l
219219
VK_PPC_HI, // symbol@h
220220
VK_PPC_HA, // symbol@ha
221+
VK_PPC_HIGH, // symbol@high
222+
VK_PPC_HIGHA, // symbol@higha
221223
VK_PPC_HIGHER, // symbol@higher
222224
VK_PPC_HIGHERA, // symbol@highera
223225
VK_PPC_HIGHEST, // symbol@highest

‎llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -723,9 +723,11 @@ void RuntimeDyldELF::resolvePPC64Relocation(const SectionEntry &Section,
723723
writeInt16BE(LocalAddress, applyPPClo(Value + Addend) & ~3);
724724
break;
725725
case ELF::R_PPC64_ADDR16_HI:
726+
case ELF::R_PPC64_ADDR16_HIGH:
726727
writeInt16BE(LocalAddress, applyPPChi(Value + Addend));
727728
break;
728729
case ELF::R_PPC64_ADDR16_HA:
730+
case ELF::R_PPC64_ADDR16_HIGHA:
729731
writeInt16BE(LocalAddress, applyPPCha(Value + Addend));
730732
break;
731733
case ELF::R_PPC64_ADDR16_HIGHER:

‎llvm/lib/MC/MCExpr.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
239239
case VK_PPC_LO: return "l";
240240
case VK_PPC_HI: return "h";
241241
case VK_PPC_HA: return "ha";
242+
case VK_PPC_HIGH: return "high";
243+
case VK_PPC_HIGHA: return "higha";
242244
case VK_PPC_HIGHER: return "higher";
243245
case VK_PPC_HIGHERA: return "highera";
244246
case VK_PPC_HIGHEST: return "highest";
@@ -343,6 +345,8 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
343345
.Case("l", VK_PPC_LO)
344346
.Case("h", VK_PPC_HI)
345347
.Case("ha", VK_PPC_HA)
348+
.Case("high", VK_PPC_HIGH)
349+
.Case("higha", VK_PPC_HIGHA)
346350
.Case("higher", VK_PPC_HIGHER)
347351
.Case("highera", VK_PPC_HIGHERA)
348352
.Case("highest", VK_PPC_HIGHEST)

‎llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -1394,6 +1394,12 @@ ExtractModifierFromExpr(const MCExpr *E,
13941394
case MCSymbolRefExpr::VK_PPC_HA:
13951395
Variant = PPCMCExpr::VK_PPC_HA;
13961396
break;
1397+
case MCSymbolRefExpr::VK_PPC_HIGH:
1398+
Variant = PPCMCExpr::VK_PPC_HIGH;
1399+
break;
1400+
case MCSymbolRefExpr::VK_PPC_HIGHA:
1401+
Variant = PPCMCExpr::VK_PPC_HIGHA;
1402+
break;
13971403
case MCSymbolRefExpr::VK_PPC_HIGHER:
13981404
Variant = PPCMCExpr::VK_PPC_HIGHER;
13991405
break;
@@ -1973,6 +1979,10 @@ PPCAsmParser::applyModifierToExpr(const MCExpr *E,
19731979
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HI, E, false, Ctx);
19741980
case MCSymbolRefExpr::VK_PPC_HA:
19751981
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HA, E, false, Ctx);
1982+
case MCSymbolRefExpr::VK_PPC_HIGH:
1983+
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGH, E, false, Ctx);
1984+
case MCSymbolRefExpr::VK_PPC_HIGHA:
1985+
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHA, E, false, Ctx);
19761986
case MCSymbolRefExpr::VK_PPC_HIGHER:
19771987
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHER, E, false, Ctx);
19781988
case MCSymbolRefExpr::VK_PPC_HIGHERA:

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

+10
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ static MCSymbolRefExpr::VariantKind getAccessVariant(const MCValue &Target,
5555
return MCSymbolRefExpr::VK_PPC_HI;
5656
case PPCMCExpr::VK_PPC_HA:
5757
return MCSymbolRefExpr::VK_PPC_HA;
58+
case PPCMCExpr::VK_PPC_HIGH:
59+
return MCSymbolRefExpr::VK_PPC_HIGH;
60+
case PPCMCExpr::VK_PPC_HIGHA:
61+
return MCSymbolRefExpr::VK_PPC_HIGHA;
5862
case PPCMCExpr::VK_PPC_HIGHERA:
5963
return MCSymbolRefExpr::VK_PPC_HIGHERA;
6064
case PPCMCExpr::VK_PPC_HIGHER:
@@ -151,6 +155,12 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
151155
case MCSymbolRefExpr::VK_PPC_HA:
152156
Type = ELF::R_PPC_ADDR16_HA;
153157
break;
158+
case MCSymbolRefExpr::VK_PPC_HIGH:
159+
Type = ELF::R_PPC64_ADDR16_HIGH;
160+
break;
161+
case MCSymbolRefExpr::VK_PPC_HIGHA:
162+
Type = ELF::R_PPC64_ADDR16_HIGHA;
163+
break;
154164
case MCSymbolRefExpr::VK_PPC_HIGHER:
155165
Type = ELF::R_PPC64_ADDR16_HIGHER;
156166
break;

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

+12
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ void PPCMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
4444
case VK_PPC_LO: OS << "@l"; break;
4545
case VK_PPC_HI: OS << "@h"; break;
4646
case VK_PPC_HA: OS << "@ha"; break;
47+
case VK_PPC_HIGH: OS << "@high"; break;
48+
case VK_PPC_HIGHA: OS << "@higha"; break;
4749
case VK_PPC_HIGHER: OS << "@higher"; break;
4850
case VK_PPC_HIGHERA: OS << "@highera"; break;
4951
case VK_PPC_HIGHEST: OS << "@highest"; break;
@@ -75,6 +77,10 @@ PPCMCExpr::evaluateAsInt64(int64_t Value) const {
7577
return (Value >> 16) & 0xffff;
7678
case VK_PPC_HA:
7779
return ((Value + 0x8000) >> 16) & 0xffff;
80+
case VK_PPC_HIGH:
81+
return (Value >> 16) & 0xffff;
82+
case VK_PPC_HIGHA:
83+
return ((Value + 0x8000) >> 16) & 0xffff;
7884
case VK_PPC_HIGHER:
7985
return (Value >> 32) & 0xffff;
8086
case VK_PPC_HIGHERA:
@@ -125,6 +131,12 @@ PPCMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
125131
case VK_PPC_HA:
126132
Modifier = MCSymbolRefExpr::VK_PPC_HA;
127133
break;
134+
case VK_PPC_HIGH:
135+
Modifier = MCSymbolRefExpr::VK_PPC_HIGH;
136+
break;
137+
case VK_PPC_HIGHA:
138+
Modifier = MCSymbolRefExpr::VK_PPC_HIGHA;
139+
break;
128140
case VK_PPC_HIGHERA:
129141
Modifier = MCSymbolRefExpr::VK_PPC_HIGHERA;
130142
break;

‎llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.h

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class PPCMCExpr : public MCTargetExpr {
2323
VK_PPC_LO,
2424
VK_PPC_HI,
2525
VK_PPC_HA,
26+
VK_PPC_HIGH,
27+
VK_PPC_HIGHA,
2628
VK_PPC_HIGHER,
2729
VK_PPC_HIGHERA,
2830
VK_PPC_HIGHEST,

‎llvm/test/MC/PowerPC/ppc64-fixup-apply.s

+8-5
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ addis 1, 1, 1b-2f@ha
4040
addi 1, 1, target6@h
4141
addis 1, 1, target6@h
4242

43+
addi 1, 1, target6@high
44+
addis 1, 1, target6@higha
45+
4346
.set target6, 0x4321fedc
4447

4548
addi 1, 1, target7@higher
@@ -70,7 +73,7 @@ addis 1, 1, target7@highesta
7073
# CHECK-NEXT: ]
7174
# CHECK-NEXT: Address: 0x0
7275
# CHECK-NEXT: Offset:
73-
# CHECK-NEXT: Size: 72
76+
# CHECK-NEXT: Size: 80
7477
# CHECK-NEXT: Link: 0
7578
# CHECK-NEXT: Info: 0
7679
# CHECK-NEXT: AddressAlignment: 4
@@ -82,10 +85,10 @@ addis 1, 1, target7@highesta
8285
# CHECK-LE-NEXT: 0010: 44442138 1111213C 01802138 0110213C
8386
# CHECK-BE-NEXT: 0020: 60218001 64211001 38210008 3C210000
8487
# CHECK-LE-NEXT: 0020: 01802160 01102164 08002138 0000213C
85-
# CHECK-BE-NEXT: 0030: 38214321 3C214321 3821FFFF 3C211234
86-
# CHECK-LE-NEXT: 0030: 21432138 2143213C FFFF2138 3412213C
87-
# CHECK-BE-NEXT: 0040: 38210000 3C211235
88-
# CHECK-LE-NEXT: 0040: 00002138 3512213C
88+
# CHECK-BE-NEXT: 0030: 38214321 3C214321 38214321 3C214322
89+
# CHECK-LE-NEXT: 0030: 21432138 2143213C 21432138 2243213C
90+
# CHECK-BE-NEXT: 0040: 3821FFFF 3C211234 38210000 3C211235
91+
# CHECK-LE-NEXT: 0040: FFFF2138 3412213C 00002138 3512213C
8992
# CHECK-NEXT: )
9093
# CHECK-NEXT: }
9194

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

+17
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@
5656
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_ADDR16_HA target 0x0
5757
addis 3, 3, target@ha
5858

59+
# CHECK-BE: addis 3, 3, target@higha # encoding: [0x3c,0x63,A,A]
60+
# CHECK-LE: addis 3, 3, target@higha # encoding: [A,A,0x63,0x3c]
61+
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@higha, kind: fixup_ppc_half16
62+
# CHECK-LE-NEXT: # fixup A - offset: 0, value: target@higha, kind: fixup_ppc_half16
63+
# CHECK-BE-REL: 0x{{[0-9A-F]*[26AE]}} R_PPC64_ADDR16_HIGHA target 0x0
64+
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_ADDR16_HIGHA target 0x0
65+
66+
addis 3, 3, target@higha
67+
5968
# CHECK-BE: lis 3, target@ha # encoding: [0x3c,0x60,A,A]
6069
# CHECK-LE: lis 3, target@ha # encoding: [A,A,0x60,0x3c]
6170
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@ha, kind: fixup_ppc_half16
@@ -217,6 +226,14 @@ base:
217226
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_ADDR16_HI target 0x0
218227
oris 3, 3, target@h
219228

229+
# CHECK-BE: oris 3, 3, target@high # encoding: [0x64,0x63,A,A]
230+
# CHECK-LE: oris 3, 3, target@high # encoding: [A,A,0x63,0x64]
231+
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@high, kind: fixup_ppc_half16
232+
# CHECK-LE-NEXT: # fixup A - offset: 0, value: target@high, kind: fixup_ppc_half16
233+
# CHECK-BE-REL: 0x{{[0-9A-F]*[26AE]}} R_PPC64_ADDR16_HIGH target 0x0
234+
# CHECK-LE-REL: 0x{{[0-9A-F]*[048C]}} R_PPC64_ADDR16_HIGH target 0x0
235+
oris 3, 3, target@high
236+
220237
# CHECK-BE: ld 1, target@toc(2) # encoding: [0xe8,0x22,A,0bAAAAAA00]
221238
# CHECK-LE: ld 1, target@toc(2) # encoding: [0bAAAAAA00,A,0x22,0xe8]
222239
# CHECK-BE-NEXT: # fixup A - offset: 2, value: target@toc, kind: fixup_ppc_half16ds

0 commit comments

Comments
 (0)
Please sign in to comment.