LoongArchMCExpr: Migrate to MCSpecifierExpr

This commit is contained in:
Fangrui Song
2025-06-07 17:42:18 -07:00
parent df46140bab
commit 00a1318d9a
3 changed files with 3 additions and 35 deletions

View File

@@ -130,7 +130,7 @@ LoongArchMCCodeEmitter::getExprOpValue(const MCInst &MI, const MCOperand &MO,
const MCExpr *Expr = MO.getExpr();
MCExpr::ExprKind Kind = Expr->getKind();
unsigned FixupKind = LoongArch::fixup_loongarch_invalid;
if (Kind == MCExpr::Target) {
if (Kind == MCExpr::Specifier) {
const LoongArchMCExpr *LAExpr = cast<LoongArchMCExpr>(Expr);
FixupKind = LAExpr->getSpecifier();
RelaxCandidate = LAExpr->getRelaxHint();

View File

@@ -38,24 +38,6 @@ void LoongArchMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
OS << ')';
}
bool LoongArchMCExpr::evaluateAsRelocatableImpl(
MCValue &Res,
const MCAssembler *Asm) const { // Explicitly drop the layout and assembler
// to prevent any symbolic folding in
// the expression handling. This is required to preserve symbolic difference
// expressions to emit the paired relocations.
if (!getSubExpr()->evaluateAsRelocatable(Res, nullptr))
return false;
Res.setSpecifier(specifier);
// Custom fixup types are not valid with symbol difference expressions.
return !Res.getSubSym();
}
void LoongArchMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
Streamer.visitUsedExpr(*getSubExpr());
}
StringRef LoongArchMCExpr::getSpecifierName(uint16_t S) {
switch (S) {
default:

View File

@@ -20,38 +20,24 @@ namespace llvm {
class StringRef;
class LoongArchMCExpr : public MCTargetExpr {
class LoongArchMCExpr : public MCSpecifierExpr {
public:
using Specifier = uint16_t;
enum { VK_None };
private:
const MCExpr *Expr;
const Specifier specifier;
const bool RelaxHint;
explicit LoongArchMCExpr(const MCExpr *Expr, Specifier S, bool Hint)
: Expr(Expr), specifier(S), RelaxHint(Hint) {}
: MCSpecifierExpr(Expr, S), RelaxHint(Hint) {}
public:
static const LoongArchMCExpr *create(const MCExpr *Expr, uint16_t S,
MCContext &Ctx, bool Hint = false);
Specifier getSpecifier() const { return specifier; }
const MCExpr *getSubExpr() const { return Expr; }
bool getRelaxHint() const { return RelaxHint; }
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 getSpecifierName(uint16_t S);
static Specifier parseSpecifier(StringRef name);