1262261Sdim//====- SparcMCExpr.h - Sparc specific MC expression classes --*- C++ -*-=====//
2262261Sdim//
3262261Sdim//                     The LLVM Compiler Infrastructure
4262261Sdim//
5262261Sdim// This file is distributed under the University of Illinois Open Source
6262261Sdim// License. See LICENSE.TXT for details.
7262261Sdim//
8262261Sdim//===----------------------------------------------------------------------===//
9262261Sdim//
10262261Sdim// This file describes Sparc-specific MCExprs, used for modifiers like
11262261Sdim// "%hi" or "%lo" etc.,
12262261Sdim//
13262261Sdim//===----------------------------------------------------------------------===//
14262261Sdim
15280031Sdim#ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H
16280031Sdim#define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H
17262261Sdim
18262261Sdim#include "SparcFixupKinds.h"
19262261Sdim#include "llvm/MC/MCExpr.h"
20262261Sdim
21262261Sdimnamespace llvm {
22262261Sdim
23262261Sdimclass StringRef;
24262261Sdimclass SparcMCExpr : public MCTargetExpr {
25262261Sdimpublic:
26262261Sdim  enum VariantKind {
27262261Sdim    VK_Sparc_None,
28262261Sdim    VK_Sparc_LO,
29262261Sdim    VK_Sparc_HI,
30262261Sdim    VK_Sparc_H44,
31262261Sdim    VK_Sparc_M44,
32262261Sdim    VK_Sparc_L44,
33262261Sdim    VK_Sparc_HH,
34262261Sdim    VK_Sparc_HM,
35262261Sdim    VK_Sparc_PC22,
36262261Sdim    VK_Sparc_PC10,
37262261Sdim    VK_Sparc_GOT22,
38262261Sdim    VK_Sparc_GOT10,
39262261Sdim    VK_Sparc_WPLT30,
40262261Sdim    VK_Sparc_R_DISP32,
41262261Sdim    VK_Sparc_TLS_GD_HI22,
42262261Sdim    VK_Sparc_TLS_GD_LO10,
43262261Sdim    VK_Sparc_TLS_GD_ADD,
44262261Sdim    VK_Sparc_TLS_GD_CALL,
45262261Sdim    VK_Sparc_TLS_LDM_HI22,
46262261Sdim    VK_Sparc_TLS_LDM_LO10,
47262261Sdim    VK_Sparc_TLS_LDM_ADD,
48262261Sdim    VK_Sparc_TLS_LDM_CALL,
49262261Sdim    VK_Sparc_TLS_LDO_HIX22,
50262261Sdim    VK_Sparc_TLS_LDO_LOX10,
51262261Sdim    VK_Sparc_TLS_LDO_ADD,
52262261Sdim    VK_Sparc_TLS_IE_HI22,
53262261Sdim    VK_Sparc_TLS_IE_LO10,
54262261Sdim    VK_Sparc_TLS_IE_LD,
55262261Sdim    VK_Sparc_TLS_IE_LDX,
56262261Sdim    VK_Sparc_TLS_IE_ADD,
57262261Sdim    VK_Sparc_TLS_LE_HIX22,
58262261Sdim    VK_Sparc_TLS_LE_LOX10
59262261Sdim  };
60262261Sdim
61262261Sdimprivate:
62262261Sdim  const VariantKind Kind;
63262261Sdim  const MCExpr *Expr;
64262261Sdim
65288943Sdim  explicit SparcMCExpr(VariantKind Kind, const MCExpr *Expr)
66288943Sdim      : Kind(Kind), Expr(Expr) {}
67262261Sdim
68262261Sdimpublic:
69262261Sdim  /// @name Construction
70262261Sdim  /// @{
71262261Sdim
72288943Sdim  static const SparcMCExpr *create(VariantKind Kind, const MCExpr *Expr,
73262261Sdim                                 MCContext &Ctx);
74262261Sdim  /// @}
75262261Sdim  /// @name Accessors
76262261Sdim  /// @{
77262261Sdim
78262261Sdim  /// getOpcode - Get the kind of this expression.
79262261Sdim  VariantKind getKind() const { return Kind; }
80262261Sdim
81262261Sdim  /// getSubExpr - Get the child of this expression.
82262261Sdim  const MCExpr *getSubExpr() const { return Expr; }
83262261Sdim
84262261Sdim  /// getFixupKind - Get the fixup kind of this expression.
85262261Sdim  Sparc::Fixups getFixupKind() const { return getFixupKind(Kind); }
86262261Sdim
87262261Sdim  /// @}
88288943Sdim  void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
89288943Sdim  bool evaluateAsRelocatableImpl(MCValue &Res,
90280031Sdim                                 const MCAsmLayout *Layout,
91280031Sdim                                 const MCFixup *Fixup) const override;
92276479Sdim  void visitUsedExpr(MCStreamer &Streamer) const override;
93296417Sdim  MCFragment *findAssociatedFragment() const override {
94296417Sdim    return getSubExpr()->findAssociatedFragment();
95262261Sdim  }
96262261Sdim
97276479Sdim  void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
98262261Sdim
99262261Sdim  static bool classof(const MCExpr *E) {
100262261Sdim    return E->getKind() == MCExpr::Target;
101262261Sdim  }
102262261Sdim
103262261Sdim  static bool classof(const SparcMCExpr *) { return true; }
104262261Sdim
105262261Sdim  static VariantKind parseVariantKind(StringRef name);
106262261Sdim  static bool printVariantKind(raw_ostream &OS, VariantKind Kind);
107262261Sdim  static Sparc::Fixups getFixupKind(VariantKind Kind);
108262261Sdim};
109262261Sdim
110262261Sdim} // end namespace llvm.
111262261Sdim
112262261Sdim#endif
113