//===-- RISCVMCExpr.h - RISCV specific MC expression classes ----*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file describes RISCV-specific MCExprs, used for modifiers like // "%hi" or "%lo" etc., // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVMCEXPR_H #define LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVMCEXPR_H #include "llvm/MC/MCExpr.h" namespace llvm { class StringRef; class MCOperand; class RISCVMCExpr : public MCTargetExpr { public: enum VariantKind { VK_RISCV_None, VK_RISCV_LO, VK_RISCV_HI, VK_RISCV_PCREL_LO, VK_RISCV_PCREL_HI, VK_RISCV_CALL, VK_RISCV_Invalid }; private: const MCExpr *Expr; const VariantKind Kind; int64_t evaluateAsInt64(int64_t Value) const; explicit RISCVMCExpr(const MCExpr *Expr, VariantKind Kind) : Expr(Expr), Kind(Kind) {} public: static const RISCVMCExpr *create(const MCExpr *Expr, VariantKind Kind, MCContext &Ctx); VariantKind getKind() const { return Kind; } const MCExpr *getSubExpr() const { return Expr; } void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; bool evaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout, const MCFixup *Fixup) const override; void visitUsedExpr(MCStreamer &Streamer) const override; MCFragment *findAssociatedFragment() const override { return getSubExpr()->findAssociatedFragment(); } // There are no TLS RISCVMCExprs at the moment. void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} bool evaluateAsConstant(int64_t &Res) const; static bool classof(const MCExpr *E) { return E->getKind() == MCExpr::Target; } static bool classof(const RISCVMCExpr *) { return true; } static VariantKind getVariantKindForName(StringRef name); static StringRef getVariantKindName(VariantKind Kind); }; } // end namespace llvm. #endif