[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.
This commit is contained in:
Fangrui Song 2025-03-22 17:51:48 -07:00
parent 41b572b99c
commit f3f0b99b1c
7 changed files with 130 additions and 34 deletions

View File

@ -18,6 +18,7 @@
#include "M68kSubtarget.h"
#include "M68kTargetMachine.h"
#include "M68kTargetObjectFile.h"
#include "MCTargetDesc/M68kMCExpr.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/CallingConvLower.h"
@ -2831,8 +2832,7 @@ unsigned M68kTargetLowering::getJumpTableEncoding() const {
const MCExpr *M68kTargetLowering::LowerCustomJumpTableEntry(
const MachineJumpTableInfo *MJTI, const MachineBasicBlock *MBB,
unsigned uid, MCContext &Ctx) const {
return MCSymbolRefExpr::create(MBB->getSymbol(), MCSymbolRefExpr::VK_GOTOFF,
Ctx);
return MCSymbolRefExpr::create(MBB->getSymbol(), M68kMCExpr::VK_GOTOFF, Ctx);
}
SDValue M68kTargetLowering::getPICJumpTableRelocBase(SDValue Table,

View File

@ -18,6 +18,7 @@
#include "M68kInstrInfo.h"
#include "MCTargetDesc/M68kBaseInfo.h"
#include "MCTargetDesc/M68kMCExpr.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstr.h"
@ -75,7 +76,7 @@ MCOperand M68kMCInstLower::LowerSymbolOperand(const MachineOperand &MO,
// FIXME We would like an efficient form for this, so we don't have to do a
// lot of extra uniquing. This fixme is originally from X86
const MCExpr *Expr = nullptr;
MCSymbolRefExpr::VariantKind RefKind = MCSymbolRefExpr::VK_None;
M68kMCExpr::Specifier RefKind = M68kMCExpr::VK_None;
switch (MO.getTargetFlags()) {
default:
@ -85,31 +86,31 @@ MCOperand M68kMCInstLower::LowerSymbolOperand(const MachineOperand &MO,
case M68kII::MO_PC_RELATIVE_ADDRESS:
break;
case M68kII::MO_GOTPCREL:
RefKind = MCSymbolRefExpr::VK_GOTPCREL;
RefKind = M68kMCExpr::VK_GOTPCREL;
break;
case M68kII::MO_GOT:
RefKind = MCSymbolRefExpr::VK_GOT;
RefKind = M68kMCExpr::VK_GOT;
break;
case M68kII::MO_GOTOFF:
RefKind = MCSymbolRefExpr::VK_GOTOFF;
RefKind = M68kMCExpr::VK_GOTOFF;
break;
case M68kII::MO_PLT:
RefKind = MCSymbolRefExpr::VK_PLT;
RefKind = M68kMCExpr::VK_PLT;
break;
case M68kII::MO_TLSGD:
RefKind = MCSymbolRefExpr::VK_TLSGD;
RefKind = M68kMCExpr::VK_TLSGD;
break;
case M68kII::MO_TLSLD:
RefKind = MCSymbolRefExpr::VK_TLSLD;
RefKind = M68kMCExpr::VK_TLSLD;
break;
case M68kII::MO_TLSLDM:
RefKind = MCSymbolRefExpr::VK_TLSLDM;
RefKind = M68kMCExpr::VK_TLSLDM;
break;
case M68kII::MO_TLSIE:
RefKind = MCSymbolRefExpr::VK_GOTTPOFF;
RefKind = M68kMCExpr::VK_GOTTPOFF;
break;
case M68kII::MO_TLSLE:
RefKind = MCSymbolRefExpr::VK_TPOFF;
RefKind = M68kMCExpr::VK_TPOFF;
break;
}

View File

@ -4,6 +4,7 @@ add_llvm_component_library(LLVMM68kDesc
M68kInstPrinter.cpp
M68kMCAsmInfo.cpp
M68kMCCodeEmitter.cpp
M68kMCExpr.cpp
M68kMCTargetDesc.cpp
LINK_COMPONENTS

View File

@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "MCTargetDesc/M68kFixupKinds.h"
#include "MCTargetDesc/M68kMCExpr.h"
#include "MCTargetDesc/M68kMCTargetDesc.h"
#include "llvm/BinaryFormat/ELF.h"
@ -44,8 +45,8 @@ M68kELFObjectWriter::~M68kELFObjectWriter() {}
enum M68kRelType { RT_32, RT_16, RT_8 };
static M68kRelType
getType(unsigned Kind, MCSymbolRefExpr::VariantKind &Modifier, bool &IsPCRel) {
static M68kRelType getType(unsigned Kind, M68kMCExpr::Specifier &Modifier,
bool &IsPCRel) {
switch (Kind) {
case FK_Data_4:
case FK_PCRel_4:
@ -64,14 +65,14 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
const MCValue &Target,
const MCFixup &Fixup,
bool IsPCRel) const {
MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();
auto Specifier = M68kMCExpr::Specifier(Target.getAccessVariant());
unsigned Kind = Fixup.getKind();
M68kRelType Type = getType(Kind, Modifier, IsPCRel);
switch (Modifier) {
M68kRelType Type = getType(Kind, Specifier, IsPCRel);
switch (Specifier) {
default:
llvm_unreachable("Unimplemented");
case MCSymbolRefExpr::VK_TLSGD:
case M68kMCExpr::VK_TLSGD:
switch (Type) {
case RT_32:
return ELF::R_68K_TLS_GD32;
@ -81,7 +82,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
return ELF::R_68K_TLS_GD8;
}
llvm_unreachable("Unrecognized size");
case MCSymbolRefExpr::VK_TLSLDM:
case M68kMCExpr::VK_TLSLDM:
switch (Type) {
case RT_32:
return ELF::R_68K_TLS_LDM32;
@ -91,7 +92,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
return ELF::R_68K_TLS_LDM8;
}
llvm_unreachable("Unrecognized size");
case MCSymbolRefExpr::VK_TLSLD:
case M68kMCExpr::VK_TLSLD:
switch (Type) {
case RT_32:
return ELF::R_68K_TLS_LDO32;
@ -101,7 +102,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
return ELF::R_68K_TLS_LDO8;
}
llvm_unreachable("Unrecognized size");
case MCSymbolRefExpr::VK_GOTTPOFF:
case M68kMCExpr::VK_GOTTPOFF:
switch (Type) {
case RT_32:
return ELF::R_68K_TLS_IE32;
@ -111,7 +112,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
return ELF::R_68K_TLS_IE8;
}
llvm_unreachable("Unrecognized size");
case MCSymbolRefExpr::VK_TPOFF:
case M68kMCExpr::VK_TPOFF:
switch (Type) {
case RT_32:
return ELF::R_68K_TLS_LE32;
@ -121,7 +122,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
return ELF::R_68K_TLS_LE8;
}
llvm_unreachable("Unrecognized size");
case MCSymbolRefExpr::VK_None:
case M68kMCExpr::VK_None:
switch (Type) {
case RT_32:
return IsPCRel ? ELF::R_68K_PC32 : ELF::R_68K_32;
@ -131,7 +132,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
return IsPCRel ? ELF::R_68K_PC8 : ELF::R_68K_8;
}
llvm_unreachable("Unrecognized size");
case MCSymbolRefExpr::VK_GOTPCREL:
case M68kMCExpr::VK_GOTPCREL:
switch (Type) {
case RT_32:
return ELF::R_68K_GOTPCREL32;
@ -141,7 +142,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
return ELF::R_68K_GOTPCREL8;
}
llvm_unreachable("Unrecognized size");
case MCSymbolRefExpr::VK_GOTOFF:
case M68kMCExpr::VK_GOTOFF:
assert(!IsPCRel);
switch (Type) {
case RT_32:
@ -152,7 +153,7 @@ unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,
return ELF::R_68K_GOTOFF8;
}
llvm_unreachable("Unrecognized size");
case MCSymbolRefExpr::VK_PLT:
case M68kMCExpr::VK_PLT:
switch (Type) {
case RT_32:
return ELF::R_68K_PLT32;

View File

@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "M68kMCAsmInfo.h"
#include "MCTargetDesc/M68kMCExpr.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/TargetParser/Triple.h"
@ -19,14 +20,14 @@
using namespace llvm;
const MCAsmInfo::VariantKindDesc variantKindDescs[] = {
{MCSymbolRefExpr::VK_GOTOFF, "GOTOFF"},
{MCSymbolRefExpr::VK_GOTPCREL, "GOTPCREL"},
{MCSymbolRefExpr::VK_GOTTPOFF, "GOTTPOFF"},
{MCSymbolRefExpr::VK_PLT, "PLT"},
{MCSymbolRefExpr::VK_TLSGD, "TLSGD"},
{MCSymbolRefExpr::VK_TLSLD, "TLSLD"},
{MCSymbolRefExpr::VK_TLSLDM, "TLSLDM"},
{MCSymbolRefExpr::VK_TPOFF, "TPOFF"},
{M68kMCExpr::VK_GOTOFF, "GOTOFF"},
{M68kMCExpr::VK_GOTPCREL, "GOTPCREL"},
{M68kMCExpr::VK_GOTTPOFF, "GOTTPOFF"},
{M68kMCExpr::VK_PLT, "PLT"},
{M68kMCExpr::VK_TLSGD, "TLSGD"},
{M68kMCExpr::VK_TLSLD, "TLSLD"},
{M68kMCExpr::VK_TLSLDM, "TLSLDM"},
{M68kMCExpr::VK_TPOFF, "TPOFF"},
};
void M68kELFMCAsmInfo::anchor() {}

View File

@ -0,0 +1,33 @@
//===- M68k specific MC expression classes ----------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "M68kMCExpr.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCValue.h"
using namespace llvm;
const M68kMCExpr *M68kMCExpr::create(const MCExpr *Expr, Specifier S,
MCContext &Ctx) {
return new (Ctx) M68kMCExpr(Expr, S);
}
void M68kMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {}
bool M68kMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
const MCAssembler *Asm) const {
if (!getSubExpr()->evaluateAsRelocatable(Res, Asm))
return false;
Res =
MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), specifier);
return Res.getSymB() ? specifier == VK_None : true;
}
void M68kMCExpr::visitUsedExpr(MCStreamer &S) const { S.visitUsedExpr(*Expr); }

View File

@ -0,0 +1,59 @@
//===- M68k specific MC expression classes ----------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// The MCTargetExpr subclass describes a relocatable expression with a
// M68k-specific relocation specifier.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIB_TARGET_M68K_MCTARGETDESC_M68KMCEXPR_H
#define LLVM_LIB_TARGET_M68K_MCTARGETDESC_M68KMCEXPR_H
#include "llvm/MC/MCExpr.h"
namespace llvm {
class M68kMCExpr : public MCTargetExpr {
public:
enum Specifier {
VK_None,
VK_GOT = MCSymbolRefExpr::FirstTargetSpecifier,
VK_GOTOFF,
VK_GOTPCREL,
VK_GOTTPOFF,
VK_PLT,
VK_TLSGD,
VK_TLSLD,
VK_TLSLDM,
VK_TPOFF,
};
private:
const MCExpr *Expr;
const Specifier specifier;
protected:
explicit M68kMCExpr(const MCExpr *Expr, Specifier S)
: Expr(Expr), specifier(S) {}
public:
static const M68kMCExpr *create(const MCExpr *, Specifier, MCContext &);
Specifier getSpecifier() const { return specifier; }
const MCExpr *getSubExpr() const { return Expr; }
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
bool evaluateAsRelocatableImpl(MCValue &Res,
const MCAssembler *Asm) const override;
void visitUsedExpr(MCStreamer &Streamer) const override;
MCFragment *findAssociatedFragment() const override;
};
} // namespace llvm
#endif