From f3f0b99b1c7520b065cf79f0e0901fc8d2c1d4ec Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sat, 22 Mar 2025 17:51:48 -0700 Subject: [PATCH] [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. --- llvm/lib/Target/M68k/M68kISelLowering.cpp | 4 +- llvm/lib/Target/M68k/M68kMCInstLower.cpp | 21 +++---- .../Target/M68k/MCTargetDesc/CMakeLists.txt | 1 + .../M68k/MCTargetDesc/M68kELFObjectWriter.cpp | 29 ++++----- .../M68k/MCTargetDesc/M68kMCAsmInfo.cpp | 17 +++--- .../Target/M68k/MCTargetDesc/M68kMCExpr.cpp | 33 +++++++++++ .../lib/Target/M68k/MCTargetDesc/M68kMCExpr.h | 59 +++++++++++++++++++ 7 files changed, 130 insertions(+), 34 deletions(-) create mode 100644 llvm/lib/Target/M68k/MCTargetDesc/M68kMCExpr.cpp create mode 100644 llvm/lib/Target/M68k/MCTargetDesc/M68kMCExpr.h diff --git a/llvm/lib/Target/M68k/M68kISelLowering.cpp b/llvm/lib/Target/M68k/M68kISelLowering.cpp index aebeaf0e3db5..616b1f622619 100644 --- a/llvm/lib/Target/M68k/M68kISelLowering.cpp +++ b/llvm/lib/Target/M68k/M68kISelLowering.cpp @@ -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, diff --git a/llvm/lib/Target/M68k/M68kMCInstLower.cpp b/llvm/lib/Target/M68k/M68kMCInstLower.cpp index b24d2d231c45..957c0f9d3da8 100644 --- a/llvm/lib/Target/M68k/M68kMCInstLower.cpp +++ b/llvm/lib/Target/M68k/M68kMCInstLower.cpp @@ -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; } diff --git a/llvm/lib/Target/M68k/MCTargetDesc/CMakeLists.txt b/llvm/lib/Target/M68k/MCTargetDesc/CMakeLists.txt index 1127b3b547f1..0146e21acf36 100644 --- a/llvm/lib/Target/M68k/MCTargetDesc/CMakeLists.txt +++ b/llvm/lib/Target/M68k/MCTargetDesc/CMakeLists.txt @@ -4,6 +4,7 @@ add_llvm_component_library(LLVMM68kDesc M68kInstPrinter.cpp M68kMCAsmInfo.cpp M68kMCCodeEmitter.cpp + M68kMCExpr.cpp M68kMCTargetDesc.cpp LINK_COMPONENTS diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kELFObjectWriter.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kELFObjectWriter.cpp index cac068e4dddf..950f14d3b910 100644 --- a/llvm/lib/Target/M68k/MCTargetDesc/M68kELFObjectWriter.cpp +++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kELFObjectWriter.cpp @@ -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; diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCAsmInfo.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCAsmInfo.cpp index 53534a02111e..ba1b0dc2bb09 100644 --- a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCAsmInfo.cpp +++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCAsmInfo.cpp @@ -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() {} diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCExpr.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCExpr.cpp new file mode 100644 index 000000000000..d8019f5eb785 --- /dev/null +++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCExpr.cpp @@ -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); } diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCExpr.h b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCExpr.h new file mode 100644 index 000000000000..a38569e322ae --- /dev/null +++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCExpr.h @@ -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