Skip to content

Commit b19b6d9

Browse files
committed
Move SystemZ-specific MCSymbolRefExpr::VariantKind to SystemZMCExpr::Specifier
Similar to previous migration done for other targets (PowerPC, X86, ARM, etc). Switch from the confusing VariantKind to Specifier, which aligns with Arm and IBM AIX's documentation. In addition, rename *MCExpr::getKind, which confusingly shadows the base class getKind. In the future, relocation specifiers should be encoded as part of SystemZMCExpr instead of MCSymbolRefExpr.
1 parent f73da64 commit b19b6d9

12 files changed

+149
-107
lines changed

llvm/include/llvm/MC/MCExpr.h

-6
Original file line numberDiff line numberDiff line change
@@ -197,20 +197,14 @@ class MCSymbolRefExpr : public MCExpr {
197197
VK_None,
198198

199199
VK_GOT,
200-
VK_GOTENT,
201200
VK_GOTOFF,
202201
VK_GOTPCREL,
203202
VK_GOTTPOFF,
204-
VK_INDNTPOFF,
205-
VK_NTPOFF,
206203
VK_PLT,
207204
VK_TLSGD,
208205
VK_TLSLD,
209206
VK_TLSLDM,
210207
VK_TPOFF,
211-
VK_DTPOFF,
212-
VK_TLSCALL, // symbol(tlscall)
213-
VK_TLSDESC, // symbol(tlsdesc)
214208
VK_TLVP, // Mach-O thread local variable relocations
215209
VK_TLVPPAGE,
216210
VK_TLVPPAGEOFF,

llvm/lib/MC/ELFObjectWriter.cpp

-5
Original file line numberDiff line numberDiff line change
@@ -1523,15 +1523,10 @@ void ELFObjectWriter::fixSymbolsInTLSFixups(MCAssembler &Asm,
15231523
default:
15241524
return;
15251525
case MCSymbolRefExpr::VK_GOTTPOFF:
1526-
case MCSymbolRefExpr::VK_INDNTPOFF:
1527-
case MCSymbolRefExpr::VK_NTPOFF:
1528-
case MCSymbolRefExpr::VK_TLSCALL:
1529-
case MCSymbolRefExpr::VK_TLSDESC:
15301526
case MCSymbolRefExpr::VK_TLSGD:
15311527
case MCSymbolRefExpr::VK_TLSLD:
15321528
case MCSymbolRefExpr::VK_TLSLDM:
15331529
case MCSymbolRefExpr::VK_TPOFF:
1534-
case MCSymbolRefExpr::VK_DTPOFF:
15351530
break;
15361531
}
15371532
Asm.registerSymbol(symRef.getSymbol());

llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "MCTargetDesc/SystemZGNUInstPrinter.h"
1010
#include "MCTargetDesc/SystemZMCAsmInfo.h"
11+
#include "MCTargetDesc/SystemZMCExpr.h"
1112
#include "MCTargetDesc/SystemZMCTargetDesc.h"
1213
#include "MCTargetDesc/SystemZTargetStreamer.h"
1314
#include "TargetInfo/SystemZTargetInfo.h"
@@ -1668,12 +1669,12 @@ ParseStatus SystemZAsmParser::parsePCRel(OperandVector &Operands,
16681669
if (Parser.getTok().isNot(AsmToken::Identifier))
16691670
return Error(Parser.getTok().getLoc(), "unexpected token");
16701671

1671-
MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None;
1672+
SystemZMCExpr::Specifier Kind = SystemZMCExpr::VK_None;
16721673
StringRef Name = Parser.getTok().getString();
16731674
if (Name == "tls_gdcall")
1674-
Kind = MCSymbolRefExpr::VK_TLSGD;
1675+
Kind = SystemZMCExpr::VK_TLSGD;
16751676
else if (Name == "tls_ldcall")
1676-
Kind = MCSymbolRefExpr::VK_TLSLDM;
1677+
Kind = SystemZMCExpr::VK_TLSLDM;
16771678
else
16781679
return Error(Parser.getTok().getLoc(), "unknown TLS tag");
16791680
Parser.Lex();

llvm/lib/Target/SystemZ/MCTargetDesc/SystemZELFObjectWriter.cpp

+40-11
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#include "MCTargetDesc/SystemZMCExpr.h"
910
#include "MCTargetDesc/SystemZMCFixups.h"
1011
#include "MCTargetDesc/SystemZMCTargetDesc.h"
1112
#include "llvm/BinaryFormat/ELF.h"
@@ -33,6 +34,8 @@ class SystemZELFObjectWriter : public MCELFObjectTargetWriter {
3334
// Override MCELFObjectTargetWriter.
3435
unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
3536
const MCFixup &Fixup, bool IsPCRel) const override;
37+
bool needsRelocateWithSymbol(const MCValue &Val, const MCSymbol &Sym,
38+
unsigned Type) const override;
3639
};
3740

3841
} // end anonymous namespace
@@ -155,43 +158,57 @@ unsigned SystemZELFObjectWriter::getRelocType(MCContext &Ctx,
155158
unsigned Kind = Fixup.getKind();
156159
if (Kind >= FirstLiteralRelocationKind)
157160
return Kind - FirstLiteralRelocationKind;
158-
MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();
159-
switch (Modifier) {
160-
case MCSymbolRefExpr::VK_None:
161+
auto Specifier = SystemZMCExpr::Specifier(Target.getAccessVariant());
162+
switch (Specifier) {
163+
case SystemZMCExpr::VK_INDNTPOFF:
164+
case SystemZMCExpr::VK_NTPOFF:
165+
case SystemZMCExpr::VK_TLSGD:
166+
case SystemZMCExpr::VK_TLSLD:
167+
case SystemZMCExpr::VK_TLSLDM:
168+
case SystemZMCExpr::VK_DTPOFF:
169+
if (auto *S = Target.getSymA())
170+
cast<MCSymbolELF>(S->getSymbol()).setType(ELF::STT_TLS);
171+
break;
172+
default:
173+
break;
174+
}
175+
176+
switch (Specifier) {
177+
case SystemZMCExpr::VK_None:
161178
if (IsPCRel)
162179
return getPCRelReloc(Ctx, Loc, Kind);
163180
return getAbsoluteReloc(Ctx, Loc, Kind);
164181

165-
case MCSymbolRefExpr::VK_NTPOFF:
182+
case SystemZMCExpr::VK_NTPOFF:
166183
assert(!IsPCRel && "NTPOFF shouldn't be PC-relative");
167184
return getTLSLEReloc(Ctx, Loc, Kind);
168185

169-
case MCSymbolRefExpr::VK_INDNTPOFF:
186+
case SystemZMCExpr::VK_INDNTPOFF:
170187
if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL)
171188
return ELF::R_390_TLS_IEENT;
172189
Ctx.reportError(Loc, "Only PC-relative INDNTPOFF accesses are supported for now");
173190
return 0;
174191

175-
case MCSymbolRefExpr::VK_DTPOFF:
192+
case SystemZMCExpr::VK_DTPOFF:
176193
assert(!IsPCRel && "DTPOFF shouldn't be PC-relative");
177194
return getTLSLDOReloc(Ctx, Loc, Kind);
178195

179-
case MCSymbolRefExpr::VK_TLSLDM:
196+
case SystemZMCExpr::VK_TLSLDM:
180197
assert(!IsPCRel && "TLSLDM shouldn't be PC-relative");
181198
return getTLSLDMReloc(Ctx, Loc, Kind);
182199

183-
case MCSymbolRefExpr::VK_TLSGD:
200+
case SystemZMCExpr::VK_TLSGD:
184201
assert(!IsPCRel && "TLSGD shouldn't be PC-relative");
185202
return getTLSGDReloc(Ctx, Loc, Kind);
186203

187-
case MCSymbolRefExpr::VK_GOT:
188-
case MCSymbolRefExpr::VK_GOTENT:
204+
case SystemZMCExpr::VK_GOT:
205+
case SystemZMCExpr::VK_GOTENT:
189206
if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL)
190207
return ELF::R_390_GOTENT;
191208
Ctx.reportError(Loc, "Only PC-relative GOT accesses are supported for now");
192209
return 0;
193210

194-
case MCSymbolRefExpr::VK_PLT:
211+
case SystemZMCExpr::VK_PLT:
195212
assert(IsPCRel && "@PLT shouldn't be PC-relative");
196213
return getPLTReloc(Ctx, Loc, Kind);
197214

@@ -200,6 +217,18 @@ unsigned SystemZELFObjectWriter::getRelocType(MCContext &Ctx,
200217
}
201218
}
202219

