SparcMCExpr.h revision cd81d94322a39503e4a3e87b6ee03d4fcb3465fb
1//====- SparcMCExpr.h - Sparc 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// This file describes Sparc-specific MCExprs, used for modifiers like
11// "%hi" or "%lo" etc.,
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_SPARCMCEXPR_H
16#define LLVM_SPARCMCEXPR_H
17
18#include "SparcFixupKinds.h"
19#include "llvm/MC/MCExpr.h"
20
21namespace llvm {
22
23class StringRef;
24class SparcMCExpr : public MCTargetExpr {
25public:
26  enum VariantKind {
27    VK_Sparc_None,
28    VK_Sparc_LO,
29    VK_Sparc_HI,
30    VK_Sparc_H44,
31    VK_Sparc_M44,
32    VK_Sparc_L44,
33    VK_Sparc_HH,
34    VK_Sparc_HM,
35    VK_Sparc_PC22,
36    VK_Sparc_PC10,
37    VK_Sparc_GOT22,
38    VK_Sparc_GOT10,
39    VK_Sparc_WPLT30,
40    VK_Sparc_R_DISP32,
41    VK_Sparc_TLS_GD_HI22,
42    VK_Sparc_TLS_GD_LO10,
43    VK_Sparc_TLS_GD_ADD,
44    VK_Sparc_TLS_GD_CALL,
45    VK_Sparc_TLS_LDM_HI22,
46    VK_Sparc_TLS_LDM_LO10,
47    VK_Sparc_TLS_LDM_ADD,
48    VK_Sparc_TLS_LDM_CALL,
49    VK_Sparc_TLS_LDO_HIX22,
50    VK_Sparc_TLS_LDO_LOX10,
51    VK_Sparc_TLS_LDO_ADD,
52    VK_Sparc_TLS_IE_HI22,
53    VK_Sparc_TLS_IE_LO10,
54    VK_Sparc_TLS_IE_LD,
55    VK_Sparc_TLS_IE_LDX,
56    VK_Sparc_TLS_IE_ADD,
57    VK_Sparc_TLS_LE_HIX22,
58    VK_Sparc_TLS_LE_LOX10
59  };
60
61private:
62  const VariantKind Kind;
63  const MCExpr *Expr;
64
65  explicit SparcMCExpr(VariantKind _Kind, const MCExpr *_Expr)
66    : Kind(_Kind), Expr(_Expr) {}
67
68public:
69  /// @name Construction
70  /// @{
71
72  static const SparcMCExpr *Create(VariantKind Kind, const MCExpr *Expr,
73                                 MCContext &Ctx);
74  /// @}
75  /// @name Accessors
76  /// @{
77
78  /// getOpcode - Get the kind of this expression.
79  VariantKind getKind() const { return Kind; }
80
81  /// getSubExpr - Get the child of this expression.
82  const MCExpr *getSubExpr() const { return Expr; }
83
84  /// getFixupKind - Get the fixup kind of this expression.
85  Sparc::Fixups getFixupKind() const { return getFixupKind(Kind); }
86
87  /// @}
88  void PrintImpl(raw_ostream &OS) const override;
89  bool EvaluateAsRelocatableImpl(MCValue &Res,
90                                 const MCAsmLayout *Layout) const override;
91  void visitUsedExpr(MCStreamer &Streamer) const override;
92  const MCSection *FindAssociatedSection() const override {
93    return getSubExpr()->FindAssociatedSection();
94  }
95
96  void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
97
98  static bool classof(const MCExpr *E) {
99    return E->getKind() == MCExpr::Target;
100  }
101
102  static bool classof(const SparcMCExpr *) { return true; }
103
104  static VariantKind parseVariantKind(StringRef name);
105  static bool printVariantKind(raw_ostream &OS, VariantKind Kind);
106  static Sparc::Fixups getFixupKind(VariantKind Kind);
107};
108
109} // end namespace llvm.
110
111#endif
112