Skip to content

Commit 8981298

Browse files
committed
Move PowerPC-specific absolute MCSymbolRefExpr::VariantKind to PPCMCExpr
This cleans up @l @ha optimization in PPCAsmParser and is also the first step toward removing VK_PPC_* from the generic MCSymbolRefExpr::VariantKind. Basically we ensure that @l @ha family modifiers always lead to PPCMCExpr and avoid MCSymbolRefExpr::VariantKind. This allows us to delete a lot of switch statements that involve a long list of VK_PPC_LO/VK_PPC_HI/...
1 parent efb966e commit 8981298

File tree

7 files changed

+112
-177
lines changed

7 files changed

+112
-177
lines changed

llvm/include/llvm/MC/MCExpr.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -252,15 +252,6 @@ class MCSymbolRefExpr : public MCExpr {
252252
VK_AVR_DIFF32,
253253
VK_AVR_PM,
254254

255-
VK_PPC_LO, // symbol@l
256-
VK_PPC_HI, // symbol@h
257-
VK_PPC_HA, // symbol@ha
258-
VK_PPC_HIGH, // symbol@high
259-
VK_PPC_HIGHA, // symbol@higha
260-
VK_PPC_HIGHER, // symbol@higher
261-
VK_PPC_HIGHERA, // symbol@highera
262-
VK_PPC_HIGHEST, // symbol@highest
263-
VK_PPC_HIGHESTA, // symbol@highesta
264255
VK_PPC_GOT_LO, // symbol@got@l
265256
VK_PPC_GOT_HI, // symbol@got@h
266257
VK_PPC_GOT_HA, // symbol@got@ha

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

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,32 +1384,32 @@ PPCAsmParser::extractModifierFromExpr(const MCExpr *E,
13841384
case MCExpr::SymbolRef: {
13851385
const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E);
13861386

1387-
switch (SRE->getKind()) {
1388-
case MCSymbolRefExpr::VK_PPC_LO:
1387+
switch ((PPCMCExpr::VariantKind)SRE->getKind()) {
1388+
case PPCMCExpr::VK_PPC_LO:
13891389
Variant = PPCMCExpr::VK_PPC_LO;
13901390
break;
1391-
case MCSymbolRefExpr::VK_PPC_HI:
1391+
case PPCMCExpr::VK_PPC_HI:
13921392
Variant = PPCMCExpr::VK_PPC_HI;
13931393
break;
1394-
case MCSymbolRefExpr::VK_PPC_HA:
1394+
case PPCMCExpr::VK_PPC_HA:
13951395
Variant = PPCMCExpr::VK_PPC_HA;
13961396
break;
1397-
case MCSymbolRefExpr::VK_PPC_HIGH:
1397+
case PPCMCExpr::VK_PPC_HIGH:
13981398
Variant = PPCMCExpr::VK_PPC_HIGH;
13991399
break;
1400-
case MCSymbolRefExpr::VK_PPC_HIGHA:
1400+
case PPCMCExpr::VK_PPC_HIGHA:
14011401
Variant = PPCMCExpr::VK_PPC_HIGHA;
14021402
break;
1403-
case MCSymbolRefExpr::VK_PPC_HIGHER:
1403+
case PPCMCExpr::VK_PPC_HIGHER:
14041404
Variant = PPCMCExpr::VK_PPC_HIGHER;
14051405
break;
1406-
case MCSymbolRefExpr::VK_PPC_HIGHERA:
1406+
case PPCMCExpr::VK_PPC_HIGHERA:
14071407
Variant = PPCMCExpr::VK_PPC_HIGHERA;
14081408
break;
1409-
case MCSymbolRefExpr::VK_PPC_HIGHEST:
1409+
case PPCMCExpr::VK_PPC_HIGHEST:
14101410
Variant = PPCMCExpr::VK_PPC_HIGHEST;
14111411
break;
1412-
case MCSymbolRefExpr::VK_PPC_HIGHESTA:
1412+
case PPCMCExpr::VK_PPC_HIGHESTA:
14131413
Variant = PPCMCExpr::VK_PPC_HIGHESTA;
14141414
break;
14151415
default:
@@ -1852,26 +1852,22 @@ const MCExpr *
18521852
PPCAsmParser::applyModifierToExpr(const MCExpr *E,
18531853
MCSymbolRefExpr::VariantKind Variant,
18541854
MCContext &Ctx) {
1855-
switch (Variant) {
1856-
case MCSymbolRefExpr::VK_PPC_LO:
1857-
return PPCMCExpr::create(PPCMCExpr::VK_PPC_LO, E, Ctx);
1858-
case MCSymbolRefExpr::VK_PPC_HI:
1859-
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HI, E, Ctx);
1860-
case MCSymbolRefExpr::VK_PPC_HA:
1861-
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HA, E, Ctx);
1862-
case MCSymbolRefExpr::VK_PPC_HIGH:
1863-
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGH, E, Ctx);
1864-
case MCSymbolRefExpr::VK_PPC_HIGHA:
1865-
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHA, E, Ctx);
1866-
case MCSymbolRefExpr::VK_PPC_HIGHER:
1867-
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHER, E, Ctx);
1868-
case MCSymbolRefExpr::VK_PPC_HIGHERA:
1869-
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHERA, E, Ctx);
1870-
case MCSymbolRefExpr::VK_PPC_HIGHEST:
1871-
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHEST, E, Ctx);
1872-
case MCSymbolRefExpr::VK_PPC_HIGHESTA:
1873-
return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHESTA, E, Ctx);
1874-
default:
1875-
return nullptr;
1855+
if (isa<MCConstantExpr>(E)) {
1856+
switch (PPCMCExpr::VariantKind(Variant)) {
1857+
case PPCMCExpr::VariantKind::VK_PPC_LO:
1858+
case PPCMCExpr::VariantKind::VK_PPC_HI:
1859+
case PPCMCExpr::VariantKind::VK_PPC_HA:
1860+
case PPCMCExpr::VariantKind::VK_PPC_HIGH:
1861+
case PPCMCExpr::VariantKind::VK_PPC_HIGHA:
1862+
case PPCMCExpr::VariantKind::VK_PPC_HIGHER:
1863+
case PPCMCExpr::VariantKind::VK_PPC_HIGHERA:
1864+
case PPCMCExpr::VariantKind::VK_PPC_HIGHEST:
1865+
case PPCMCExpr::VariantKind::VK_PPC_HIGHESTA:
1866+
break;
1867+
default:
1868+
return nullptr;
1869+
}
18761870
}
1871+
1872+
return PPCMCExpr::create(PPCMCExpr::VariantKind(Variant), E, Ctx);
18771873
}

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

