[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