[llvm] 2ed0401 - CSKY: Migrate to the new relocation specifier representation

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sat Jun 28 15:33:09 PDT 2025


Author: Fangrui Song
Date: 2025-06-28T15:33:04-07:00
New Revision: 2ed04016120f18b35967b8b5a2ed54406a9711fd

URL: https://github.com/llvm/llvm-project/commit/2ed04016120f18b35967b8b5a2ed54406a9711fd
DIFF: https://github.com/llvm/llvm-project/commit/2ed04016120f18b35967b8b5a2ed54406a9711fd.diff

LOG: CSKY: Migrate to the new relocation specifier representation

Use MCSpecifierExpr directly and remove the CSKYMCExpr subclass. Define
printImpl within CSKYMCAsmInfo.

Added: 
    

Modified: 
    llvm/lib/Target/CSKY/AsmParser/CSKYAsmParser.cpp
    llvm/lib/Target/CSKY/CSKYAsmPrinter.cpp
    llvm/lib/Target/CSKY/CSKYMCInstLower.cpp
    llvm/lib/Target/CSKY/MCTargetDesc/CMakeLists.txt
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCAsmInfo.cpp
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCAsmInfo.h
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.h
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.cpp
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.h

Removed: 
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.cpp
    llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.h


################################################################################
diff  --git a/llvm/lib/Target/CSKY/AsmParser/CSKYAsmParser.cpp b/llvm/lib/Target/CSKY/AsmParser/CSKYAsmParser.cpp
index 727f83d43c8a0..5f7e1497a1ebf 100644
--- a/llvm/lib/Target/CSKY/AsmParser/CSKYAsmParser.cpp
+++ b/llvm/lib/Target/CSKY/AsmParser/CSKYAsmParser.cpp
@@ -8,7 +8,6 @@
 
 #include "MCTargetDesc/CSKYInstPrinter.h"
 #include "MCTargetDesc/CSKYMCAsmInfo.h"
-#include "MCTargetDesc/CSKYMCExpr.h"
 #include "MCTargetDesc/CSKYMCTargetDesc.h"
 #include "MCTargetDesc/CSKYTargetStreamer.h"
 #include "TargetInfo/CSKYTargetInfo.h"