Lines changed: 46 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "MCTargetDesc/PPCFixupKinds.h"
1010
#include "MCTargetDesc/PPCMCExpr.h"
1111
#include "MCTargetDesc/PPCMCTargetDesc.h"
12+
#include "llvm/MC/MCContext.h"
1213
#include "llvm/MC/MCELFObjectWriter.h"
1314
#include "llvm/MC/MCExpr.h"
1415
#include "llvm/MC/MCObjectWriter.h"
@@ -43,30 +44,7 @@ static MCSymbolRefExpr::VariantKind getAccessVariant(const MCValue &Target,
4344

4445
if (Expr->getKind() != MCExpr::Target)
4546
return Target.getAccessVariant();
46-
47-
switch (cast<PPCMCExpr>(Expr)->getKind()) {
48-
case PPCMCExpr::VK_PPC_None:
49-
return MCSymbolRefExpr::VK_None;
50-
case PPCMCExpr::VK_PPC_LO:
51-
return MCSymbolRefExpr::VK_PPC_LO;
52-
case PPCMCExpr::VK_PPC_HI:
53-
return MCSymbolRefExpr::VK_PPC_HI;
54-
case PPCMCExpr::VK_PPC_HA:
55-
return MCSymbolRefExpr::VK_PPC_HA;
56-
case PPCMCExpr::VK_PPC_HIGH:
57-
return MCSymbolRefExpr::VK_PPC_HIGH;
58-
case PPCMCExpr::VK_PPC_HIGHA:
59-
return MCSymbolRefExpr::VK_PPC_HIGHA;
60-
case PPCMCExpr::VK_PPC_HIGHERA:
61-
return MCSymbolRefExpr::VK_PPC_HIGHERA;
62-
case PPCMCExpr::VK_PPC_HIGHER:
63-
return MCSymbolRefExpr::VK_PPC_HIGHER;
64-
case PPCMCExpr::VK_PPC_HIGHEST:
65-
return MCSymbolRefExpr::VK_PPC_HIGHEST;
66-
case PPCMCExpr::VK_PPC_HIGHESTA:
67-
return MCSymbolRefExpr::VK_PPC_HIGHESTA;
68-
}
69-
llvm_unreachable("unknown PPCMCExpr kind");
47+
return MCSymbolRefExpr::VariantKind(cast<PPCMCExpr>(Expr)->getKind());
7048
}
7149

