136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//====- SparcMCExpr.h - Sparc specific MC expression classes --*- C++ -*-=====//
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//                     The LLVM Compiler Infrastructure
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details.
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file describes Sparc-specific MCExprs, used for modifiers like
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// "%hi" or "%lo" etc.,
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef LLVM_SPARCMCEXPR_H
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define LLVM_SPARCMCEXPR_H
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "SparcFixupKinds.h"
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCExpr.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm {
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass StringRef;
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass SparcMCExpr : public MCTargetExpr {
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  enum VariantKind {
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_None,
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_LO,
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_HI,
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_H44,
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_M44,
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_L44,
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_HH,
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_HM,
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_PC22,
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_PC10,
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_GOT22,
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_GOT10,
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_WPLT30,
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_R_DISP32,
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_GD_HI22,
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_GD_LO10,
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_GD_ADD,
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_GD_CALL,
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_LDM_HI22,
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_LDM_LO10,
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_LDM_ADD,
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_LDM_CALL,
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_LDO_HIX22,
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_LDO_LOX10,
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_LDO_ADD,
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_IE_HI22,
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_IE_LO10,
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_IE_LD,
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_IE_LDX,
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_IE_ADD,
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_LE_HIX22,
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    VK_Sparc_TLS_LE_LOX10
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  };
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate:
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const VariantKind Kind;
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const MCExpr *Expr;
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  explicit SparcMCExpr(VariantKind _Kind, const MCExpr *_Expr)
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    : Kind(_Kind), Expr(_Expr) {}
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// @name Construction
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// @{
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static const SparcMCExpr *Create(VariantKind Kind, const MCExpr *Expr,
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                 MCContext &Ctx);
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// @}
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// @name Accessors
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// @{
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// getOpcode - Get the kind of this expression.
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  VariantKind getKind() const { return Kind; }
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// getSubExpr - Get the child of this expression.
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const MCExpr *getSubExpr() const { return Expr; }
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// getFixupKind - Get the fixup kind of this expression.
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Sparc::Fixups getFixupKind() const { return getFixupKind(Kind); }
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// @}
88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void PrintImpl(raw_ostream &OS) const override;
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool EvaluateAsRelocatableImpl(MCValue &Res,
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 const MCAsmLayout *Layout) const override;
91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  void visitUsedExpr(MCStreamer &Streamer) const override;
92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSection *FindAssociatedSection() const override {
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return getSubExpr()->FindAssociatedSection();
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static bool classof(const MCExpr *E) {
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return E->getKind() == MCExpr::Target;
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static bool classof(const SparcMCExpr *) { return true; }
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static VariantKind parseVariantKind(StringRef name);
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static bool printVariantKind(raw_ostream &OS, VariantKind Kind);
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static Sparc::Fixups getFixupKind(VariantKind Kind);
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end namespace llvm.
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif
112