Skip to content

Commit cf9665d

Browse files
committed
Xtensa: Migrate to newer relocation specifier representation
* Rename specifier constants from XtensaMCExpr::Specifier::VK_ to Xtensa::S_, following Sparc and VE. * Use MCAsmInfo::printSpecifierExpr instead of MCExpr::print. * Remove unneeded XtensaMCExpr. Just use MCSpecifierExpr when a specifier is needed.
1 parent 490d7bb commit cf9665d

File tree

7 files changed

+40
-92
lines changed

7 files changed

+40
-92
lines changed

llvm/lib/Target/Xtensa/MCTargetDesc/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ add_llvm_component_library(LLVMXtensaDesc
44
XtensaInstPrinter.cpp
55
XtensaMCAsmInfo.cpp
66
XtensaMCCodeEmitter.cpp
7-
XtensaMCExpr.cpp
87
XtensaMCTargetDesc.cpp
98
XtensaTargetStreamer.cpp
109

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaInstPrinter.cpp

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "XtensaInstPrinter.h"
1616
#include "MCTargetDesc/XtensaMCExpr.h"
1717
#include "llvm/CodeGen/MachineOperand.h"
18+
#include "llvm/MC/MCAsmInfo.h"
1819
#include "llvm/MC/MCExpr.h"
1920
#include "llvm/MC/MCInstrInfo.h"
2021
#include "llvm/MC/MCRegister.h"
@@ -35,14 +36,7 @@ static void printExpr(const MCExpr *Expr, raw_ostream &OS) {
3536
if (!(SRE = cast<MCSymbolRefExpr>(Expr)))
3637
assert(false && "Unexpected MCExpr type.");
3738

38-
auto Spec = XtensaMCExpr::Specifier(SRE->getKind());
39-
switch (Spec) {
40-
case XtensaMCExpr::VK_None:
41-
break;
42-
// TODO
43-
default:
44-
report_fatal_error("Invalid kind!");
45-
}
39+
assert(SRE->getSpecifier() == 0);
4640

4741
OS << SRE->getSymbol();
4842

@@ -51,9 +45,6 @@ static void printExpr(const MCExpr *Expr, raw_ostream &OS) {
5145
OS << '+';
5246
OS << Offset;
5347
}
54-
55-
if (Spec != XtensaMCExpr::VK_None)
56-
OS << ')';
5748
}
5849

5950
void XtensaInstPrinter::printOperand(const MCOperand &MC, raw_ostream &O) {
@@ -97,7 +88,7 @@ void XtensaInstPrinter::printBranchTarget(const MCInst *MI, uint64_t Address,
9788
int64_t Val = MC.getImm() + 4;
9889
printPCRelImm(Address, Val, O);
9990
} else if (MC.isExpr())
100-
MC.getExpr()->print(O, &MAI);
91+
MAI.printExpr(O, *MC.getExpr());
10192
else
10293
llvm_unreachable("Invalid operand");
10394
}
@@ -109,7 +100,7 @@ void XtensaInstPrinter::printLoopTarget(const MCInst *MI, uint64_t Address,
109100
int64_t Val = MC.getImm() + 4;
110101
printPCRelImm(Address, Val, O);
111102
} else if (MC.isExpr())
112-
MC.getExpr()->print(O, &MAI, true);
103+
MAI.printExpr(O, *MC.getExpr());
113104
else
114105
llvm_unreachable("Invalid operand");
115106
}
@@ -121,7 +112,7 @@ void XtensaInstPrinter::printJumpTarget(const MCInst *MI, uint64_t Address,
121112
int64_t Val = MC.getImm() + 4;
122113
printPCRelImm(Address, Val, O);
123114
} else if (MC.isExpr())
124-
MC.getExpr()->print(O, &MAI);
115+
MAI.printExpr(O, *MC.getExpr());
125116
else
126117
llvm_unreachable("Invalid operand");
127118
;
@@ -168,7 +159,7 @@ void XtensaInstPrinter::printL32RTarget(const MCInst *MI, uint64_t Address,
168159
printPCRelImm(Address, Value, O);
169160
}
170161
} else if (MC.isExpr())
171-
MC.getExpr()->print(O, &MAI);
162+
MAI.printExpr(O, *MC.getExpr());
172163
else
173164
llvm_unreachable("Invalid operand");
174165
}

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#include "XtensaMCAsmInfo.h"
16+
#include "XtensaMCExpr.h"
17+
#include "llvm/Support/raw_ostream.h"
1618
#include "llvm/TargetParser/Triple.h"
1719

