[llvm] cf9665d - Xtensa: Migrate to newer relocation specifier representation
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 15 12:32:16 PDT 2025
Author: Fangrui Song
Date: 2025-06-15T12:32:11-07:00
New Revision: cf9665dd2bcef3ff2f3e22d3f44e8603f4ba9577
URL: https://github.com/llvm/llvm-project/commit/cf9665dd2bcef3ff2f3e22d3f44e8603f4ba9577
DIFF: https://github.com/llvm/llvm-project/commit/cf9665dd2bcef3ff2f3e22d3f44e8603f4ba9577.diff
LOG: Xtensa: Migrate to newer relocation specifier representation
* Rename specifier constants from XtensaMCExpr::Specifier::VK_ to
Xtensa::S_, following Sparc and VE.
* Use MCAsmInfo::printSpecifierExpr instead of MCExpr::print.
* Remove unneeded XtensaMCExpr. Just use MCSpecifierExpr when a
specifier is needed.
Added:
Modified:
llvm/lib/Target/Xtensa/MCTargetDesc/CMakeLists.txt
llvm/lib/Target/Xtensa/MCTargetDesc/XtensaInstPrinter.cpp
llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.cpp
llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.h
llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.h
llvm/lib/Target/Xtensa/XtensaAsmPrinter.cpp
Removed:
llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.cpp
################################################################################
diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/CMakeLists.txt b/llvm/lib/Target/Xtensa/MCTargetDesc/CMakeLists.txt
index dc12863394c7a..6c5a6bef5e242 100644
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/CMakeLists.txt
+++ b/llvm/lib/Target/Xtensa/MCTargetDesc/CMakeLists.txt
@@ -4,7 +4,6 @@ add_llvm_component_library(LLVMXtensaDesc
XtensaInstPrinter.cpp
XtensaMCAsmInfo.cpp
XtensaMCCodeEmitter.cpp
- XtensaMCExpr.cpp
XtensaMCTargetDesc.cpp
XtensaTargetStreamer.cpp
diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaInstPrinter.cpp b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaInstPrinter.cpp
index fc5e1780de2e5..408a6ac01de9e 100644
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaInstPrinter.cpp
+++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaInstPrinter.cpp
@@ -15,6 +15,7 @@
#include "XtensaInstPrinter.h"
#include "MCTargetDesc/XtensaMCExpr.h"
#include "llvm/CodeGen/MachineOperand.h"
+#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInstrInfo.h"
#include "llvm/MC/MCRegister.h"
@@ -35,14 +36,7 @@ static void printExpr(const MCExpr *Expr, raw_ostream &OS) {
if (!(SRE = cast<MCSymbolRefExpr>(Expr)))
assert(false && "Unexpected MCExpr type.");
- auto Spec = XtensaMCExpr::Specifier(SRE->getKind());
- switch (Spec) {
- case XtensaMCExpr::VK_None:
- break;
- // TODO
- default:
- report_fatal_error("Invalid kind!");
- }
+ assert(SRE->getSpecifier() == 0);
OS << SRE->getSymbol();
@@ -51,9 +45,6 @@ static void printExpr(const MCExpr *Expr, raw_ostream &OS) {
OS << '+';
OS << Offset;
}
-
- if (Spec != XtensaMCExpr::VK_None)
- OS << ')';
}
void XtensaInstPrinter::printOperand(const MCOperand &MC, raw_ostream &O) {
@@ -97,7 +88,7 @@ void XtensaInstPrinter::printBranchTarget(const MCInst *MI, uint64_t Address,
int64_t Val = MC.getImm() + 4;
printPCRelImm(Address, Val, O);
} else if (MC.isExpr())
- MC.getExpr()->print(O, &MAI);
+ MAI.printExpr(O, *MC.getExpr());
else
llvm_unreachable("Invalid operand");
}
@@ -109,7 +100,7 @@ void XtensaInstPrinter::printLoopTarget(const MCInst *MI, uint64_t Address,
int64_t Val = MC.getImm() + 4;
printPCRelImm(Address, Val, O);
} else if (MC.isExpr())
- MC.getExpr()->print(O, &MAI, true);
+ MAI.printExpr(O, *MC.getExpr());
else
llvm_unreachable("Invalid operand");
}
@@ -121,7 +112,7 @@ void XtensaInstPrinter::printJumpTarget(const MCInst *MI, uint64_t Address,
int64_t Val = MC.getImm() + 4;
printPCRelImm(Address, Val, O);
} else if (MC.isExpr())
- MC.getExpr()->print(O, &MAI);
+ MAI.printExpr(O, *MC.getExpr());
else
llvm_unreachable("Invalid operand");
;
@@ -168,7 +159,7 @@ void XtensaInstPrinter::printL32RTarget(const MCInst *MI, uint64_t Address,
printPCRelImm(Address, Value, O);
}
} else if (MC.isExpr())
- MC.getExpr()->print(O, &MAI);
+ MAI.printExpr(O, *MC.getExpr());
else
llvm_unreachable("Invalid operand");
}
diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.cpp b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.cpp
index 28764d369247a..0b20f2e14a841 100644
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.cpp
+++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.cpp
@@ -13,6 +13,8 @@
//===----------------------------------------------------------------------===//
#include "XtensaMCAsmInfo.h"
+#include "XtensaMCExpr.h"
+#include "llvm/Support/raw_ostream.h"
#include "llvm/TargetParser/Triple.h"
using namespace llvm;
@@ -30,3 +32,22 @@ XtensaMCAsmInfo::XtensaMCAsmInfo(const Triple &TT) {
ExceptionsType = ExceptionHandling::DwarfCFI;
AlignmentIsInBytes = false;
}
+
+void XtensaMCAsmInfo::printSpecifierExpr(raw_ostream &OS,
+ const MCSpecifierExpr &Expr) const {
+ StringRef S = Xtensa::getSpecifierName(Expr.getSpecifier());
+ if (!S.empty())
+ OS << '%' << S << '(';
+ printExpr(OS, *Expr.getSubExpr());
+ if (!S.empty())
+ OS << ')';
+}
+
+uint8_t Xtensa::parseSpecifier(StringRef name) { return 0; }
+
+StringRef Xtensa::getSpecifierName(uint8_t S) {
+ switch (S) {
+ default:
+ llvm_unreachable("Invalid ELF symbol kind");
+ }
+}
diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.h b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.h
index a86a95f6be37e..6f6f4bcb7047e 100644
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.h
+++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCAsmInfo.h
@@ -23,6 +23,9 @@ class Triple;
class XtensaMCAsmInfo : public MCAsmInfoELF {
public:
explicit XtensaMCAsmInfo(const Triple &TT);
+
+ void printSpecifierExpr(raw_ostream &OS,
+ const MCSpecifierExpr &Expr) const override;
};
} // namespace llvm
diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.cpp b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.cpp
deleted file mode 100644
index f7f92e1646c3f..0000000000000
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-//===-- XtensaMCExpr.cpp - Xtensa specific MC expression classes ----------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-//
-// This file contains the implementation of the assembly expression modifiers
-// accepted by the Xtensa architecture
-//
-//===----------------------------------------------------------------------===//
-
-#include "XtensaMCExpr.h"
-#include "llvm/MC/MCAssembler.h"
-#include "llvm/MC/MCContext.h"
-#include "llvm/MC/MCStreamer.h"
-#include "llvm/MC/MCSymbolELF.h"
-#include "llvm/MC/MCValue.h"
-#include "llvm/Object/ELF.h"
-#include "llvm/Support/ErrorHandling.h"
-
-using namespace llvm;
-
-#define DEBUG_TYPE "xtensamcexpr"
-
-const XtensaMCExpr *XtensaMCExpr::create(const MCExpr *Expr, Specifier S,
- MCContext &Ctx) {
- return new (Ctx) XtensaMCExpr(Expr, S);
-}
-
-void XtensaMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
- bool HasSpecifier = getSpecifier() != VK_None;
- if (HasSpecifier)
- OS << '%' << getSpecifierName(getSpecifier()) << '(';
- Expr->print(OS, MAI);
- if (HasSpecifier)
- OS << ')';
-}
-
-XtensaMCExpr::Specifier XtensaMCExpr::parseSpecifier(StringRef name) {
- return StringSwitch<XtensaMCExpr::Specifier>(name).Default(VK_None);
-}
-
-StringRef XtensaMCExpr::getSpecifierName(Specifier S) {
- switch (S) {
- default:
- llvm_unreachable("Invalid ELF symbol kind");
- }
-}
diff --git a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.h b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.h
index 54b5ad30516bd..5a7b1ee9880f8 100644
--- a/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.h
+++ b/llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCExpr.h
@@ -20,24 +20,13 @@
namespace llvm {
class StringRef;
-class XtensaMCExpr : public MCSpecifierExpr {
-public:
- using Specifier = uint16_t;
- enum { VK_None, VK_TPOFF };
-private:
- explicit XtensaMCExpr(const MCExpr *Expr, Specifier S)
- : MCSpecifierExpr(Expr, S) {}
+namespace Xtensa {
+enum Specifier { S_None, S_TPOFF };
-public:
- static const XtensaMCExpr *create(const MCExpr *Expr, Specifier,
- MCContext &Ctx);
-
- void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
-
- static Specifier parseSpecifier(StringRef name);
- static StringRef getSpecifierName(Specifier Kind);
-};
+uint8_t parseSpecifier(StringRef name);
+StringRef getSpecifierName(uint8_t S);
+} // namespace Xtensa
} // end namespace llvm.
diff --git a/llvm/lib/Target/Xtensa/XtensaAsmPrinter.cpp b/llvm/lib/Target/Xtensa/XtensaAsmPrinter.cpp
index 4f3a2e791a3ca..4e3ed4b9e8ee5 100644
--- a/llvm/lib/Target/Xtensa/XtensaAsmPrinter.cpp
+++ b/llvm/lib/Target/Xtensa/XtensaAsmPrinter.cpp
@@ -32,13 +32,13 @@
using namespace llvm;
-static XtensaMCExpr::Specifier
+static Xtensa::Specifier
getModifierSpecifier(XtensaCP::XtensaCPModifier Modifier) {
switch (Modifier) {
case XtensaCP::no_modifier:
- return XtensaMCExpr::VK_None;
+ return Xtensa::S_None;
case XtensaCP::TPOFF:
- return XtensaMCExpr::VK_TPOFF;
+ return Xtensa::S_TPOFF;
}
report_fatal_error("Invalid XtensaCPModifier!");
}
@@ -92,7 +92,7 @@ void XtensaAsmPrinter::emitMachineConstantPoolValue(
MCSymbol *LblSym = GetCPISymbol(ACPV->getLabelId());
auto *TS =
static_cast<XtensaTargetStreamer *>(OutStreamer->getTargetStreamer());
- XtensaMCExpr::Specifier VK = getModifierSpecifier(ACPV->getModifier());
+ auto Spec = getModifierSpecifier(ACPV->getModifier());
if (ACPV->getModifier() != XtensaCP::no_modifier) {
std::string SymName(MCSym->getName());
@@ -101,7 +101,7 @@ void XtensaAsmPrinter::emitMachineConstantPoolValue(
MCSym = OutContext.getOrCreateSymbol(SymName);
}
- const MCExpr *Expr = MCSymbolRefExpr::create(MCSym, VK, OutContext);
+ const MCExpr *Expr = MCSymbolRefExpr::create(MCSym, Spec, OutContext);
TS->emitLiteral(LblSym, Expr, false);
}
@@ -227,8 +227,6 @@ XtensaAsmPrinter::LowerSymbolOperand(const MachineOperand &MO,
MachineOperand::MachineOperandType MOTy,
unsigned Offset) const {
const MCSymbol *Symbol;
- XtensaMCExpr::Specifier Kind = XtensaMCExpr::VK_None;
-
switch (MOTy) {
case MachineOperand::MO_GlobalAddress:
Symbol = getSymbol(MO.getGlobal());
@@ -257,7 +255,6 @@ XtensaAsmPrinter::LowerSymbolOperand(const MachineOperand &MO,
}
const MCExpr *ME = MCSymbolRefExpr::create(Symbol, OutContext);
-
if (Offset) {
// Assume offset is never negative.
assert(Offset > 0);
More information about the llvm-commits
mailing list