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