1820
using namespace llvm;
@@ -30,3 +32,22 @@ XtensaMCAsmInfo::XtensaMCAsmInfo(const Triple &TT) {
3032
ExceptionsType = ExceptionHandling::DwarfCFI;
3133
AlignmentIsInBytes = false;
3234
}
35+
36+
void XtensaMCAsmInfo::printSpecifierExpr(raw_ostream &OS,
37+
const MCSpecifierExpr &Expr) const {
38+
StringRef S = Xtensa::getSpecifierName(Expr.getSpecifier());
39+
if (!S.empty())
40+
OS << '%' << S << '(';
41+
printExpr(OS, *Expr.getSubExpr());
42+
if (!S.empty())
43+
OS << ')';
44+
}
45+
46+
uint8_t Xtensa::parseSpecifier(StringRef name) { return 0; }
47+
48+
StringRef Xtensa::getSpecifierName(uint8_t S) {
49+
switch (S) {
50+
default:
51+
llvm_unreachable("Invalid ELF symbol kind");
52+
}
53+
}

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ class Triple;
2323
class XtensaMCAsmInfo : public MCAsmInfoELF {
2424
public:
2525
explicit XtensaMCAsmInfo(const Triple &TT);
26+
27+
void printSpecifierExpr(raw_ostream &OS,
28+
const MCSpecifierExpr &Expr) const override;
2629
};
2730

2831
} // namespace llvm

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.cpp

Lines changed: 0 additions & 52 deletions
This file was deleted.

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.h

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,13 @@
2020
namespace llvm {
2121

2222
class StringRef;
23-
class XtensaMCExpr : public MCSpecifierExpr {
24-
public:
25-
using Specifier = uint16_t;
26-
enum { VK_None, VK_TPOFF };
2723

28-
private:
29-
explicit XtensaMCExpr(const MCExpr *Expr, Specifier S)
30-
: MCSpecifierExpr(Expr, S) {}
24+
namespace Xtensa {
25+
enum Specifier { S_None, S_TPOFF };
3126

32-
public:
33-
static const XtensaMCExpr *create(const MCExpr *Expr, Specifier,
34-
MCContext &Ctx);
35-
36-
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
37-
38-
static Specifier parseSpecifier(StringRef name);
39-
static StringRef getSpecifierName(Specifier Kind);
40-
};
27+
uint8_t parseSpecifier(StringRef name);
28+
StringRef getSpecifierName(uint8_t S);
29+
} // namespace Xtensa
4130

4231
} // end namespace llvm.
4332

llvm/lib/Target/Xtensa/XtensaAsmPrinter.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@
3232

3333
using namespace llvm;
3434

35-
static XtensaMCExpr::Specifier
35+
static Xtensa::Specifier
3636
getModifierSpecifier(XtensaCP::XtensaCPModifier Modifier) {
3737
switch (Modifier) {
3838
case XtensaCP::no_modifier:
39-
return XtensaMCExpr::VK_None;
39+
return Xtensa::S_None;
4040
case XtensaCP::TPOFF:
41-
return XtensaMCExpr::VK_TPOFF;
41+
return Xtensa::S_TPOFF;
4242
}
4343
report_fatal_error("Invalid XtensaCPModifier!");
4444
}
@@ -92,7 +92,7 @@ void XtensaAsmPrinter::emitMachineConstantPoolValue(
9292
MCSymbol *LblSym = GetCPISymbol(ACPV->getLabelId());
9393
auto *TS =
9494
static_cast<XtensaTargetStreamer *>(OutStreamer->getTargetStreamer());
95-
XtensaMCExpr::Specifier VK = getModifierSpecifier(ACPV->getModifier());
95+
auto Spec = getModifierSpecifier(ACPV->getModifier());
9696

9797
if (ACPV->getModifier() != XtensaCP::no_modifier) {
9898
std::string SymName(MCSym->getName());
@@ -101,7 +101,7 @@ void XtensaAsmPrinter::emitMachineConstantPoolValue(
101101
MCSym = OutContext.getOrCreateSymbol(SymName);
102102
}
103103

104-
const MCExpr *Expr = MCSymbolRefExpr::create(MCSym, VK, OutContext);
104+
const MCExpr *Expr = MCSymbolRefExpr::create(MCSym, Spec, OutContext);
105105
TS->emitLiteral(LblSym, Expr, false);
106106
}
107107

@@ -227,8 +227,6 @@ XtensaAsmPrinter::LowerSymbolOperand(const MachineOperand &MO,
227227
MachineOperand::MachineOperandType MOTy,
228228
unsigned Offset) const {
229229
const MCSymbol *Symbol;
230-
XtensaMCExpr::Specifier Kind = XtensaMCExpr::VK_None;
231-
232230
switch (MOTy) {
233231
case MachineOperand::MO_GlobalAddress:
234232
Symbol = getSymbol(MO.getGlobal());
@@ -257,7 +255,6 @@ XtensaAsmPrinter::LowerSymbolOperand(const MachineOperand &MO,
257255
}
258256

259257
const MCExpr *ME = MCSymbolRefExpr::create(Symbol, OutContext);
260-
261258
if (Offset) {
262259
// Assume offset is never negative.
263260
assert(Offset > 0);

0 commit comments

Comments
 (0)