1262261Sdim//====- SparcMCExpr.h - Sparc specific MC expression classes --*- C++ -*-=====// 2262261Sdim// 3262261Sdim// The LLVM Compiler Infrastructure 4262261Sdim// 5262261Sdim// This file is distributed under the University of Illinois Open Source 6262261Sdim// License. See LICENSE.TXT for details. 7262261Sdim// 8262261Sdim//===----------------------------------------------------------------------===// 9262261Sdim// 10262261Sdim// This file describes Sparc-specific MCExprs, used for modifiers like 11262261Sdim// "%hi" or "%lo" etc., 12262261Sdim// 13262261Sdim//===----------------------------------------------------------------------===// 14262261Sdim 15280031Sdim#ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H 16280031Sdim#define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H 17262261Sdim 18262261Sdim#include "SparcFixupKinds.h" 19262261Sdim#include "llvm/MC/MCExpr.h" 20262261Sdim 21262261Sdimnamespace llvm { 22262261Sdim 23262261Sdimclass StringRef; 24262261Sdimclass SparcMCExpr : public MCTargetExpr { 25262261Sdimpublic: 26262261Sdim enum VariantKind { 27262261Sdim VK_Sparc_None, 28262261Sdim VK_Sparc_LO, 29262261Sdim VK_Sparc_HI, 30262261Sdim VK_Sparc_H44, 31262261Sdim VK_Sparc_M44, 32262261Sdim VK_Sparc_L44, 33262261Sdim VK_Sparc_HH, 34262261Sdim VK_Sparc_HM, 35262261Sdim VK_Sparc_PC22, 36262261Sdim VK_Sparc_PC10, 37262261Sdim VK_Sparc_GOT22, 38262261Sdim VK_Sparc_GOT10, 39262261Sdim VK_Sparc_WPLT30, 40262261Sdim VK_Sparc_R_DISP32, 41262261Sdim VK_Sparc_TLS_GD_HI22, 42262261Sdim VK_Sparc_TLS_GD_LO10, 43262261Sdim VK_Sparc_TLS_GD_ADD, 44262261Sdim VK_Sparc_TLS_GD_CALL, 45262261Sdim VK_Sparc_TLS_LDM_HI22, 46262261Sdim VK_Sparc_TLS_LDM_LO10, 47262261Sdim VK_Sparc_TLS_LDM_ADD, 48262261Sdim VK_Sparc_TLS_LDM_CALL, 49262261Sdim VK_Sparc_TLS_LDO_HIX22, 50262261Sdim VK_Sparc_TLS_LDO_LOX10, 51262261Sdim VK_Sparc_TLS_LDO_ADD, 52262261Sdim VK_Sparc_TLS_IE_HI22, 53262261Sdim VK_Sparc_TLS_IE_LO10, 54262261Sdim VK_Sparc_TLS_IE_LD, 55262261Sdim VK_Sparc_TLS_IE_LDX, 56262261Sdim VK_Sparc_TLS_IE_ADD, 57262261Sdim VK_Sparc_TLS_LE_HIX22, 58262261Sdim VK_Sparc_TLS_LE_LOX10 59262261Sdim }; 60262261Sdim 61262261Sdimprivate: 62262261Sdim const VariantKind Kind; 63262261Sdim const MCExpr *Expr; 64262261Sdim 65288943Sdim explicit SparcMCExpr(VariantKind Kind, const MCExpr *Expr) 66288943Sdim : Kind(Kind), Expr(Expr) {} 67262261Sdim 68262261Sdimpublic: 69262261Sdim /// @name Construction 70262261Sdim /// @{ 71262261Sdim 72288943Sdim static const SparcMCExpr *create(VariantKind Kind, const MCExpr *Expr, 73262261Sdim MCContext &Ctx); 74262261Sdim /// @} 75262261Sdim /// @name Accessors 76262261Sdim /// @{ 77262261Sdim 78262261Sdim /// getOpcode - Get the kind of this expression. 79262261Sdim VariantKind getKind() const { return Kind; } 80262261Sdim 81262261Sdim /// getSubExpr - Get the child of this expression. 82262261Sdim const MCExpr *getSubExpr() const { return Expr; } 83262261Sdim 84262261Sdim /// getFixupKind - Get the fixup kind of this expression. 85262261Sdim Sparc::Fixups getFixupKind() const { return getFixupKind(Kind); } 86262261Sdim 87262261Sdim /// @} 88288943Sdim void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; 89288943Sdim bool evaluateAsRelocatableImpl(MCValue &Res, 90280031Sdim const MCAsmLayout *Layout, 91280031Sdim const MCFixup *Fixup) const override; 92276479Sdim void visitUsedExpr(MCStreamer &Streamer) const override; 93296417Sdim MCFragment *findAssociatedFragment() const override { 94296417Sdim return getSubExpr()->findAssociatedFragment(); 95262261Sdim } 96262261Sdim 97276479Sdim void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override; 98262261Sdim 99262261Sdim static bool classof(const MCExpr *E) { 100262261Sdim return E->getKind() == MCExpr::Target; 101262261Sdim } 102262261Sdim 103262261Sdim static bool classof(const SparcMCExpr *) { return true; } 104262261Sdim 105262261Sdim static VariantKind parseVariantKind(StringRef name); 106262261Sdim static bool printVariantKind(raw_ostream &OS, VariantKind Kind); 107262261Sdim static Sparc::Fixups getFixupKind(VariantKind Kind); 108262261Sdim}; 109262261Sdim 110262261Sdim} // end namespace llvm. 111262261Sdim 112262261Sdim#endif 113