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
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_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
654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  explicit SparcMCExpr(VariantKind Kind, const MCExpr *Expr)
664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      : Kind(Kind), Expr(Expr) {}
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// @name Construction
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// @{
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  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  /// @}
886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool evaluateAsRelocatableImpl(MCValue &Res,
9037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                 const MCAsmLayout *Layout,
9137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                 const MCFixup *Fixup) const override;
92c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void visitUsedExpr(MCStreamer &Streamer) const override;
93f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCFragment *findAssociatedFragment() const override {
94f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return getSubExpr()->findAssociatedFragment();
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static bool classof(const MCExpr *E) {
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return E->getKind() == MCExpr::Target;
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static bool classof(const SparcMCExpr *) { return true; }
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static VariantKind parseVariantKind(StringRef name);
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static bool printVariantKind(raw_ostream &OS, VariantKind Kind);
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static Sparc::Fixups getFixupKind(VariantKind Kind);
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end namespace llvm.
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif
113