LoongArchMCExpr: Migrate to MCSpecifierExpr
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user