1//====- SparcMCExpr.h - Sparc specific MC expression classes --*- C++ -*-=====//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file describes Sparc-specific MCExprs, used for modifiers like
10// "%hi" or "%lo" etc.,
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H
15#define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H
16
17#include "SparcFixupKinds.h"
18#include "llvm/MC/MCExpr.h"
19
20namespace llvm {
21
22class StringRef;
23class SparcMCExpr : public MCTargetExpr {
24public:
25  enum VariantKind {
26    VK_Sparc_None,
27    VK_Sparc_LO,
28    VK_Sparc_HI,
29    VK_Sparc_H44,
30    VK_Sparc_M44,
31    VK_Sparc_L44,
32    VK_Sparc_HH,
33    VK_Sparc_HM,
34    VK_Sparc_PC22,
35    VK_Sparc_PC10,
36    VK_Sparc_GOT22,
37    VK_Sparc_GOT10,
38    VK_Sparc_GOT13,
39    VK_Sparc_13,
40    VK_Sparc_WPLT30,
41    VK_Sparc_R_DISP32,
42    VK_Sparc_TLS_GD_HI22,
43    VK_Sparc_TLS_GD_LO10,
44    VK_Sparc_TLS_GD_ADD,
45    VK_Sparc_TLS_GD_CALL,
46    VK_Sparc_TLS_LDM_HI22,
47    VK_Sparc_TLS_LDM_LO10,
48    VK_Sparc_TLS_LDM_ADD,
49    VK_Sparc_TLS_LDM_CALL,
50    VK_Sparc_TLS_LDO_HIX22,
51    VK_Sparc_TLS_LDO_LOX10,
52    VK_Sparc_TLS_LDO_ADD,
53    VK_Sparc_TLS_IE_HI22,
54    VK_Sparc_TLS_IE_LO10,
55    VK_Sparc_TLS_IE_LD,
56    VK_Sparc_TLS_IE_LDX,
57    VK_Sparc_TLS_IE_ADD,
58    VK_Sparc_TLS_LE_HIX22,
59    VK_Sparc_TLS_LE_LOX10
60  };
61
62private:
63  const VariantKind Kind;
64  const MCExpr *Expr;
65
66  explicit SparcMCExpr(VariantKind Kind, const MCExpr *Expr)
67      : Kind(Kind), Expr(Expr) {}
68
69public:
70  /// @name Construction
71  /// @{
72
73  static const SparcMCExpr *create(VariantKind Kind, const MCExpr *Expr,
74                                 MCContext &Ctx);
75  /// @}
76  /// @name Accessors
77  /// @{
78
79  /// getOpcode - Get the kind of this expression.
80  VariantKind getKind() const { return Kind; }
81
82  /// getSubExpr - Get the child of this expression.
83  const MCExpr *getSubExpr() const { return Expr; }
84
85  /// getFixupKind - Get the fixup kind of this expression.
86  Sparc::Fixups getFixupKind() const { return getFixupKind(Kind); }
87
88  /// @}
89  void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
90  bool evaluateAsRelocatableImpl(MCValue &Res,
91                                 const MCAsmLayout *Layout,
92                                 const MCFixup *Fixup) const override;
93  void visitUsedExpr(MCStreamer &Streamer) const override;
94  MCFragment *findAssociatedFragment() const override {
95    return getSubExpr()->findAssociatedFragment();
96  }
97
98  void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
99
100  static bool classof(const MCExpr *E) {
101    return E->getKind() == MCExpr::Target;
102  }
103
104  static bool classof(const SparcMCExpr *) { return true; }
105
106  static VariantKind parseVariantKind(StringRef name);
107  static bool printVariantKind(raw_ostream &OS, VariantKind Kind);
108  static Sparc::Fixups getFixupKind(VariantKind Kind);
109};
110
111} // end namespace llvm.
112
113#endif
114