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