Skip to content

Commit f4a6352

Browse files
committed
PowerPC: Migrate to newer relocation specifier representation
* Use MCAsmInfo::printSpecifierExpr instead of MCExpr::print. * Replace PPCMCExpr with MCSpecifierExpr.
1 parent 790df93 commit f4a6352

File tree

7 files changed

+78
-75
lines changed

7 files changed

+78
-75
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -749,9 +749,9 @@ struct PPCOperand : public MCParsedAsmOperand {
749749
getSpecifier(SRE) == PPC::S_TLS_PCREL)
750750
return CreateTLSReg(SRE, S, E, IsPPC64);
751751

752-
if (const PPCMCExpr *TE = dyn_cast<PPCMCExpr>(Val)) {
752+
if (const auto *SE = dyn_cast<MCSpecifierExpr>(Val)) {
753753
int64_t Res;
754-
if (TE->evaluateAsConstant(Res))
754+
if (PPC::evaluateAsConstant(*SE, Res))
755755
return CreateContextImm(Res, S, E, IsPPC64);
756756
}
757757

@@ -1375,7 +1375,7 @@ const MCExpr *PPCAsmParser::extractSpecifier(const MCExpr *E,
13751375
break;
13761376
case MCExpr::Specifier: {
13771377
// Detect error but do not return a modified expression.
1378-
auto *TE = cast<PPCMCExpr>(E);
1378+
auto *TE = cast<MCSpecifierExpr>(E);
13791379
Spec = TE->getSpecifier();
13801380
(void)extractSpecifier(TE->getSubExpr(), Spec);
13811381
Spec = PPC::S_None;
@@ -1439,7 +1439,7 @@ bool PPCAsmParser::parseExpression(const MCExpr *&EVal) {
14391439
uint16_t Spec = PPC::S_None;
14401440
const MCExpr *E = extractSpecifier(EVal, Spec);
14411441
if (Spec != PPC::S_None)
1442-
EVal = PPCMCExpr::create(Spec, E, getParser().getContext());
1442+
EVal = MCSpecifierExpr::create(E, Spec, getParser().getContext());
14431443

14441444
return false;
14451445
}
@@ -1841,5 +1841,5 @@ const MCExpr *PPCAsmParser::applySpecifier(const MCExpr *E, uint32_t Spec,
18411841
}
18421842
}
18431843

1844-
return PPCMCExpr::create(PPCMCExpr::Specifier(Spec), E, Ctx);
1844+
return MCSpecifierExpr::create(E, Spec, Ctx);
18451845
}

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "PPCMCAsmInfo.h"
1414
#include "PPCMCExpr.h"
1515
#include "llvm/MC/MCExpr.h"
16+
#include "llvm/Support/raw_ostream.h"
1617
#include "llvm/TargetParser/Triple.h"
1718

1819
using namespace llvm;
@@ -136,6 +137,18 @@ PPCELFMCAsmInfo::PPCELFMCAsmInfo(bool is64Bit, const Triple& T) {
136137
initializeVariantKinds(variantKindDescs);
137138
}
138139

140+
void PPCELFMCAsmInfo::printSpecifierExpr(raw_ostream &OS,
141+
const MCSpecifierExpr &Expr) const {
142+
printExpr(OS, *Expr.getSubExpr());
143+
OS << '@' << getSpecifierName(Expr.getSpecifier());
144+
}
145+
146+
bool PPCELFMCAsmInfo::evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr,
147+
MCValue &Res,
148+
const MCAssembler *Asm) const {
149+
return PPC::evaluateAsRelocatableImpl(Expr, Res, Asm);
150+
}
151+
139152
void PPCXCOFFMCAsmInfo::anchor() {}
140153

