1321369Sdim//===- MipsMCExpr.h - Mips specific MC expression classes -------*- C++ -*-===// 2274955Ssvnmir// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6274955Ssvnmir// 7274955Ssvnmir//===----------------------------------------------------------------------===// 8274955Ssvnmir 9280031Sdim#ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCEXPR_H 10280031Sdim#define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCEXPR_H 11274955Ssvnmir 12274955Ssvnmir#include "llvm/MC/MCAsmLayout.h" 13274955Ssvnmir#include "llvm/MC/MCExpr.h" 14274955Ssvnmir#include "llvm/MC/MCValue.h" 15274955Ssvnmir 16274955Ssvnmirnamespace llvm { 17274955Ssvnmir 18274955Ssvnmirclass MipsMCExpr : public MCTargetExpr { 19274955Ssvnmirpublic: 20309124Sdim enum MipsExprKind { 21309124Sdim MEK_None, 22309124Sdim MEK_CALL_HI16, 23309124Sdim MEK_CALL_LO16, 24344779Sdim MEK_DTPREL, 25309124Sdim MEK_DTPREL_HI, 26309124Sdim MEK_DTPREL_LO, 27309124Sdim MEK_GOT, 28309124Sdim MEK_GOTTPREL, 29309124Sdim MEK_GOT_CALL, 30309124Sdim MEK_GOT_DISP, 31309124Sdim MEK_GOT_HI16, 32309124Sdim MEK_GOT_LO16, 33309124Sdim MEK_GOT_OFST, 34309124Sdim MEK_GOT_PAGE, 35309124Sdim MEK_GPREL, 36309124Sdim MEK_HI, 37309124Sdim MEK_HIGHER, 38309124Sdim MEK_HIGHEST, 39309124Sdim MEK_LO, 40309124Sdim MEK_NEG, 41309124Sdim MEK_PCREL_HI16, 42309124Sdim MEK_PCREL_LO16, 43309124Sdim MEK_TLSGD, 44309124Sdim MEK_TLSLDM, 45309124Sdim MEK_TPREL_HI, 46309124Sdim MEK_TPREL_LO, 47309124Sdim MEK_Special, 48274955Ssvnmir }; 49274955Ssvnmir 50274955Ssvnmirprivate: 51309124Sdim const MipsExprKind Kind; 52274955Ssvnmir const MCExpr *Expr; 53274955Ssvnmir 54309124Sdim explicit MipsMCExpr(MipsExprKind Kind, const MCExpr *Expr) 55309124Sdim : Kind(Kind), Expr(Expr) {} 56274955Ssvnmir 57274955Ssvnmirpublic: 58309124Sdim static const MipsMCExpr *create(MipsExprKind Kind, const MCExpr *Expr, 59309124Sdim MCContext &Ctx); 60309124Sdim static const MipsMCExpr *createGpOff(MipsExprKind Kind, const MCExpr *Expr, 61309124Sdim MCContext &Ctx); 62274955Ssvnmir 63309124Sdim /// Get the kind of this expression. 64309124Sdim MipsExprKind getKind() const { return Kind; } 65274955Ssvnmir 66309124Sdim /// Get the child of this expression. 67274955Ssvnmir const MCExpr *getSubExpr() const { return Expr; } 68274955Ssvnmir 69288943Sdim void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; 70309124Sdim bool evaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout, 71280031Sdim const MCFixup *Fixup) const override; 72274955Ssvnmir void visitUsedExpr(MCStreamer &Streamer) const override; 73321369Sdim 74296417Sdim MCFragment *findAssociatedFragment() const override { 75296417Sdim return getSubExpr()->findAssociatedFragment(); 76274955Ssvnmir } 77274955Ssvnmir 78309124Sdim void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override; 79274955Ssvnmir 80274955Ssvnmir static bool classof(const MCExpr *E) { 81274955Ssvnmir return E->getKind() == MCExpr::Target; 82274955Ssvnmir } 83309124Sdim 84309124Sdim bool isGpOff(MipsExprKind &Kind) const; 85309124Sdim bool isGpOff() const { 86309124Sdim MipsExprKind Kind; 87309124Sdim return isGpOff(Kind); 88309124Sdim } 89274955Ssvnmir}; 90321369Sdim 91274955Ssvnmir} // end namespace llvm 92274955Ssvnmir 93321369Sdim#endif // LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSMCEXPR_H 94