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