1 //===-- MipsMCExpr.h - Mips specific MC expression classes ------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCEXPR_H 11 #define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCEXPR_H 12 13 #include "llvm/MC/MCAsmLayout.h" 14 #include "llvm/MC/MCExpr.h" 15 #include "llvm/MC/MCValue.h" 16 17 namespace llvm { 18 19 class MipsMCExpr : public MCTargetExpr { 20 public: 21 enum MipsExprKind { 22 MEK_None, 23 MEK_CALL_HI16, 24 MEK_CALL_LO16, 25 MEK_DTPREL_HI, 26 MEK_DTPREL_LO, 27 MEK_GOT, 28 MEK_GOTTPREL, 29 MEK_GOT_CALL, 30 MEK_GOT_DISP, 31 MEK_GOT_HI16, 32 MEK_GOT_LO16, 33 MEK_GOT_OFST, 34 MEK_GOT_PAGE, 35 MEK_GPREL, 36 MEK_HI, 37 MEK_HIGHER, 38 MEK_HIGHEST, 39 MEK_LO, 40 MEK_NEG, 41 MEK_PCREL_HI16, 42 MEK_PCREL_LO16, 43 MEK_TLSGD, 44 MEK_TLSLDM, 45 MEK_TPREL_HI, 46 MEK_TPREL_LO, 47 MEK_Special, 48 }; 49 50 private: 51 const MipsExprKind Kind; 52 const MCExpr *Expr; 53 MipsMCExpr(MipsExprKind Kind,const MCExpr * Expr)54 explicit MipsMCExpr(MipsExprKind Kind, const MCExpr *Expr) 55 : Kind(Kind), Expr(Expr) {} 56 57 public: 58 static const MipsMCExpr *create(MipsExprKind Kind, const MCExpr *Expr, 59 MCContext &Ctx); 60 static const MipsMCExpr *createGpOff(MipsExprKind Kind, const MCExpr *Expr, 61 MCContext &Ctx); 62 63 /// Get the kind of this expression. getKind()64 MipsExprKind getKind() const { return Kind; } 65 66 /// Get the child of this expression. getSubExpr()67 const MCExpr *getSubExpr() const { return Expr; } 68 69 void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; 70 bool evaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout, 71 const MCFixup *Fixup) const override; 72 void visitUsedExpr(MCStreamer &Streamer) const override; findAssociatedFragment()73 MCFragment *findAssociatedFragment() const override { 74 return getSubExpr()->findAssociatedFragment(); 75 } 76 77 void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override; 78 classof(const MCExpr * E)79 static bool classof(const MCExpr *E) { 80 return E->getKind() == MCExpr::Target; 81 } 82 83 bool isGpOff(MipsExprKind &Kind) const; isGpOff()84 bool isGpOff() const { 85 MipsExprKind Kind; 86 return isGpOff(Kind); 87 } 88 }; 89 } // end namespace llvm 90 91 #endif 92