//===-- MipsMCSymbolRefExpr.h - Mips specific MCSymbolRefExpr class -------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MIPSMCSYMBOLREFEXPR_H #define MIPSMCSYMBOLREFEXPR_H #include "llvm/MC/MCExpr.h" namespace llvm { class MipsMCSymbolRefExpr : public MCTargetExpr { public: enum VariantKind { VK_Mips_None, VK_Mips_GPREL, VK_Mips_GOT_CALL, VK_Mips_GOT, VK_Mips_ABS_HI, VK_Mips_ABS_LO, VK_Mips_TLSGD, VK_Mips_GOTTPREL, VK_Mips_TPREL_HI, VK_Mips_TPREL_LO, VK_Mips_GPOFF_HI, VK_Mips_GPOFF_LO, VK_Mips_GOT_DISP, VK_Mips_GOT_PAGE, VK_Mips_GOT_OFST }; private: const VariantKind Kind; const MCSymbol *Symbol; int Offset; explicit MipsMCSymbolRefExpr(VariantKind _Kind, const MCSymbol *_Symbol, int _Offset) : Kind(_Kind), Symbol(_Symbol), Offset(_Offset) {} public: static const MipsMCSymbolRefExpr *Create(VariantKind Kind, const MCSymbol *Symbol, int Offset, MCContext &Ctx); void PrintImpl(raw_ostream &OS) const; bool EvaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout) const; void AddValueSymbols(MCAssembler *) const; const MCSection *FindAssociatedSection() const; static bool classof(const MCExpr *E) { return E->getKind() == MCExpr::Target; } static bool classof(const MipsMCSymbolRefExpr *) { return true; } int getOffset() const { return Offset; } void setOffset(int O) { Offset = O; } }; } // end namespace llvm #endif