Skip to content

Commit f3f0b99

Browse files
committed
[M68k] Add stub M68kMCExpr and migrate away from MCSymbolRefExpr::VariantKind
Similar to previous migration done for other targets (PowerPC, X86, ARM, etc). In the future, relocation specifiers should be encoded as part of M68kMCExpr instead of MCSymbolRefExpr.
1 parent 41b572b commit f3f0b99

File tree

7 files changed

+130
-34
lines changed

7 files changed

+130
-34
lines changed

llvm/lib/Target/M68k/M68kISelLowering.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "M68kSubtarget.h"
1919
#include "M68kTargetMachine.h"
2020
#include "M68kTargetObjectFile.h"
21+
#include "MCTargetDesc/M68kMCExpr.h"
2122

2223
#include "llvm/ADT/Statistic.h"
2324
#include "llvm/CodeGen/CallingConvLower.h"
@@ -2831,8 +2832,7 @@ unsigned M68kTargetLowering::getJumpTableEncoding() const {
28312832
const MCExpr *M68kTargetLowering::LowerCustomJumpTableEntry(
28322833
const MachineJumpTableInfo *MJTI, const MachineBasicBlock *MBB,
28332834
unsigned uid, MCContext &Ctx) const {
2834-
return MCSymbolRefExpr::create(MBB->getSymbol(), MCSymbolRefExpr::VK_GOTOFF,
2835-
Ctx);
2835+
return MCSymbolRefExpr::create(MBB->getSymbol(), M68kMCExpr::VK_GOTOFF, Ctx);
28362836
}
28372837

28382838
SDValue M68kTargetLowering::getPICJumpTableRelocBase(SDValue Table,

llvm/lib/Target/M68k/M68kMCInstLower.cpp

+11-10
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "M68kInstrInfo.h"
1919

2020
#include "MCTargetDesc/M68kBaseInfo.h"
21+
#include "MCTargetDesc/M68kMCExpr.h"
2122

2223
#include "llvm/CodeGen/MachineFunction.h"
2324
#include "llvm/CodeGen/MachineInstr.h"
@@ -75,7 +76,7 @@ MCOperand M68kMCInstLower::LowerSymbolOperand(const MachineOperand &MO,
7576
// FIXME We would like an efficient form for this, so we don't have to do a
7677
// lot of extra uniquing. This fixme is originally from X86
7778
const MCExpr *Expr = nullptr;
78-
MCSymbolRefExpr::VariantKind RefKind = MCSymbolRefExpr::VK_None;
79+
M68kMCExpr::Specifier RefKind = M68kMCExpr::VK_None;
7980

8081
switch (MO.getTargetFlags()) {
8182
default:
@@ -85,31 +86,31 @@ MCOperand M68kMCInstLower::LowerSymbolOperand(const MachineOperand &MO,
8586
case M68kII::MO_PC_RELATIVE_ADDRESS:
8687
break;
8788
case M68kII::MO_GOTPCREL:
88-
RefKind = MCSymbolRefExpr::VK_GOTPCREL;
89+
RefKind = M68kMCExpr::VK_GOTPCREL;
8990
break;
9091
case M68kII::MO_GOT:
91-
RefKind = MCSymbolRefExpr::VK_GOT;
92+
RefKind = M68kMCExpr::VK_GOT;
9293
break;
9394
case M68kII::MO_GOTOFF:
94-
RefKind = MCSymbolRefExpr::VK_GOTOFF;
95+
RefKind = M68kMCExpr::VK_GOTOFF;
9596
break;
9697
case M68kII::MO_PLT:
97-
RefKind = MCSymbolRefExpr::VK_PLT;
98+
RefKind = M68kMCExpr::VK_PLT;
9899
break;
99100
case M68kII::MO_TLSGD:
100-
RefKind = MCSymbolRefExpr::VK_TLSGD;
101+
RefKind = M68kMCExpr::VK_TLSGD;
101102
break;
102103
case M68kII::MO_TLSLD:
103-
RefKind = MCSymbolRefExpr::VK_TLSLD;
104+
RefKind = M68kMCExpr::VK_TLSLD;
104105
break;
105106
case M68kII::MO_TLSLDM:
106-
RefKind = MCSymbolRefExpr::VK_TLSLDM;
107+
RefKind = M68kMCExpr::VK_TLSLDM;
107108
break;
108109
case M68kII::MO_TLSIE:
109-
RefKind = MCSymbolRefExpr::VK_GOTTPOFF;
110+
RefKind = M68kMCExpr::VK_GOTTPOFF;
110111
break;
111112
case M68kII::MO_TLSLE:
112-
RefKind = MCSymbolRefExpr::VK_TPOFF;
113+
RefKind = M68kMCExpr::VK_TPOFF;
113114
break;
114115
}
115116

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

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ add_llvm_component_library(LLVMM68kDesc
44
M68kInstPrinter.cpp
55
M68kMCAsmInfo.cpp
66
M68kMCCodeEmitter.cpp
7+
M68kMCExpr.cpp
78
M68kMCTargetDesc.cpp
89

910
LINK_COMPONENTS

llvm/lib/Target/M68k/MCTargetDesc/M68kELFObjectWriter.cpp

+15-14
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
//===----------------------------------------------------------------------===//
1313

1414
#include "MCTargetDesc/M68kFixupKinds.h"
15+
#include "MCTargetDesc/M68kMCExpr.h"
1516
#include "MCTargetDesc/M68kMCTargetDesc.h"
1617

1718
#include "llvm/BinaryFormat/ELF.h"
@@ -44,8 +45,8 @@ M68kELFObjectWriter::~M68kELFObjectWriter() {}
4445

4546
enum M68kRelType { RT_32, RT_16, RT_8 };
4647

47-
static M68kRelType
48-
getType(unsigned Kind, MCSymbolRefExpr::VariantKind &Modifier, bool &IsPCRel) {
48+
static M68kRelType getType(unsigned Kind, M68kMCExpr::Specifier &Modifier,
49+
bool &IsPCRel) {
4950
switch (Kind) {
5051
case FK_Data_4:
5152
case FK_PCRel_4:
@@ -64,14 +65,14 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
6465
const MCValue &Target,
6566
const MCFixup &Fixup,
6667
bool IsPCRel) const {
67-
MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();
68+
auto Specifier = M68kMCExpr::Specifier(Target.getAccessVariant());
6869
unsigned Kind = Fixup.getKind();
69-
M68kRelType Type = getType(Kind, Modifier, IsPCRel);
70-
switch (Modifier) {
70+
M68kRelType Type = getType(Kind, Specifier, IsPCRel);
71+
switch (Specifier) {
7172
default:
7273
llvm_unreachable("Unimplemented");
7374

74-
case MCSymbolRefExpr::VK_TLSGD:
75+
case M68kMCExpr::VK_TLSGD:
7576
switch (Type) {
7677
case RT_32:
7778
return ELF::R_68K_TLS_GD32;
@@ -81,7 +82,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
8182
return ELF::R_68K_TLS_GD8;
8283
}
8384
llvm_unreachable("Unrecognized size");
84-
case MCSymbolRefExpr::VK_TLSLDM:
85+
case M68kMCExpr::VK_TLSLDM:
8586
switch (Type) {
8687
case RT_32:
8788
return ELF::R_68K_TLS_LDM32;
@@ -91,7 +92,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
9192
return ELF::R_68K_TLS_LDM8;
9293
}
9394
llvm_unreachable("Unrecognized size");
94-
case MCSymbolRefExpr::VK_TLSLD:
95+
case M68kMCExpr::VK_TLSLD:
9596
switch (Type) {
9697
case RT_32:
9798
return ELF::R_68K_TLS_LDO32;
@@ -101,7 +102,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
101102
return ELF::R_68K_TLS_LDO8;
102103
}
103104
llvm_unreachable("Unrecognized size");
104-
case MCSymbolRefExpr::VK_GOTTPOFF:
105+
case M68kMCExpr::VK_GOTTPOFF:
105106
switch (Type) {
106107
case RT_32:
107108
return ELF::R_68K_TLS_IE32;
@@ -111,7 +112,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
111112
return ELF::R_68K_TLS_IE8;
112113
}
113114
llvm_unreachable("Unrecognized size");
114-
case MCSymbolRefExpr::VK_TPOFF:
115+
case M68kMCExpr::VK_TPOFF:
115116
switch (Type) {
116117
case RT_32:
117118
return ELF::R_68K_TLS_LE32;
@@ -121,7 +122,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
121122
return ELF::R_68K_TLS_LE8;
122123
}
123124
llvm_unreachable("Unrecognized size");
124-
case MCSymbolRefExpr::VK_None:
125+
case M68kMCExpr::VK_None:
125126
switch (Type) {
126127
case RT_32:
127128
return IsPCRel ? ELF::R_68K_PC32 : ELF::R_68K_32;
@@ -131,7 +132,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
131132
return IsPCRel ? ELF::R_68K_PC8 : ELF::R_68K_8;
132133
}
133134
llvm_unreachable("Unrecognized size");
134-
case MCSymbolRefExpr::VK_GOTPCREL:
135+
case M68kMCExpr::VK_GOTPCREL:
135136
switch (Type) {
136137
case RT_32:
137138
return ELF::R_68K_GOTPCREL32;
@@ -141,7 +142,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
141142
return ELF::R_68K_GOTPCREL8;
142143
}
143144
llvm_unreachable("Unrecognized size");
144-
case MCSymbolRefExpr::VK_GOTOFF:
145+
case M68kMCExpr::VK_GOTOFF:
145146
assert(!IsPCRel);
146147
switch (Type) {
147148
case RT_32:
@@ -152,7 +153,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
152153
return ELF::R_68K_GOTOFF8;
153154
}
154155
llvm_unreachable("Unrecognized size");
155-
case MCSymbolRefExpr::VK_PLT:
156+
case M68kMCExpr::VK_PLT:
156157
switch (Type) {
157158
case RT_32:
158159
return ELF::R_68K_PLT32;

llvm/lib/Target/M68k/MCTargetDesc/M68kMCAsmInfo.cpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,22 @@
1212
//===----------------------------------------------------------------------===//
1313

1414
#include "M68kMCAsmInfo.h"
15+
#include "MCTargetDesc/M68kMCExpr.h"
1516

1617
#include "llvm/MC/MCExpr.h"
1718
#include "llvm/TargetParser/Triple.h"
1819

1920
using namespace llvm;
2021

2122
const MCAsmInfo::VariantKindDesc variantKindDescs[] = {
22-
{MCSymbolRefExpr::VK_GOTOFF, "GOTOFF"},
23-
{MCSymbolRefExpr::VK_GOTPCREL, "GOTPCREL"},
24-
{MCSymbolRefExpr::VK_GOTTPOFF, "GOTTPOFF"},
25-
{MCSymbolRefExpr::VK_PLT, "PLT"},
26-
{MCSymbolRefExpr::VK_TLSGD, "TLSGD"},
27-
{MCSymbolRefExpr::VK_TLSLD, "TLSLD"},
28-
{MCSymbolRefExpr::VK_TLSLDM, "TLSLDM"},
29-
{MCSymbolRefExpr::VK_TPOFF, "TPOFF"},
23+
{M68kMCExpr::VK_GOTOFF, "GOTOFF"},
24+
{M68kMCExpr::VK_GOTPCREL, "GOTPCREL"},
25+
{M68kMCExpr::VK_GOTTPOFF, "GOTTPOFF"},
26+
{M68kMCExpr::VK_PLT, "PLT"},
27+
{M68kMCExpr::VK_TLSGD, "TLSGD"},
28+
{M68kMCExpr::VK_TLSLD, "TLSLD"},
29+
{M68kMCExpr::VK_TLSLDM, "TLSLDM"},
30+
{M68kMCExpr::VK_TPOFF, "TPOFF"},
3031
};
3132

3233
void M68kELFMCAsmInfo::anchor() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//===- M68k specific MC expression classes ----------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "M68kMCExpr.h"
10+
#include "llvm/MC/MCContext.h"
11+
#include "llvm/MC/MCStreamer.h"
12+
#include "llvm/MC/MCValue.h"
13+
14+
using namespace llvm;
15+
16+
const M68kMCExpr *M68kMCExpr::create(const MCExpr *Expr, Specifier S,
17+
MCContext &Ctx) {
18+
return new (Ctx) M68kMCExpr(Expr, S);
19+
}
20+
21+
void M68kMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {}
22+
23+
bool M68kMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
24+
const MCAssembler *Asm) const {
25+
if (!getSubExpr()->evaluateAsRelocatable(Res, Asm))
26+
return false;
27+
28+
Res =
29+
MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), specifier);
30+
return Res.getSymB() ? specifier == VK_None : true;
31+
}
32+
33+
void M68kMCExpr::visitUsedExpr(MCStreamer &S) const { S.visitUsedExpr(*Expr); }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//===- M68k specific MC expression classes ----------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// The MCTargetExpr subclass describes a relocatable expression with a
10+
// M68k-specific relocation specifier.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
#ifndef LLVM_LIB_TARGET_M68K_MCTARGETDESC_M68KMCEXPR_H
15+
#define LLVM_LIB_TARGET_M68K_MCTARGETDESC_M68KMCEXPR_H
16+
17+
#include "llvm/MC/MCExpr.h"
18+
19+
namespace llvm {
20+
21+
class M68kMCExpr : public MCTargetExpr {
22+
public:
23+
enum Specifier {
24+
VK_None,
25+
26+
VK_GOT = MCSymbolRefExpr::FirstTargetSpecifier,
27+
VK_GOTOFF,
28+
VK_GOTPCREL,
29+
VK_GOTTPOFF,
30+
VK_PLT,
31+
VK_TLSGD,
32+
VK_TLSLD,
33+
VK_TLSLDM,
34+
VK_TPOFF,
35+
};
36+
37+
private:
38+
const MCExpr *Expr;
39+
const Specifier specifier;
40+
41+
protected:
42+
explicit M68kMCExpr(const MCExpr *Expr, Specifier S)
43+
: Expr(Expr), specifier(S) {}
44+
45+
public:
46+
static const M68kMCExpr *create(const MCExpr *, Specifier, MCContext &);
47+
48+
Specifier getSpecifier() const { return specifier; }
49+
const MCExpr *getSubExpr() const { return Expr; }
50+
51+
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
52+
bool evaluateAsRelocatableImpl(MCValue &Res,
53+
const MCAssembler *Asm) const override;
54+
void visitUsedExpr(MCStreamer &Streamer) const override;
55+
MCFragment *findAssociatedFragment() const override;
56+
};
57+
} // namespace llvm
58+
59+
#endif

0 commit comments

Comments
 (0)