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 VariantKind { 22 VK_Mips_None, 23 VK_Mips_LO, 24 VK_Mips_HI, 25 VK_Mips_HIGHER, 26 VK_Mips_HIGHEST 27 }; 28 29 private: 30 const VariantKind Kind; 31 const MCExpr *Expr; 32 MipsMCExpr(VariantKind Kind,const MCExpr * Expr)33 explicit MipsMCExpr(VariantKind Kind, const MCExpr *Expr) 34 : Kind(Kind), Expr(Expr) {} 35 36 public: 37 static bool isSupportedBinaryExpr(MCSymbolRefExpr::VariantKind VK, 38 const MCBinaryExpr *BE); 39 40 static const MipsMCExpr *Create(MCSymbolRefExpr::VariantKind VK, 41 const MCExpr *Expr, MCContext &Ctx); 42 43 /// getOpcode - Get the kind of this expression. getKind()44 VariantKind getKind() const { return Kind; } 45 46 /// getSubExpr - Get the child of this expression. getSubExpr()47 const MCExpr *getSubExpr() const { return Expr; } 48 49 void PrintImpl(raw_ostream &OS) const override; 50 bool EvaluateAsRelocatableImpl(MCValue &Res, 51 const MCAsmLayout *Layout, 52 const MCFixup *Fixup) const override; 53 void visitUsedExpr(MCStreamer &Streamer) const override; FindAssociatedSection()54 const MCSection *FindAssociatedSection() const override { 55 return getSubExpr()->FindAssociatedSection(); 56 } 57 58 // There are no TLS MipsMCExprs at the moment. fixELFSymbolsInTLSFixups(MCAssembler & Asm)59 void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} 60 classof(const MCExpr * E)61 static bool classof(const MCExpr *E) { 62 return E->getKind() == MCExpr::Target; 63 } 64 }; 65 } // end namespace llvm 66 67 #endif 68