@@ -849,11 +848,11 @@ bool CSKYAsmParser::processLRW(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out) {
     }
   } else {
     const MCExpr *AdjustExpr = nullptr;
-    if (const CSKYMCExpr *CSKYExpr =
-            dyn_cast<CSKYMCExpr>(Inst.getOperand(1).getExpr())) {
-      if (CSKYExpr->getSpecifier() == CSKYMCExpr::VK_TLSGD ||
-          CSKYExpr->getSpecifier() == CSKYMCExpr::VK_TLSIE ||
-          CSKYExpr->getSpecifier() == CSKYMCExpr::VK_TLSLDM) {
+    if (const auto *CSKYExpr =
+            dyn_cast<MCSpecifierExpr>(Inst.getOperand(1).getExpr())) {
+      if (CSKYExpr->getSpecifier() == CSKY::S_TLSGD ||
+          CSKYExpr->getSpecifier() == CSKY::S_TLSIE ||
+          CSKYExpr->getSpecifier() == CSKY::S_TLSLDM) {
         MCSymbol *Dot = getContext().createNamedTempSymbol();
         Out.emitLabel(Dot);
         AdjustExpr = MCSymbolRefExpr::create(Dot, getContext());
@@ -1173,25 +1172,25 @@ ParseStatus CSKYAsmParser::parseCSKYSymbol(OperandVector &Operands) {
   if (getParser().parseIdentifier(Identifier))
     return Error(getLoc(), "unknown identifier");
 
-  CSKYMCExpr::Specifier Kind = CSKYMCExpr::VK_None;
+  CSKY::Specifier Kind = CSKY::S_None;
   if (Identifier.consume_back("@GOT"))
-    Kind = CSKYMCExpr::VK_GOT;
+    Kind = CSKY::S_GOT;
   else if (Identifier.consume_back("@GOTOFF"))
-    Kind = CSKYMCExpr::VK_GOTOFF;
+    Kind = CSKY::S_GOTOFF;
   else if (Identifier.consume_back("@PLT"))
-    Kind = CSKYMCExpr::VK_PLT;
+    Kind = CSKY::S_PLT;
   else if (Identifier.consume_back("@GOTPC"))
-    Kind = CSKYMCExpr::VK_GOTPC;
+    Kind = CSKY::S_GOTPC;
   else if (Identifier.consume_back("@TLSGD32"))
-    Kind = CSKYMCExpr::VK_TLSGD;
+    Kind = CSKY::S_TLSGD;
   else if (Identifier.consume_back("@GOTTPOFF"))
-    Kind = CSKYMCExpr::VK_TLSIE;
+    Kind = CSKY::S_TLSIE;
   else if (Identifier.consume_back("@TPOFF"))
-    Kind = CSKYMCExpr::VK_TLSLE;
+    Kind = CSKY::S_TLSLE;
   else if (Identifier.consume_back("@TLSLDM32"))
-    Kind = CSKYMCExpr::VK_TLSLDM;
+    Kind = CSKY::S_TLSLDM;
   else if (Identifier.consume_back("@TLSLDO32"))
-    Kind = CSKYMCExpr::VK_TLSLDO;
+    Kind = CSKY::S_TLSLDO;
 
   MCSymbol *Sym = getContext().getInlineAsmLabel(Identifier);
 
@@ -1211,8 +1210,8 @@ ParseStatus CSKYAsmParser::parseCSKYSymbol(OperandVector &Operands) {
   MCBinaryExpr::Opcode Opcode;
   switch (getLexer().getKind()) {
   default:
-    if (Kind != CSKYMCExpr::VK_None)
-      Res = CSKYMCExpr::create(Res, Kind, getContext());
+    if (Kind != CSKY::S_None)
+      Res = MCSpecifierExpr::create(Res, Kind, getContext());
 
     Operands.push_back(CSKYOperand::createImm(Res, S, E));
     return ParseStatus::Success;
@@ -1259,11 +1258,11 @@ ParseStatus CSKYAsmParser::parseDataSymbol(OperandVector &Operands) {
   if (getParser().parseIdentifier(Identifier))
     return Error(getLoc(), "unknown identifier " + Identifier);
 
-  CSKYMCExpr::Specifier Kind = CSKYMCExpr::VK_None;
+  CSKY::Specifier Kind = CSKY::S_None;
   if (Identifier.consume_back("@GOT"))
-    Kind = CSKYMCExpr::VK_GOT_IMM18_BY4;
+    Kind = CSKY::S_GOT_IMM18_BY4;
   else if (Identifier.consume_back("@PLT"))
-    Kind = CSKYMCExpr::VK_PLT_IMM18_BY4;
+    Kind = CSKY::S_PLT_IMM18_BY4;
 
   MCSymbol *Sym = getContext().getInlineAsmLabel(Identifier);
 
@@ -1289,8 +1288,8 @@ ParseStatus CSKYAsmParser::parseDataSymbol(OperandVector &Operands) {
 
     getLexer().Lex(); // Eat ']'.
 
-    if (Kind != CSKYMCExpr::VK_None)
-      Res = CSKYMCExpr::create(Res, Kind, getContext());
+    if (Kind != CSKY::S_None)
+      Res = MCSpecifierExpr::create(Res, Kind, getContext());
 
     Operands.push_back(CSKYOperand::createConstpoolOp(Res, S, E));
     return ParseStatus::Success;

diff  --git a/llvm/lib/Target/CSKY/CSKYAsmPrinter.cpp b/llvm/lib/Target/CSKY/CSKYAsmPrinter.cpp
index 9a259eac52f47..7e1eb9d9ec43a 100644
--- a/llvm/lib/Target/CSKY/CSKYAsmPrinter.cpp
+++ b/llvm/lib/Target/CSKY/CSKYAsmPrinter.cpp
@@ -15,7 +15,7 @@
 #include "CSKYConstantPoolValue.h"
 #include "CSKYTargetMachine.h"
 #include "MCTargetDesc/CSKYInstPrinter.h"
-#include "MCTargetDesc/CSKYMCExpr.h"
+#include "MCTargetDesc/CSKYMCAsmInfo.h"
 #include "MCTargetDesc/CSKYTargetStreamer.h"
 #include "TargetInfo/CSKYTargetInfo.h"
 #include "llvm/ADT/Statistic.h"
@@ -168,25 +168,24 @@ void CSKYAsmPrinter::emitInstruction(const MachineInstr *MI) {
 
 // Convert a CSKY-specific constant pool modifier into the associated
 // MCSymbolRefExpr variant kind.
-static CSKYMCExpr::Specifier
-getModifierVariantKind(CSKYCP::CSKYCPModifier Modifier) {
+static CSKY::Specifier getModifierVariantKind(CSKYCP::CSKYCPModifier Modifier) {
   switch (Modifier) {
   case CSKYCP::NO_MOD:
-    return CSKYMCExpr::VK_None;
+    return CSKY::S_None;
   case CSKYCP::ADDR:
-    return CSKYMCExpr::VK_ADDR;
+    return CSKY::S_ADDR;
   case CSKYCP::GOT:
-    return CSKYMCExpr::VK_GOT;
+    return CSKY::S_GOT;
   case CSKYCP::GOTOFF:
-    return CSKYMCExpr::VK_GOTOFF;
+    return CSKY::S_GOTOFF;
   case CSKYCP::PLT:
-    return CSKYMCExpr::VK_PLT;
+    return CSKY::S_PLT;
   case CSKYCP::TLSGD:
-    return CSKYMCExpr::VK_TLSGD;
+    return CSKY::S_TLSGD;
   case CSKYCP::TLSLE:
-    return CSKYMCExpr::VK_TLSLE;
+    return CSKY::S_TLSLE;
   case CSKYCP::TLSIE:
-    return CSKYMCExpr::VK_TLSIE;
+    return CSKY::S_TLSIE;
   }
   llvm_unreachable("Invalid CSKYCPModifier!");
 }
@@ -240,8 +239,8 @@ void CSKYAsmPrinter::emitMachineConstantPoolValue(
   }
 
   // Create an MCSymbol for the reference.
-  Expr = CSKYMCExpr::create(Expr, getModifierVariantKind(CCPV->getModifier()),
-                            OutContext);
+  Expr = MCSpecifierExpr::create(
+      Expr, getModifierVariantKind(CCPV->getModifier()), OutContext);
 
   OutStreamer->emitValue(Expr, Size);
 }

diff  --git a/llvm/lib/Target/CSKY/CSKYMCInstLower.cpp b/llvm/lib/Target/CSKY/CSKYMCInstLower.cpp
index a91f94bb2357a..db38c622dcd2d 100644
--- a/llvm/lib/Target/CSKY/CSKYMCInstLower.cpp
+++ b/llvm/lib/Target/CSKY/CSKYMCInstLower.cpp
@@ -13,7 +13,7 @@
 
 #include "CSKYMCInstLower.h"
 #include "MCTargetDesc/CSKYBaseInfo.h"
-#include "MCTargetDesc/CSKYMCExpr.h"
+#include "MCTargetDesc/CSKYMCAsmInfo.h"
 #include "llvm/CodeGen/AsmPrinter.h"
 #include "llvm/MC/MCExpr.h"
 
@@ -36,38 +36,38 @@ void CSKYMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
 
 MCOperand CSKYMCInstLower::lowerSymbolOperand(const MachineOperand &MO,
                                               MCSymbol *Sym) const {
-  CSKYMCExpr::Specifier Spec;
+  CSKY::Specifier Spec;
   MCContext &Ctx = Printer.OutContext;
 
   switch (MO.getTargetFlags()) {
   default:
     llvm_unreachable("Unknown target flag.");
   case CSKYII::MO_None:
-    Spec = CSKYMCExpr::VK_None;
+    Spec = CSKY::S_None;
     break;
   case CSKYII::MO_GOT32:
-    Spec = CSKYMCExpr::VK_GOT;
+    Spec = CSKY::S_GOT;
     break;
   case CSKYII::MO_GOTOFF:
-    Spec = CSKYMCExpr::VK_GOTOFF;
+    Spec = CSKY::S_GOTOFF;
     break;
   case CSKYII::MO_ADDR32:
-    Spec = CSKYMCExpr::VK_ADDR;
+    Spec = CSKY::S_ADDR;
     break;
   case CSKYII::MO_PLT32:
-    Spec = CSKYMCExpr::VK_PLT;
+    Spec = CSKY::S_PLT;
     break;
   case CSKYII::MO_ADDR_HI16:
-    Spec = CSKYMCExpr::VK_ADDR_HI16;
+    Spec = CSKY::S_ADDR_HI16;
     break;
   case CSKYII::MO_ADDR_LO16:
-    Spec = CSKYMCExpr::VK_ADDR_LO16;
+    Spec = CSKY::S_ADDR_LO16;
     break;
   }
   const MCExpr *ME = MCSymbolRefExpr::create(Sym, Ctx);
 
-  if (Spec != CSKYMCExpr::VK_None)
-    ME = CSKYMCExpr::create(ME, Spec, Ctx);
+  if (Spec != CSKY::S_None)
+    ME = MCSpecifierExpr::create(ME, Spec, Ctx);
 
   return MCOperand::createExpr(ME);
 }

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CMakeLists.txt b/llvm/lib/Target/CSKY/MCTargetDesc/CMakeLists.txt
index 73b4429349ea8..e0932808bb7af 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CMakeLists.txt
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CMakeLists.txt
@@ -4,7 +4,6 @@ add_llvm_component_library(LLVMCSKYDesc
   CSKYELFStreamer.cpp
   CSKYInstPrinter.cpp
   CSKYMCAsmInfo.cpp
-  CSKYMCExpr.cpp
   CSKYMCTargetDesc.cpp
   CSKYMCCodeEmitter.cpp
   CSKYTargetStreamer.cpp

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp
index 0a2087db3fee4..56ed411c39f76 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp
@@ -7,9 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "CSKYFixupKinds.h"
-#include "CSKYMCExpr.h"
+#include "CSKYMCAsmInfo.h"
 #include "CSKYMCTargetDesc.h"
-#include "MCTargetDesc/CSKYMCExpr.h"
+#include "MCTargetDesc/CSKYMCAsmInfo.h"
 #include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCELFObjectWriter.h"
 #include "llvm/MC/MCObjectWriter.h"
@@ -43,11 +43,11 @@ unsigned CSKYELFObjectWriter::getRelocType(const MCFixup &Fixup,
   uint8_t Modifier = Target.getSpecifier();
 
   switch (Target.getSpecifier()) {
-  case CSKYMCExpr::VK_TLSIE:
-  case CSKYMCExpr::VK_TLSLE:
-  case CSKYMCExpr::VK_TLSGD:
-  case CSKYMCExpr::VK_TLSLDM:
-  case CSKYMCExpr::VK_TLSLDO:
+  case CSKY::S_TLSIE:
+  case CSKY::S_TLSLE:
+  case CSKY::S_TLSGD:
+  case CSKY::S_TLSLDM:
+  case CSKY::S_TLSLDO:
     if (auto *SA = Target.getAddSym())
       cast<MCSymbolELF>(SA)->setType(ELF::STT_TLS);
     break;
@@ -93,29 +93,29 @@ unsigned CSKYELFObjectWriter::getRelocType(const MCFixup &Fixup,
     reportError(Fixup.getLoc(), "2-byte data relocations not supported");
     return ELF::R_CKCORE_NONE;
   case FK_Data_4:
-    if (Expr->getKind() == MCExpr::Target) {
-      auto TK = cast<CSKYMCExpr>(Expr)->getSpecifier();
-      if (TK == CSKYMCExpr::VK_ADDR)
+    if (Expr->getKind() == MCExpr::Specifier) {
+      auto TK = cast<MCSpecifierExpr>(Expr)->getSpecifier();
+      if (TK == CSKY::S_ADDR)
         return ELF::R_CKCORE_ADDR32;
-      if (TK == CSKYMCExpr::VK_GOT)
+      if (TK == CSKY::S_GOT)
         return ELF::R_CKCORE_GOT32;
-      if (TK == CSKYMCExpr::VK_GOTOFF)
+      if (TK == CSKY::S_GOTOFF)
         return ELF::R_CKCORE_GOTOFF;
-      if (TK == CSKYMCExpr::VK_PLT)
+      if (TK == CSKY::S_PLT)
         return ELF::R_CKCORE_PLT32;
-      if (TK == CSKYMCExpr::VK_TLSIE)
+      if (TK == CSKY::S_TLSIE)
         return ELF::R_CKCORE_TLS_IE32;
-      if (TK == CSKYMCExpr::VK_TLSLE)
+      if (TK == CSKY::S_TLSLE)
         return ELF::R_CKCORE_TLS_LE32;
-      if (TK == CSKYMCExpr::VK_TLSGD)
+      if (TK == CSKY::S_TLSGD)
         return ELF::R_CKCORE_TLS_GD32;
-      if (TK == CSKYMCExpr::VK_TLSLDM)
+      if (TK == CSKY::S_TLSLDM)
         return ELF::R_CKCORE_TLS_LDM32;
-      if (TK == CSKYMCExpr::VK_TLSLDO)
+      if (TK == CSKY::S_TLSLDO)
         return ELF::R_CKCORE_TLS_LDO32;
-      if (TK == CSKYMCExpr::VK_GOTPC)
+      if (TK == CSKY::S_GOTPC)
         return ELF::R_CKCORE_GOTPC;
-      if (TK == CSKYMCExpr::VK_None)
+      if (TK == CSKY::S_None)
         return ELF::R_CKCORE_ADDR32;
 
       LLVM_DEBUG(dbgs() << "Unknown FK_Data_4 TK  = " << TK);
@@ -125,19 +125,19 @@ unsigned CSKYELFObjectWriter::getRelocType(const MCFixup &Fixup,
       default:
         reportError(Fixup.getLoc(), "invalid fixup for 4-byte data relocation");
         return ELF::R_CKCORE_NONE;
-      case CSKYMCExpr::VK_GOT:
+      case CSKY::S_GOT:
         return ELF::R_CKCORE_GOT32;
-      case CSKYMCExpr::VK_GOTOFF:
+      case CSKY::S_GOTOFF:
         return ELF::R_CKCORE_GOTOFF;
-      case CSKYMCExpr::VK_PLT:
+      case CSKY::S_PLT:
         return ELF::R_CKCORE_PLT32;
-      case CSKYMCExpr::VK_TLSGD:
+      case CSKY::S_TLSGD:
         return ELF::R_CKCORE_TLS_GD32;
-      case CSKYMCExpr::VK_TLSLDM:
+      case CSKY::S_TLSLDM:
         return ELF::R_CKCORE_TLS_LDM32;
-      case CSKYMCExpr::VK_TPOFF:
+      case CSKY::S_TPOFF:
         return ELF::R_CKCORE_TLS_LE32;
-      case CSKYMCExpr::VK_None:
+      case CSKY::S_None:
         return ELF::R_CKCORE_ADDR32;
       }
     }
@@ -167,8 +167,8 @@ unsigned CSKYELFObjectWriter::getRelocType(const MCFixup &Fixup,
 bool CSKYELFObjectWriter::needsRelocateWithSymbol(const MCValue &V,
                                                   unsigned Type) const {
   switch (V.getSpecifier()) {
-  case CSKYMCExpr::VK_PLT:
-  case CSKYMCExpr::VK_GOT:
+  case CSKY::S_PLT:
+  case CSKY::S_GOT:
     return true;
   default:
     return false;

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp
index 981712a5089a1..90428e34cefa3 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYInstPrinter.cpp
@@ -11,7 +11,7 @@
 //===----------------------------------------------------------------------===//
 #include "CSKYInstPrinter.h"
 #include "MCTargetDesc/CSKYBaseInfo.h"
-#include "MCTargetDesc/CSKYMCExpr.h"
+#include "MCTargetDesc/CSKYMCAsmInfo.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/MC/MCAsmInfo.h"

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCAsmInfo.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCAsmInfo.cpp
index 6e10ce4570c06..803b75332f7b0 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCAsmInfo.cpp
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCAsmInfo.cpp
@@ -11,7 +11,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "CSKYMCAsmInfo.h"
-#include "MCTargetDesc/CSKYMCExpr.h"
+#include "MCTargetDesc/CSKYMCAsmInfo.h"
 #include "llvm/BinaryFormat/Dwarf.h"
 #include "llvm/MC/MCExpr.h"
 #include "llvm/MC/MCStreamer.h"
@@ -19,9 +19,9 @@
 using namespace llvm;
 
 const MCAsmInfo::AtSpecifier atSpecifiers[] = {
-    {CSKYMCExpr::VK_GOT, "GOT"},       {CSKYMCExpr::VK_GOTOFF, "GOTOFF"},
-    {CSKYMCExpr::VK_PLT, "PLT"},       {CSKYMCExpr::VK_TLSGD, "TLSGD"},
-    {CSKYMCExpr::VK_TLSLDM, "TLSLDM"}, {CSKYMCExpr::VK_TPOFF, "TPOFF"},
+    {CSKY::S_GOT, "GOT"},       {CSKY::S_GOTOFF, "GOTOFF"},
+    {CSKY::S_PLT, "PLT"},       {CSKY::S_TLSGD, "TLSGD"},
+    {CSKY::S_TLSLDM, "TLSLDM"}, {CSKY::S_TPOFF, "TPOFF"},
 };
 
 void CSKYMCAsmInfo::anchor() {}
@@ -38,3 +38,44 @@ CSKYMCAsmInfo::CSKYMCAsmInfo(const Triple &TargetTriple) {
 
   initializeAtSpecifiers(atSpecifiers);
 }
+
+static StringRef getVariantKindName(uint8_t Kind) {
+  using namespace CSKY;
+  switch (Kind) {
+  default:
+    llvm_unreachable("Invalid ELF symbol kind");
+  case S_None:
+  case S_ADDR:
+    return "";
+  case S_ADDR_HI16:
+    return "@HI16";
+  case S_ADDR_LO16:
+    return "@LO16";
+  case S_GOT_IMM18_BY4:
+  case S_GOT:
+    return "@GOT";
+  case S_GOTPC:
+    return "@GOTPC";
+  case S_GOTOFF:
+    return "@GOTOFF";
+  case S_PLT_IMM18_BY4:
+  case S_PLT:
+    return "@PLT";
+  case S_TLSLE:
+    return "@TPOFF";
+  case S_TLSIE:
+    return "@GOTTPOFF";
+  case S_TLSGD:
+    return "@TLSGD32";
+  case S_TLSLDO:
+    return "@TLSLDO32";
+  case S_TLSLDM:
+    return "@TLSLDM32";
+  }
+}
+
+void CSKYMCAsmInfo::printSpecifierExpr(raw_ostream &OS,
+                                       const MCSpecifierExpr &Expr) const {
+  printExpr(OS, *Expr.getSubExpr());
+  OS << getVariantKindName(Expr.getSpecifier());
+}

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCAsmInfo.h b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCAsmInfo.h
index 3e0609f195311..aa4ba147c00a5 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCAsmInfo.h
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCAsmInfo.h
@@ -14,6 +14,8 @@
 #define LLVM_LIB_TARGET_CSKY_MCTARGETDESC_CSKYMCASMINFO_H
 
 #include "llvm/MC/MCAsmInfoELF.h"
+#include "llvm/MC/MCExpr.h"
+#include "llvm/MC/MCValue.h"
 
 namespace llvm {
 class Triple;
@@ -23,7 +25,33 @@ class CSKYMCAsmInfo : public MCAsmInfoELF {
 
 public:
   explicit CSKYMCAsmInfo(const Triple &TargetTriple);
+  void printSpecifierExpr(raw_ostream &OS,
+                          const MCSpecifierExpr &Expr) const override;
 };
+
+namespace CSKY {
+using Specifier = uint8_t;
+enum {
+  S_None,
+  S_ADDR,
+  S_ADDR_HI16,
+  S_ADDR_LO16,
+  S_PCREL,
+  S_GOT,
+  S_GOT_IMM18_BY4,
+  S_GOTPC,
+  S_GOTOFF,
+  S_PLT,
+  S_PLT_IMM18_BY4,
+  S_TLSIE,
+  S_TLSLE,
+  S_TLSGD,
+  S_TLSLDO,
+  S_TLSLDM,
+  S_TPOFF,
+  S_Invalid
+};
+} // namespace CSKY
 } // namespace llvm
 
 #endif // LLVM_LIB_TARGET_CSKY_MCTARGETDESC_CSKYMCASMINFO_H

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp
index 70a797ddd331e..fd7d306a64ac8 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp
@@ -11,7 +11,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "CSKYMCCodeEmitter.h"
-#include "CSKYMCExpr.h"
+#include "CSKYMCAsmInfo.h"
 #include "MCTargetDesc/CSKYMCTargetDesc.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/MC/MCInstBuilder.h"
@@ -293,27 +293,27 @@ unsigned CSKYMCCodeEmitter::getImmJMPIX(const MCInst &MI, unsigned Idx,
 }
 
 MCFixupKind CSKYMCCodeEmitter::getTargetFixup(const MCExpr *Expr) const {
-  const CSKYMCExpr *CSKYExpr = cast<CSKYMCExpr>(Expr);
+  const auto *CSKYExpr = cast<MCSpecifierExpr>(Expr);
   switch (CSKYExpr->getSpecifier()) {
   default:
     llvm_unreachable("Unhandled fixup kind!");
-  case CSKYMCExpr::VK_ADDR:
+  case CSKY::S_ADDR:
     return MCFixupKind(CSKY::fixup_csky_addr32);
-  case CSKYMCExpr::VK_ADDR_HI16:
+  case CSKY::S_ADDR_HI16:
     return MCFixupKind(CSKY::fixup_csky_addr_hi16);
-  case CSKYMCExpr::VK_ADDR_LO16:
+  case CSKY::S_ADDR_LO16:
     return MCFixupKind(CSKY::fixup_csky_addr_lo16);
-  case CSKYMCExpr::VK_GOT:
+  case CSKY::S_GOT:
     return MCFixupKind(CSKY::fixup_csky_got32);
-  case CSKYMCExpr::VK_GOTPC:
+  case CSKY::S_GOTPC:
     return MCFixupKind(CSKY::fixup_csky_gotpc);
-  case CSKYMCExpr::VK_GOTOFF:
+  case CSKY::S_GOTOFF:
     return MCFixupKind(CSKY::fixup_csky_gotoff);
-  case CSKYMCExpr::VK_PLT:
+  case CSKY::S_PLT:
     return MCFixupKind(CSKY::fixup_csky_plt32);
-  case CSKYMCExpr::VK_PLT_IMM18_BY4:
+  case CSKY::S_PLT_IMM18_BY4:
     return MCFixupKind(CSKY::fixup_csky_plt_imm18_scale4);
-  case CSKYMCExpr::VK_GOT_IMM18_BY4:
+  case CSKY::S_GOT_IMM18_BY4:
     return MCFixupKind(CSKY::fixup_csky_got_imm18_scale4);
   }
 }

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.h b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.h
index 0e47d259d43f5..32cccdd5405ba 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.h
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.h
@@ -14,7 +14,7 @@
 #define LLVM_LIB_TARGET_CSKY_MCTARGETDESC_CSKYMCCODEEMITTER_H
 
 #include "MCTargetDesc/CSKYFixupKinds.h"
-#include "MCTargetDesc/CSKYMCExpr.h"
+#include "MCTargetDesc/CSKYMCAsmInfo.h"
 #include "llvm/MC/MCCodeEmitter.h"
 #include "llvm/MC/MCContext.h"
 
@@ -107,7 +107,7 @@ class CSKYMCCodeEmitter : public MCCodeEmitter {
     assert(MO.isExpr() && "Unexpected MO type.");
 
     MCFixupKind Kind = MCFixupKind(FIXUP);
-    if (MO.getExpr()->getKind() == MCExpr::Target)
+    if (MO.getExpr()->getKind() == MCExpr::Specifier)
       Kind = getTargetFixup(MO.getExpr());
 
     Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc()));
@@ -122,7 +122,7 @@ class CSKYMCCodeEmitter : public MCCodeEmitter {
     assert(MO.isExpr() && "Unexpected MO type.");
 
     MCFixupKind Kind = MCFixupKind(FIXUP);
-    if (MO.getExpr()->getKind() == MCExpr::Target)
+    if (MO.getExpr()->getKind() == MCExpr::Specifier)
       Kind = getTargetFixup(MO.getExpr());
 
     Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc()));
@@ -137,7 +137,7 @@ class CSKYMCCodeEmitter : public MCCodeEmitter {
     assert(MO.isExpr() && "Unexpected MO type.");
 
     MCFixupKind Kind = MCFixupKind(FIXUP);
-    if (MO.getExpr()->getKind() == MCExpr::Target)
+    if (MO.getExpr()->getKind() == MCExpr::Specifier)
       Kind = getTargetFixup(MO.getExpr());
 
     Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc()));
@@ -151,7 +151,7 @@ class CSKYMCCodeEmitter : public MCCodeEmitter {
     assert(MO.isExpr() && "Unexpected MO type.");
 
     MCFixupKind Kind = MCFixupKind(CSKY::fixup_csky_pcrel_imm26_scale2);
-    if (MO.getExpr()->getKind() == MCExpr::Target)
+    if (MO.getExpr()->getKind() == MCExpr::Specifier)
       Kind = getTargetFixup(MO.getExpr());
 
     Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc()));
@@ -165,7 +165,7 @@ class CSKYMCCodeEmitter : public MCCodeEmitter {
     assert(MO.isExpr() && "Unexpected MO type.");
 
     MCFixupKind Kind = MCFixupKind(CSKY::fixup_csky_pcrel_imm18_scale2);
-    if (MO.getExpr()->getKind() == MCExpr::Target)
+    if (MO.getExpr()->getKind() == MCExpr::Specifier)
       Kind = getTargetFixup(MO.getExpr());
 
     Fixups.push_back(MCFixup::create(0, MO.getExpr(), Kind, MI.getLoc()));

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.cpp
deleted file mode 100644
index 86e731bb231c6..0000000000000
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-//===-- CSKYMCExpr.cpp - CSKY 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 "CSKYMCExpr.h"
-#include "CSKYFixupKinds.h"
-#include "MCTargetDesc/CSKYMCAsmInfo.h"
-#include "llvm/BinaryFormat/ELF.h"
-#include "llvm/MC/MCAssembler.h"
-#include "llvm/MC/MCContext.h"
-#include "llvm/MC/MCStreamer.h"
-#include "llvm/MC/MCSymbolELF.h"
-#include "llvm/Support/Casting.h"
-
-using namespace llvm;
-
-#define DEBUG_TYPE "csky-mc-expr"
-
-const CSKYMCExpr *CSKYMCExpr::create(const MCExpr *Expr, Specifier Kind,
-                                     MCContext &Ctx) {
-  return new (Ctx) CSKYMCExpr(Expr, Kind);
-}
-
-StringRef CSKYMCExpr::getVariantKindName(Specifier Kind) {
-  switch (Kind) {
-  default:
-    llvm_unreachable("Invalid ELF symbol kind");
-  case VK_None:
-  case VK_ADDR:
-    return "";
-  case VK_ADDR_HI16:
-    return "@HI16";
-  case VK_ADDR_LO16:
-    return "@LO16";
-  case VK_GOT_IMM18_BY4:
-  case VK_GOT:
-    return "@GOT";
-  case VK_GOTPC:
-    return "@GOTPC";
-  case VK_GOTOFF:
-    return "@GOTOFF";
-  case VK_PLT_IMM18_BY4:
-  case VK_PLT:
-    return "@PLT";
-  case VK_TLSLE:
-    return "@TPOFF";
-  case VK_TLSIE:
-    return "@GOTTPOFF";
-  case VK_TLSGD:
-    return "@TLSGD32";
-  case VK_TLSLDO:
-    return "@TLSLDO32";
-  case VK_TLSLDM:
-    return "@TLSLDM32";
-  }
-}
-
-void CSKYMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
-  Streamer.visitUsedExpr(*getSubExpr());
-}
-
-void CSKYMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
-  if (MAI)
-    MAI->printExpr(OS, *Expr);
-  OS << getVariantKindName(getSpecifier());
-}
-
-bool CSKYMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
-                                           const MCAssembler *Asm) const {
-  if (!getSubExpr()->evaluateAsRelocatable(Res, Asm))
-    return false;
-  Res.setSpecifier(specifier);
-  return !Res.getSubSym();
-}

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.h b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.h
deleted file mode 100644
index 14fe56f496a0b..0000000000000
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.h
+++ /dev/null
@@ -1,75 +0,0 @@
-//===-- CSKYMCExpr.h - CSKY 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
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_LIB_TARGET_LANAI_MCTARGETDESC_LANAIMCEXPR_H
-#define LLVM_LIB_TARGET_LANAI_MCTARGETDESC_LANAIMCEXPR_H
-
-#include "llvm/MC/MCExpr.h"
-#include "llvm/MC/MCValue.h"
-
-namespace llvm {
-
-class CSKYMCExpr : public MCTargetExpr {
-public:
-  enum Specifier : uint8_t {
-    VK_None,
-    VK_ADDR = MCSymbolRefExpr::FirstTargetSpecifier,
-    VK_ADDR_HI16,
-    VK_ADDR_LO16,
-    VK_PCREL,
-    VK_GOT,
-    VK_GOT_IMM18_BY4,
-    VK_GOTPC,
-    VK_GOTOFF,
-    VK_PLT,
-    VK_PLT_IMM18_BY4,
-    VK_TLSIE,
-    VK_TLSLE,
-    VK_TLSGD,
-    VK_TLSLDO,
-    VK_TLSLDM,
-    VK_TPOFF,
-    VK_Invalid
-  };
-
-private:
-  const MCExpr *Expr;
-  const Specifier specifier;
-
-  explicit CSKYMCExpr(const MCExpr *Expr, Specifier S)
-      : Expr(Expr), specifier(S) {}
-
-public:
-  static const CSKYMCExpr *create(const MCExpr *Expr, Specifier Kind,
-                                  MCContext &Ctx);
-
-  // Returns the kind of this expression.
-  Specifier getSpecifier() const { return specifier; }
-
-  // Returns the child of this expression.
-  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 {
-    return getSubExpr()->findAssociatedFragment();
-  }
-
-  static bool classof(const MCExpr *E) {
-    return E->getKind() == MCExpr::Target;
-  }
-
-  static StringRef getVariantKindName(Specifier Kind);
-};
-} // end namespace llvm
-
-#endif

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.cpp b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.cpp
index 42876b3891271..c2a389515b856 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.cpp
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "CSKYTargetStreamer.h"
+#include "MCTargetDesc/CSKYMCAsmInfo.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
 #include "llvm/CodeGen/TargetSubtargetInfo.h"
 #include "llvm/MC/MCContext.h"
@@ -57,11 +58,11 @@ const MCExpr *CSKYConstantPool::addEntry(MCStreamer &Streamer,
   const auto SymRef = MCSymbolRefExpr::create(CPEntryLabel, Context);
 
   if (AdjustExpr) {
-    const CSKYMCExpr *CSKYExpr = cast<CSKYMCExpr>(Value);
+    auto *CSKYExpr = cast<MCSpecifierExpr>(Value);
 
     Value = MCBinaryExpr::createSub(AdjustExpr, SymRef, Context);
     Value = MCBinaryExpr::createSub(CSKYExpr->getSubExpr(), Value, Context);
-    Value = CSKYMCExpr::create(Value, CSKYExpr->getSpecifier(), Context);
+    Value = MCSpecifierExpr::create(Value, CSKYExpr->getSpecifier(), Context);
   }
 
   Entries.push_back(ConstantPoolEntry(CPEntryLabel, Value, Size, Loc));
@@ -84,12 +85,12 @@ CSKYTargetStreamer::CSKYTargetStreamer(MCStreamer &S)
 const MCExpr *
 CSKYTargetStreamer::addConstantPoolEntry(const MCExpr *Expr, SMLoc Loc,
                                          const MCExpr *AdjustExpr) {
-  auto ELFRefKind = CSKYMCExpr::VK_Invalid;
+  uint8_t ELFRefKind = CSKY::S_Invalid;
   ConstantCounter++;
 
   const MCExpr *OrigExpr = Expr;
 
-  if (const CSKYMCExpr *CE = dyn_cast<CSKYMCExpr>(Expr)) {
+  if (auto *CE = dyn_cast<MCSpecifierExpr>(Expr)) {
     Expr = CE->getSubExpr();
     ELFRefKind = CE->getSpecifier();
   }

diff  --git a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.h b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.h
index 03d5a7b0e08cb..7b428502c34f5 100644
--- a/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.h
+++ b/llvm/lib/Target/CSKY/MCTargetDesc/CSKYTargetStreamer.h
@@ -9,7 +9,7 @@
 #ifndef LLVM_LIB_TARGET_CSKY_CSKYTARGETSTREAMER_H
 #define LLVM_LIB_TARGET_CSKY_CSKYTARGETSTREAMER_H
 
-#include "MCTargetDesc/CSKYMCExpr.h"
+#include "MCTargetDesc/CSKYMCAsmInfo.h"
 #include "llvm/MC/ConstantPools.h"
 #include "llvm/MC/MCStreamer.h"
 
@@ -46,7 +46,7 @@ class CSKYTargetStreamer : public MCTargetStreamer {
 public:
   typedef struct {
     const MCSymbol *sym;
-    CSKYMCExpr::Specifier kind;
+    CSKY::Specifier kind;
   } SymbolIndex;
 
 protected:
@@ -76,10 +76,10 @@ class CSKYTargetStreamer : public MCTargetStreamer {
 
 template <> struct DenseMapInfo<CSKYTargetStreamer::SymbolIndex> {
   static inline CSKYTargetStreamer::SymbolIndex getEmptyKey() {
-    return {nullptr, CSKYMCExpr::VK_Invalid};
+    return {nullptr, CSKY::S_Invalid};
   }
   static inline CSKYTargetStreamer::SymbolIndex getTombstoneKey() {
-    return {nullptr, CSKYMCExpr::VK_Invalid};
+    return {nullptr, CSKY::S_Invalid};
   }
   static unsigned getHashValue(const CSKYTargetStreamer::SymbolIndex &V) {
     return hash_combine(DenseMapInfo<const MCSymbol *>::getHashValue(V.sym),


        


More information about the llvm-commits mailing list