diff options
author | Fangrui Song <i@maskray.me> | 2025-06-15 18:35:07 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2025-06-15 18:35:07 -0700 |
commit | f23b841f0fa7576b90fe226e66192b861a8cf1cf (patch) | |
tree | 94d355f8e89003fe639c9c4f65e1a68da8f02e9d | |
parent | 1506ba95d7c3dca1abff0190550945f6cc263a99 (diff) | |
download | llvm-f23b841f0fa7576b90fe226e66192b861a8cf1cf.zip llvm-f23b841f0fa7576b90fe226e66192b861a8cf1cf.tar.gz llvm-f23b841f0fa7576b90fe226e66192b861a8cf1cf.tar.bz2 |
MIPS: Move MipsMCExpr functions to MipsMCAsmInfo
5 files changed, 56 insertions, 25 deletions
diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.cpp index 97c1736..9b2b25c 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.cpp @@ -59,10 +59,11 @@ MipsCOFFMCAsmInfo::MipsCOFFMCAsmInfo() { AllowAtInName = true; } -void MipsMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { +static void printImpl(const MCAsmInfo &MAI, raw_ostream &OS, + const MCSpecifierExpr &Expr) { int64_t AbsVal; - switch (specifier) { + switch (Expr.getSpecifier()) { case Mips::S_None: case Mips::S_Special: llvm_unreachable("Mips::S_None and MEK_Special are invalid"); @@ -70,7 +71,7 @@ void MipsMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { case Mips::S_DTPREL: // Mips::S_DTPREL is used for marking TLS DIEExpr only // and contains a regular sub-expression. - MAI->printExpr(OS, *getSubExpr()); + MAI.printExpr(OS, *Expr.getSubExpr()); return; case Mips::S_CALL_HI16: OS << "%call_hi"; @@ -147,20 +148,20 @@ void MipsMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { } OS << '('; - if (Expr->evaluateAsAbsolute(AbsVal)) + if (Expr.evaluateAsAbsolute(AbsVal)) OS << AbsVal; else - Expr->print(OS, MAI); + MAI.printExpr(OS, *Expr.getSubExpr()); OS << ')'; } -bool MipsMCExpr::isGpOff(Specifier &S) const { - if (getSpecifier() == Mips::S_HI || getSpecifier() == Mips::S_LO) { - if (const MipsMCExpr *S1 = dyn_cast<const MipsMCExpr>(getSubExpr())) { +bool Mips::isGpOff(const MCSpecifierExpr &E) { + if (E.getSpecifier() == Mips::S_HI || E.getSpecifier() == Mips::S_LO) { + if (const MipsMCExpr *S1 = dyn_cast<const MipsMCExpr>(E.getSubExpr())) { if (const MipsMCExpr *S2 = dyn_cast<const MipsMCExpr>(S1->getSubExpr())) { if (S1->getSpecifier() == Mips::S_NEG && S2->getSpecifier() == Mips::S_GPREL) { - S = getSpecifier(); + // S = E.getSpecifier(); return true; } } @@ -169,13 +170,13 @@ bool MipsMCExpr::isGpOff(Specifier &S) const { return false; } -bool MipsMCExpr::evaluateAsRelocatableImpl(MCValue &Res, - const MCAssembler *Asm) const { +static bool evaluate(const MCSpecifierExpr &Expr, MCValue &Res, + const MCAssembler *Asm) { // Look for the %hi(%neg(%gp_rel(X))) and %lo(%neg(%gp_rel(X))) // special cases. - if (isGpOff()) { + if (Mips::isGpOff(Expr)) { const MCExpr *SubExpr = - cast<MipsMCExpr>(cast<MipsMCExpr>(getSubExpr())->getSubExpr()) + cast<MipsMCExpr>(cast<MipsMCExpr>(Expr.getSubExpr())->getSubExpr()) ->getSubExpr(); if (!SubExpr->evaluateAsRelocatable(Res, Asm)) return false; @@ -184,8 +185,29 @@ bool MipsMCExpr::evaluateAsRelocatableImpl(MCValue &Res, return true; } - if (!getSubExpr()->evaluateAsRelocatable(Res, Asm)) + if (!Expr.getSubExpr()->evaluateAsRelocatable(Res, Asm)) return false; - Res.setSpecifier(specifier); + Res.setSpecifier(Expr.getSpecifier()); return !Res.getSubSym(); } + +void MipsELFMCAsmInfo::printSpecifierExpr(raw_ostream &OS, + const MCSpecifierExpr &Expr) const { + printImpl(*this, OS, Expr); +} + +bool MipsELFMCAsmInfo::evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, + MCValue &Res, + const MCAssembler *Asm) const { + return evaluate(Expr, Res, Asm); +} + +void MipsCOFFMCAsmInfo::printSpecifierExpr(raw_ostream &OS, + const MCSpecifierExpr &Expr) const { + printImpl(*this, OS, Expr); +} + +bool MipsCOFFMCAsmInfo::evaluateAsRelocatableImpl( + const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const { + return evaluate(Expr, Res, Asm); +} diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.h b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.h index d8b96f8..39699fdb 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.h +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCAsmInfo.h @@ -27,6 +27,10 @@ class MipsELFMCAsmInfo : public MCAsmInfoELF { public: explicit MipsELFMCAsmInfo(const Triple &TheTriple, const MCTargetOptions &Options); + void printSpecifierExpr(raw_ostream &OS, + const MCSpecifierExpr &Expr) const override; + bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, + const MCAssembler *Asm) const override; }; class MipsCOFFMCAsmInfo : public MCAsmInfoGNUCOFF { @@ -34,6 +38,10 @@ class MipsCOFFMCAsmInfo : public MCAsmInfoGNUCOFF { public: explicit MipsCOFFMCAsmInfo(); + void printSpecifierExpr(raw_ostream &OS, + const MCSpecifierExpr &Expr) const override; + bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, + const MCAssembler *Asm) const override; }; namespace Mips { @@ -66,6 +74,8 @@ enum { S_TPREL_LO, S_Special, }; + +bool isGpOff(const MCSpecifierExpr &E); } } // namespace llvm diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp index 4035618..d2981c4 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp @@ -642,7 +642,7 @@ getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups, break; case Mips::S_LO: // Check for %lo(%neg(%gp_rel(X))) - if (MipsExpr->isGpOff()) + if (Mips::isGpOff(*MipsExpr)) FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GPOFF_LO : Mips::fixup_Mips_GPOFF_LO; else @@ -659,7 +659,7 @@ getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups, break; case Mips::S_HI: // Check for %hi(%neg(%gp_rel(X))) - if (MipsExpr->isGpOff()) + if (Mips::isGpOff(*MipsExpr)) FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GPOFF_HI : Mips::fixup_Mips_GPOFF_HI; else diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp index 821f662..280d944 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp @@ -37,3 +37,10 @@ const MipsMCExpr *MipsMCExpr::createGpOff(MipsMCExpr::Specifier S, return create(S, create(Mips::S_NEG, create(Mips::S_GPREL, Expr, Ctx), Ctx), Ctx); } + +void MipsMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { + if (MAI) + MAI->printExpr(OS, *this); + else // llc -asm-show-inst + MipsELFMCAsmInfo(Triple(), MCTargetOptions()).printExpr(OS, *this); +} diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCExpr.h b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCExpr.h index 216077a..91ec0948 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCExpr.h +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCExpr.h @@ -31,14 +31,6 @@ public: MCContext &Ctx); void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; - bool evaluateAsRelocatableImpl(MCValue &Res, - const MCAssembler *Asm) const override; - - bool isGpOff(Specifier &S) const; - bool isGpOff() const { - Specifier S; - return isGpOff(S); - } }; } // end namespace llvm |