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