7250
unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
@@ -75,6 +53,7 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
7553
MCFixupKind Kind = Fixup.getKind();
7654
if (Kind >= FirstLiteralRelocationKind)
7755
return Kind - FirstLiteralRelocationKind;
56+
auto RefKind = static_cast<PPCMCExpr::VariantKind>(Target.getRefKind());
7857
MCSymbolRefExpr::VariantKind Modifier = getAccessVariant(Target, Fixup);
7958

8059
// determine the type of the relocation
@@ -107,20 +86,18 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
10786
Type = ELF::R_PPC_REL14;
10887
break;
10988
case PPC::fixup_ppc_half16:
110-
switch (Modifier) {
111-
default: llvm_unreachable("Unsupported Modifier");
112-
case MCSymbolRefExpr::VK_None:
113-
Type = ELF::R_PPC_REL16;
114-
break;
115-
case MCSymbolRefExpr::VK_PPC_LO:
116-
Type = ELF::R_PPC_REL16_LO;
117-
break;
118-
case MCSymbolRefExpr::VK_PPC_HI:
119-
Type = ELF::R_PPC_REL16_HI;
120-
break;
121-
case MCSymbolRefExpr::VK_PPC_HA:
122-
Type = ELF::R_PPC_REL16_HA;
123-
break;
89+
switch (RefKind) {
90+
default:
91+
Ctx.reportError(Fixup.getLoc(), "invalid VariantKind");
92+
return ELF::R_PPC_NONE;
93+
case PPCMCExpr::VK_PPC_None:
94+
return ELF::R_PPC_REL16;
95+
case PPCMCExpr::VK_PPC_LO:
96+
return ELF::R_PPC_REL16_LO;
97+
case PPCMCExpr::VK_PPC_HI:
98+
return ELF::R_PPC_REL16_HI;
99+
case PPCMCExpr::VK_PPC_HA:
100+
return ELF::R_PPC_REL16_HA;
124101
}
125102
break;
126103
case PPC::fixup_ppc_half16ds:
@@ -168,38 +145,33 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
168145
Type = ELF::R_PPC_ADDR14; // XXX: or BRNTAKEN?_
169146
break;
170147
case PPC::fixup_ppc_half16:
148+
switch (RefKind) {
149+
case PPCMCExpr::VK_PPC_None:
150+
break;
151+
case PPCMCExpr::VK_PPC_LO:
152+
return ELF::R_PPC_ADDR16_LO;
153+
case PPCMCExpr::VK_PPC_HI:
154+
return ELF::R_PPC_ADDR16_HI;
155+
case PPCMCExpr::VK_PPC_HA:
156+
return ELF::R_PPC_ADDR16_HA;
157+
case PPCMCExpr::VK_PPC_HIGH:
158+
return ELF::R_PPC64_ADDR16_HIGH;
159+
case PPCMCExpr::VK_PPC_HIGHA:
160+
return ELF::R_PPC64_ADDR16_HIGHA;
161+
case PPCMCExpr::VK_PPC_HIGHER:
162+
return ELF::R_PPC64_ADDR16_HIGHER;
163+
case PPCMCExpr::VK_PPC_HIGHERA:
164+
return ELF::R_PPC64_ADDR16_HIGHERA;
165+
case PPCMCExpr::VK_PPC_HIGHEST:
166+
return ELF::R_PPC64_ADDR16_HIGHEST;
167+
case PPCMCExpr::VK_PPC_HIGHESTA:
168+
return ELF::R_PPC64_ADDR16_HIGHESTA;
169+
}
171170
switch (Modifier) {
172171
default: llvm_unreachable("Unsupported Modifier");
173172
case MCSymbolRefExpr::VK_None:
174173
Type = ELF::R_PPC_ADDR16;
175174
break;
176-
case MCSymbolRefExpr::VK_PPC_LO:
177-
Type = ELF::R_PPC_ADDR16_LO;
178-
break;
179-
case MCSymbolRefExpr::VK_PPC_HI:
180-
Type = ELF::R_PPC_ADDR16_HI;
181-
break;
182-
case MCSymbolRefExpr::VK_PPC_HA:
183-
Type = ELF::R_PPC_ADDR16_HA;
184-
break;
185-
case MCSymbolRefExpr::VK_PPC_HIGH:
186-
Type = ELF::R_PPC64_ADDR16_HIGH;
187-
break;
188-
case MCSymbolRefExpr::VK_PPC_HIGHA:
189-
Type = ELF::R_PPC64_ADDR16_HIGHA;
190-
break;
191-
case MCSymbolRefExpr::VK_PPC_HIGHER:
192-
Type = ELF::R_PPC64_ADDR16_HIGHER;
193-
break;
194-
case MCSymbolRefExpr::VK_PPC_HIGHERA:
195-
Type = ELF::R_PPC64_ADDR16_HIGHERA;
196-
break;
197-
case MCSymbolRefExpr::VK_PPC_HIGHEST:
198-
Type = ELF::R_PPC64_ADDR16_HIGHEST;
199-
break;
200-
case MCSymbolRefExpr::VK_PPC_HIGHESTA:
201-
Type = ELF::R_PPC64_ADDR16_HIGHESTA;
202-
break;
203175
case MCSymbolRefExpr::VK_GOT:
204176
Type = ELF::R_PPC_GOT16;
205177
break;
@@ -350,14 +322,20 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
350322
break;
351323
case PPC::fixup_ppc_half16ds:
352324
case PPC::fixup_ppc_half16dq:
325+
switch (RefKind) {
326+
default:
327+
Ctx.reportError(Fixup.getLoc(), "invalid VariantKind");
328+
return ELF::R_PPC64_NONE;
329+
case PPCMCExpr::VK_PPC_None:
330+
break;
331+
case PPCMCExpr::VK_PPC_LO:
332+
return ELF::R_PPC64_ADDR16_LO_DS;
333+
}
353334
switch (Modifier) {
354335
default: llvm_unreachable("Unsupported Modifier");
355336
case MCSymbolRefExpr::VK_None:
356337
Type = ELF::R_PPC64_ADDR16_DS;
357338
break;
358-
case MCSymbolRefExpr::VK_PPC_LO:
359-
Type = ELF::R_PPC64_ADDR16_LO_DS;
360-
break;
361339
case MCSymbolRefExpr::VK_GOT:
362340
Type = ELF::R_PPC64_GOT16_DS;
363341
break;

llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "PPCMCAsmInfo.h"
14+
#include "PPCMCExpr.h"
1415
#include "llvm/MC/MCExpr.h"
1516
#include "llvm/TargetParser/Triple.h"
1617

@@ -26,15 +27,15 @@ const MCAsmInfo::VariantKindDesc variantKindDescs[] = {
2627
{MCSymbolRefExpr::VK_TLSGD, "tlsgd"},
2728
{MCSymbolRefExpr::VK_TLSLD, "tlsld"},
2829
{MCSymbolRefExpr::VK_TPREL, "TPREL"},
29-
{MCSymbolRefExpr::VK_PPC_LO, "l"},
30-
{MCSymbolRefExpr::VK_PPC_HI, "h"},
31-
{MCSymbolRefExpr::VK_PPC_HA, "ha"},
32-
{MCSymbolRefExpr::VK_PPC_HIGH, "high"},
33-
{MCSymbolRefExpr::VK_PPC_HIGHA, "higha"},
34-
{MCSymbolRefExpr::VK_PPC_HIGHER, "higher"},
35-
{MCSymbolRefExpr::VK_PPC_HIGHERA, "highera"},
36-
{MCSymbolRefExpr::VK_PPC_HIGHEST, "highest"},
37-
{MCSymbolRefExpr::VK_PPC_HIGHESTA, "highesta"},
30+
{PPCMCExpr::VK_PPC_LO, "l"},
31+
{PPCMCExpr::VK_PPC_HI, "h"},
32+
{PPCMCExpr::VK_PPC_HA, "ha"},
33+
{PPCMCExpr::VK_PPC_HIGH, "high"},
34+
{PPCMCExpr::VK_PPC_HIGHA, "higha"},
35+
{PPCMCExpr::VK_PPC_HIGHER, "higher"},
36+
{PPCMCExpr::VK_PPC_HIGHERA, "highera"},
37+
{PPCMCExpr::VK_PPC_HIGHEST, "highest"},
38+
{PPCMCExpr::VK_PPC_HIGHESTA, "highesta"},
3839
{MCSymbolRefExpr::VK_PPC_GOT_LO, "got@l"},
3940
{MCSymbolRefExpr::VK_PPC_GOT_HI, "got@h"},
4041
{MCSymbolRefExpr::VK_PPC_GOT_HA, "got@ha"},

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

Lines changed: 14 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,14 @@ PPCMCExpr::evaluateAsConstant(int64_t &Res) const {
6767

6868
if (!Value.isAbsolute())
6969
return false;
70-
71-
Res = evaluateAsInt64(Value.getConstant());
70+
auto Tmp = evaluateAsInt64(Value.getConstant());
71+
if (!Tmp)
72+
return false;
73+
Res = *Tmp;
7274
return true;
7375
}
7476

75-
int64_t
76-
PPCMCExpr::evaluateAsInt64(int64_t Value) const {
77+
std::optional<int64_t> PPCMCExpr::evaluateAsInt64(int64_t Value) const {
7778
switch (Kind) {
7879
case VK_PPC_LO:
7980
return Value & 0xffff;
@@ -93,21 +94,19 @@ PPCMCExpr::evaluateAsInt64(int64_t Value) const {
9394
return (Value >> 48) & 0xffff;
9495
case VK_PPC_HIGHESTA:
9596
return ((Value + 0x8000) >> 48) & 0xffff;
96-
case VK_PPC_None:
97-
break;
98-
}
99-
llvm_unreachable("Invalid kind!");
97+
default:
98+
return {};
99+
}
100100
}
101101

102102
bool PPCMCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
103103
const MCFixup *Fixup) const {
104-
MCValue Value;
105-
106-
if (!getSubExpr()->evaluateAsRelocatable(Value, Asm, Fixup))
104+
if (!getSubExpr()->evaluateAsRelocatable(Res, Asm, Fixup))
107105
return false;
108106

109-
if (Value.isAbsolute()) {
110-
int64_t Result = evaluateAsInt64(Value.getConstant());
107+
std::optional<int64_t> MaybeInt = evaluateAsInt64(Res.getConstant());
108+
if (Res.isAbsolute() && MaybeInt) {
109+
int64_t Result = *MaybeInt;
111110
bool IsHalf16 = Fixup && Fixup->getTargetKind() == PPC::fixup_ppc_half16;
112111
bool IsHalf16DS =
113112
Fixup && Fixup->getTargetKind() == PPC::fixup_ppc_half16ds;
@@ -122,47 +121,8 @@ bool PPCMCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
122121

123122
Res = MCValue::get(Result);
124123
} else {
125-
if (!Asm || !Asm->hasLayout())
126-
return false;
127-
128-
MCContext &Context = Asm->getContext();
129-
const MCSymbolRefExpr *Sym = Value.getSymA();
130-
MCSymbolRefExpr::VariantKind Modifier = Sym->getKind();
131-
if (Modifier != MCSymbolRefExpr::VK_None)
132-
return false;
133-
switch (Kind) {
134-
default:
135-
llvm_unreachable("Invalid kind!");
136-
case VK_PPC_LO:
137-
Modifier = MCSymbolRefExpr::VK_PPC_LO;
138-
break;
139-
case VK_PPC_HI:
140-
Modifier = MCSymbolRefExpr::VK_PPC_HI;
141-
break;
142-
case VK_PPC_HA:
143-
Modifier = MCSymbolRefExpr::VK_PPC_HA;
144-
break;
145-
case VK_PPC_HIGH:
146-
Modifier = MCSymbolRefExpr::VK_PPC_HIGH;
147-
break;
148-
case VK_PPC_HIGHA:
149-
Modifier = MCSymbolRefExpr::VK_PPC_HIGHA;
150-
break;
151-
case VK_PPC_HIGHERA:
152-
Modifier = MCSymbolRefExpr::VK_PPC_HIGHERA;
153-
break;
154-
case VK_PPC_HIGHER:
155-
Modifier = MCSymbolRefExpr::VK_PPC_HIGHER;
156-
break;
157-
case VK_PPC_HIGHEST:
158-
Modifier = MCSymbolRefExpr::VK_PPC_HIGHEST;
159-
break;
160-
case VK_PPC_HIGHESTA:
161-
Modifier = MCSymbolRefExpr::VK_PPC_HIGHESTA;
162-
break;
163-
}
164-
Sym = MCSymbolRefExpr::create(&Sym->getSymbol(), Modifier, Context);
165-
Res = MCValue::get(Sym, Value.getSymB(), Value.getConstant());
124+
Res = MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(),
125+
getKind());
166126
}
167127

168128
return true;

0 commit comments

Comments
 (0)