141154
PPCXCOFFMCAsmInfo::PPCXCOFFMCAsmInfo(bool Is64Bit, const Triple &T) {
@@ -159,3 +172,14 @@ PPCXCOFFMCAsmInfo::PPCXCOFFMCAsmInfo(bool Is64Bit, const Triple &T) {
159172

160173
initializeVariantKinds(variantKindDescs);
161174
}
175+
176+
void PPCXCOFFMCAsmInfo::printSpecifierExpr(raw_ostream &OS,
177+
const MCSpecifierExpr &Expr) const {
178+
printExpr(OS, *Expr.getSubExpr());
179+
OS << '@' << getSpecifierName(Expr.getSpecifier());
180+
}
181+
182+
bool PPCXCOFFMCAsmInfo::evaluateAsRelocatableImpl(
183+
const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const {
184+
return PPC::evaluateAsRelocatableImpl(Expr, Res, Asm);
185+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,21 @@ class PPCELFMCAsmInfo : public MCAsmInfoELF {
2424

2525
public:
2626
explicit PPCELFMCAsmInfo(bool is64Bit, const Triple &);
27+
void printSpecifierExpr(raw_ostream &OS,
28+
const MCSpecifierExpr &Expr) const override;
29+
bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res,
30+
const MCAssembler *Asm) const override;
2731
};
2832

2933
class PPCXCOFFMCAsmInfo : public MCAsmInfoXCOFF {
3034
void anchor() override;
3135

3236
public:
3337
explicit PPCXCOFFMCAsmInfo(bool is64Bit, const Triple &);
38+
void printSpecifierExpr(raw_ostream &OS,
39+
const MCSpecifierExpr &Expr) const override;
40+
bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res,
41+
const MCAssembler *Asm) const override;
3442
};
3543

3644
namespace PPC {

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

Lines changed: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16,38 +16,8 @@ using namespace llvm;
1616

1717
#define DEBUG_TYPE "ppcmcexpr"
1818

19-
const PPCMCExpr *PPCMCExpr::create(Specifier S, const MCExpr *Expr,
20-
MCContext &Ctx) {
21-
return new (Ctx) PPCMCExpr(S, Expr);
22-
}
23-
24-
const PPCMCExpr *PPCMCExpr::create(const MCExpr *Expr, Specifier S,
25-
MCContext &Ctx) {
26-
return new (Ctx) PPCMCExpr(S, Expr);
27-
}
28-
29-
void PPCMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
30-
getSubExpr()->print(OS, MAI);
31-
OS << '@' << MAI->getSpecifierName(specifier);
32-
}
33-
34-
bool
35-
PPCMCExpr::evaluateAsConstant(int64_t &Res) const {
36-
MCValue Value;
37-
38-
if (!getSubExpr()->evaluateAsRelocatable(Value, nullptr))
39-
return false;
40-
41-
if (!Value.isAbsolute())
42-
return false;
43-
auto Tmp = evaluateAsInt64(Value.getConstant());
44-
if (!Tmp)
45-
return false;
46-
Res = *Tmp;
47-
return true;
48-
}
49-
50-
std::optional<int64_t> PPCMCExpr::evaluateAsInt64(int64_t Value) const {
19+
static std::optional<int64_t> evaluateAsInt64(uint16_t specifier,
20+
int64_t Value) {
5121
switch (specifier) {
5222
case PPC::S_LO:
5323
return Value & 0xffff;
@@ -72,21 +42,35 @@ std::optional<int64_t> PPCMCExpr::evaluateAsInt64(int64_t Value) const {
7242
}
7343
}
7444

75-
bool PPCMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
76-
const MCAssembler *Asm) const {
77-
if (!Asm)
45+
bool PPC::evaluateAsConstant(const MCSpecifierExpr &Expr, int64_t &Res) {
46+
MCValue Value;
47+
48+
if (!Expr.getSubExpr()->evaluateAsRelocatable(Value, nullptr))
49+
return false;
50+
51+
if (!Value.isAbsolute())
52+
return false;
53+
auto Tmp = evaluateAsInt64(Expr.getSpecifier(), Value.getConstant());
54+
if (!Tmp)
7855
return false;
79-
if (!getSubExpr()->evaluateAsRelocatable(Res, Asm))
56+
Res = *Tmp;
57+
return true;
58+
}
59+
60+
bool PPC::evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res,
61+
const MCAssembler *Asm) {
62+
if (!Expr.getSubExpr()->evaluateAsRelocatable(Res, Asm))
8063
return false;
8164

8265
// The signedness of the result is dependent on the instruction operand. E.g.
8366
// in addis 3,3,65535@l, 65535@l is signed. In the absence of information at
8467
// parse time (!Asm), disable the folding.
85-
std::optional<int64_t> MaybeInt = evaluateAsInt64(Res.getConstant());
68+
std::optional<int64_t> MaybeInt =
69+
evaluateAsInt64(Expr.getSpecifier(), Res.getConstant());
8670
if (Res.isAbsolute() && MaybeInt) {
8771
Res = MCValue::get(*MaybeInt);
8872
} else {
89-
Res.setSpecifier(specifier);
73+
Res.setSpecifier(Expr.getSpecifier());
9074
}
9175

9276
return true;

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

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,20 @@
1616

1717
namespace llvm {
1818

19-
class PPCMCExpr : public MCSpecifierExpr {
20-
public:
21-
using Specifier = uint16_t;
22-
23-
private:
24-
std::optional<int64_t> evaluateAsInt64(int64_t Value) const;
25-
26-
explicit PPCMCExpr(Specifier S, const MCExpr *Expr)
27-
: MCSpecifierExpr(Expr, S) {}
28-
29-
public:
30-
static const PPCMCExpr *create(Specifier S, const MCExpr *Expr,
31-
MCContext &Ctx);
32-
static const PPCMCExpr *create(const MCExpr *Expr, Specifier S,
33-
MCContext &Ctx);
34-
35-
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
36-
bool evaluateAsRelocatableImpl(MCValue &Res,
37-
const MCAssembler *Asm) const override;
38-
39-
bool evaluateAsConstant(int64_t &Res) const;
40-
};
19+
namespace PPCMCExpr {
20+
using Specifier = uint16_t;
21+
}
4122

4223
static inline PPCMCExpr::Specifier getSpecifier(const MCSymbolRefExpr *SRE) {
4324
return PPCMCExpr::Specifier(SRE->getKind());
4425
}
4526

27+
namespace PPC {
28+
bool evaluateAsConstant(const MCSpecifierExpr &Expr, int64_t &Res);
29+
bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res,
30+
const MCAssembler *Asm);
31+
} // namespace PPC
32+
4633
} // end namespace llvm
4734

4835
#endif

llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,13 +1001,13 @@ void PPCAsmPrinter::emitInstruction(const MachineInstr *MI) {
10011001
MCSymbolRefExpr::create(BaseSymbol, OutContext), PB, OutContext);
10021002

10031003
const MCExpr *DeltaHi =
1004-
PPCMCExpr::create(DeltaExpr, PPC::S_HA, OutContext);
1004+
MCSpecifierExpr::create(DeltaExpr, PPC::S_HA, OutContext);
10051005
EmitToStreamer(
10061006
*OutStreamer,
10071007
MCInstBuilder(PPC::ADDIS).addReg(PICR).addReg(PICR).addExpr(DeltaHi));
10081008

10091009
const MCExpr *DeltaLo =
1010-
PPCMCExpr::create(DeltaExpr, PPC::S_LO, OutContext);
1010+
MCSpecifierExpr::create(DeltaExpr, PPC::S_LO, OutContext);
10111011
EmitToStreamer(
10121012
*OutStreamer,
10131013
MCInstBuilder(PPC::ADDI).addReg(PICR).addReg(PICR).addExpr(DeltaLo));
@@ -1401,10 +1401,10 @@ void PPCAsmPrinter::emitInstruction(const MachineInstr *MI) {
14011401
case PPC::PPC32GOT: {
14021402
MCSymbol *GOTSymbol =
14031403
OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
1404-
const MCExpr *SymGotTlsL = PPCMCExpr::create(
1405-
PPC::S_LO, MCSymbolRefExpr::create(GOTSymbol, OutContext), OutContext);
1406-
const MCExpr *SymGotTlsHA = PPCMCExpr::create(
1407-
PPC::S_HA, MCSymbolRefExpr::create(GOTSymbol, OutContext), OutContext);
1404+
const MCExpr *SymGotTlsL =
1405+
MCSpecifierExpr::create(GOTSymbol, PPC::S_LO, OutContext);
1406+
const MCExpr *SymGotTlsHA =
1407+
MCSpecifierExpr::create(GOTSymbol, PPC::S_HA, OutContext);
14081408
EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI)
14091409
.addReg(MI->getOperand(0).getReg())
14101410
.addExpr(SymGotTlsL));
@@ -2125,14 +2125,14 @@ void PPCLinuxAsmPrinter::emitFunctionBodyStart() {
21252125
GlobalEntryLabelExp, OutContext);
21262126

21272127
const MCExpr *TOCDeltaHi =
2128-
PPCMCExpr::create(TOCDeltaExpr, PPC::S_HA, OutContext);
2128+
MCSpecifierExpr::create(TOCDeltaExpr, PPC::S_HA, OutContext);
21292129
EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)
21302130
.addReg(PPC::X2)
21312131
.addReg(PPC::X12)
21322132
.addExpr(TOCDeltaHi));
21332133

21342134
const MCExpr *TOCDeltaLo =
2135-
PPCMCExpr::create(TOCDeltaExpr, PPC::S_LO, OutContext);
2135+
MCSpecifierExpr::create(TOCDeltaExpr, PPC::S_LO, OutContext);
21362136
EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDI)
21372137
.addReg(PPC::X2)
21382138
.addReg(PPC::X2)

llvm/lib/Target/PowerPC/PPCMCInstLower.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,11 @@ static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol,
164164
switch (access) {
165165
case PPCII::MO_LO:
166166
case PPCII::MO_PIC_LO_FLAG:
167-
Expr = PPCMCExpr::create(Expr, PPC::S_LO, Ctx);
167+
Expr = MCSpecifierExpr::create(Expr, PPC::S_LO, Ctx);
168168
break;
169169
case PPCII::MO_HA:
170170
case PPCII::MO_PIC_HA_FLAG:
171-
Expr = PPCMCExpr::create(Expr, PPC::S_HA, Ctx);
171+
Expr = MCSpecifierExpr::create(Expr, PPC::S_HA, Ctx);
172172
break;
173173
}
174174

0 commit comments

Comments
 (0)