220+
bool SystemZELFObjectWriter::needsRelocateWithSymbol(const MCValue &V,
221+
const MCSymbol &Sym,
222+
unsigned Type) const {
223+
switch (getSpecifier(V.getSymA())) {
224+
case SystemZMCExpr::VK_GOT:
225+
case SystemZMCExpr::VK_PLT:
226+
return true;
227+
default:
228+
return false;
229+
}
230+
}
231+
203232
std::unique_ptr<MCObjectTargetWriter>
204233
llvm::createSystemZELFObjectWriter(uint8_t OSABI) {
205234
return std::make_unique<SystemZELFObjectWriter>(OSABI);

llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinterCommon.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "SystemZInstPrinterCommon.h"
10+
#include "MCTargetDesc/SystemZMCExpr.h"
1011
#include "llvm/MC/MCExpr.h"
1112
#include "llvm/MC/MCInst.h"
1213
#include "llvm/MC/MCRegister.h"
@@ -168,11 +169,11 @@ void SystemZInstPrinterCommon::printPCRelTLSOperand(const MCInst *MI,
168169
if ((unsigned)OpNum + 1 < MI->getNumOperands()) {
169170
const MCOperand &MO = MI->getOperand(OpNum + 1);
170171
const MCSymbolRefExpr &refExp = cast<MCSymbolRefExpr>(*MO.getExpr());
171-
switch (refExp.getKind()) {
172-
case MCSymbolRefExpr::VK_TLSGD:
172+
switch (getSpecifier(&refExp)) {
173+
case SystemZMCExpr::VK_TLSGD:
173174
O << ":tls_gdcall:";
174175
break;
175-
case MCSymbolRefExpr::VK_TLSLDM:
176+
case SystemZMCExpr::VK_TLSLDM:
176177
O << ":tls_ldcall:";
177178
break;
178179
default:

llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp

+10-9
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,22 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "SystemZMCAsmInfo.h"
10+
#include "MCTargetDesc/SystemZMCExpr.h"
1011
#include "llvm/MC/MCContext.h"
1112
#include "llvm/MC/MCExpr.h"
1213

1314
using namespace llvm;
1415

1516
const MCAsmInfo::VariantKindDesc variantKindDescs[] = {
16-
{MCSymbolRefExpr::VK_DTPOFF, "DTPOFF"},
17-
{MCSymbolRefExpr::VK_GOT, "GOT"},
18-
{MCSymbolRefExpr::VK_GOTENT, "GOTENT"},
19-
{MCSymbolRefExpr::VK_INDNTPOFF, "INDNTPOFF"},
20-
{MCSymbolRefExpr::VK_NTPOFF, "NTPOFF"},
21-
{MCSymbolRefExpr::VK_PLT, "PLT"},
22-
{MCSymbolRefExpr::VK_TLSGD, "TLSGD"},
23-
{MCSymbolRefExpr::VK_TLSLD, "TLSLD"},
24-
{MCSymbolRefExpr::VK_TLSLDM, "TLSLDM"},
17+
{SystemZMCExpr::VK_DTPOFF, "DTPOFF"},
18+
{SystemZMCExpr::VK_GOT, "GOT"},
19+
{SystemZMCExpr::VK_GOTENT, "GOTENT"},
20+
{SystemZMCExpr::VK_INDNTPOFF, "INDNTPOFF"},
21+
{SystemZMCExpr::VK_NTPOFF, "NTPOFF"},
22+
{SystemZMCExpr::VK_PLT, "PLT"},
23+
{SystemZMCExpr::VK_TLSGD, "TLSGD"},
24+
{SystemZMCExpr::VK_TLSLD, "TLSLD"},
25+
{SystemZMCExpr::VK_TLSLDM, "TLSLDM"},
2526
};
2627

2728
SystemZMCAsmInfoELF::SystemZMCAsmInfoELF(const Triple &TT) {

llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCExpr.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ using namespace llvm;
1212

1313
#define DEBUG_TYPE "systemzmcexpr"
1414

15-
const SystemZMCExpr *SystemZMCExpr::create(VariantKind Kind, const MCExpr *Expr,
16-
MCContext &Ctx) {
15+
const SystemZMCExpr *SystemZMCExpr::create(SystemZMCExpr::Specifier Kind,
16+
const MCExpr *Expr, MCContext &Ctx) {
1717
return new (Ctx) SystemZMCExpr(Kind, Expr);
1818
}
1919

2020
StringRef SystemZMCExpr::getVariantKindName() const {
21-
switch (static_cast<uint32_t>(getKind())) {
22-
case VK_SystemZ_None:
21+
switch (getSpecifier()) {
22+
case VK_None:
2323
return "A";
2424
case VK_SystemZ_RCon:
2525
return "R";
@@ -41,8 +41,8 @@ bool SystemZMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
4141
if (!getSubExpr()->evaluateAsRelocatable(Res, Asm))
4242
return false;
4343

44-
Res =
45-
MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind());
44+
Res = MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(),
45+
getSpecifier());
4646

4747
return true;
4848
}

llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCExpr.h

+27-14
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,37 @@ namespace llvm {
1717

1818
class SystemZMCExpr : public MCTargetExpr {
1919
public:
20-
// HLASM docs for address constants:
21-
// https://www.ibm.com/docs/en/hla-and-tf/1.6?topic=value-address-constants
22-
enum VariantKind {
23-
VK_SystemZ_None,
24-
VK_SystemZ_RCon, // Address of ADA of symbol.
25-
VK_SystemZ_VCon, // Address of external function symbol.
20+
enum Specifier : uint8_t {
21+
VK_None,
22+
23+
VK_DTPOFF = MCSymbolRefExpr::FirstTargetSpecifier,
24+
VK_GOT,
25+
VK_GOTENT,
26+
VK_INDNTPOFF,
27+
VK_NTPOFF,
28+
VK_PLT,
29+
VK_TLSGD,
30+
VK_TLSLD,
31+
VK_TLSLDM,
32+
33+
// HLASM docs for address constants:
34+
// https://www.ibm.com/docs/en/hla-and-tf/1.6?topic=value-address-constants
35+
VK_SystemZ_RCon, // Address of ADA of symbol.
36+
VK_SystemZ_VCon, // Address of external function symbol.
2637
};
2738

2839
private:
29-
const VariantKind Kind;
40+
const Specifier specifier;
3041
const MCExpr *Expr;
3142

32-
explicit SystemZMCExpr(VariantKind Kind, const MCExpr *Expr)
33-
: Kind(Kind), Expr(Expr) {}
43+
explicit SystemZMCExpr(Specifier S, const MCExpr *Expr)
44+
: specifier(S), Expr(Expr) {}
3445

3546
public:
36-
static const SystemZMCExpr *create(VariantKind Kind, const MCExpr *Expr,
47+
static const SystemZMCExpr *create(Specifier Kind, const MCExpr *Expr,
3748
MCContext &Ctx);
3849

39-
/// getOpcode - Get the kind of this expression.
40-
VariantKind getKind() const { return Kind; }
41-
42-
/// getSubExpr - Get the child of this expression.
50+
Specifier getSpecifier() const { return specifier; }
4351
const MCExpr *getSubExpr() const { return Expr; }
4452

4553
StringRef getVariantKindName() const;
@@ -58,6 +66,11 @@ class SystemZMCExpr : public MCTargetExpr {
5866
return E->getKind() == MCExpr::Target;
5967
}
6068
};
69+
70+
static inline SystemZMCExpr::Specifier
71+
getSpecifier(const MCSymbolRefExpr *SRE) {
72+
return SystemZMCExpr::Specifier(SRE->getKind());
73+
}
6174
} // end namespace llvm
6275

6376
#endif

0 commit comments

Comments
 (0)