1 //====- SparcMCExpr.h - Sparc specific MC expression classes --*- C++ -*-=====// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file describes Sparc-specific MCExprs, used for modifiers like 10 // "%hi" or "%lo" etc., 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H 15 #define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H 16 17 #include "SparcFixupKinds.h" 18 #include "llvm/MC/MCExpr.h" 19 20 namespace llvm { 21 22 class StringRef; 23 class SparcMCExpr : public MCTargetExpr { 24 public: 25 enum VariantKind { 26 VK_Sparc_None, 27 VK_Sparc_LO, 28 VK_Sparc_HI, 29 VK_Sparc_H44, 30 VK_Sparc_M44, 31 VK_Sparc_L44, 32 VK_Sparc_HH, 33 VK_Sparc_HM, 34 VK_Sparc_LM, 35 VK_Sparc_PC22, 36 VK_Sparc_PC10, 37 VK_Sparc_GOT22, 38 VK_Sparc_GOT10, 39 VK_Sparc_GOT13, 40 VK_Sparc_13, 41 VK_Sparc_WPLT30, 42 VK_Sparc_WDISP30, 43 VK_Sparc_R_DISP32, 44 VK_Sparc_TLS_GD_HI22, 45 VK_Sparc_TLS_GD_LO10, 46 VK_Sparc_TLS_GD_ADD, 47 VK_Sparc_TLS_GD_CALL, 48 VK_Sparc_TLS_LDM_HI22, 49 VK_Sparc_TLS_LDM_LO10, 50 VK_Sparc_TLS_LDM_ADD, 51 VK_Sparc_TLS_LDM_CALL, 52 VK_Sparc_TLS_LDO_HIX22, 53 VK_Sparc_TLS_LDO_LOX10, 54 VK_Sparc_TLS_LDO_ADD, 55 VK_Sparc_TLS_IE_HI22, 56 VK_Sparc_TLS_IE_LO10, 57 VK_Sparc_TLS_IE_LD, 58 VK_Sparc_TLS_IE_LDX, 59 VK_Sparc_TLS_IE_ADD, 60 VK_Sparc_TLS_LE_HIX22, 61 VK_Sparc_TLS_LE_LOX10, 62 VK_Sparc_HIX22, 63 VK_Sparc_LOX10, 64 VK_Sparc_GOTDATA_HIX22, 65 VK_Sparc_GOTDATA_LOX10, 66 VK_Sparc_GOTDATA_OP, 67 }; 68 69 private: 70 const VariantKind Kind; 71 const MCExpr *Expr; 72 SparcMCExpr(VariantKind Kind,const MCExpr * Expr)73 explicit SparcMCExpr(VariantKind Kind, const MCExpr *Expr) 74 : Kind(Kind), Expr(Expr) {} 75 76 public: 77 /// @name Construction 78 /// @{ 79 80 static const SparcMCExpr *create(VariantKind Kind, const MCExpr *Expr, 81 MCContext &Ctx); 82 /// @} 83 /// @name Accessors 84 /// @{ 85 86 /// getOpcode - Get the kind of this expression. getKind()87 VariantKind getKind() const { return Kind; } 88 89 /// getSubExpr - Get the child of this expression. getSubExpr()90 const MCExpr *getSubExpr() const { return Expr; } 91 92 /// getFixupKind - Get the fixup kind of this expression. getFixupKind()93 Sparc::Fixups getFixupKind() const { return getFixupKind(Kind); } 94 95 /// @} 96 void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; 97 bool evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, 98 const MCFixup *Fixup) const override; 99 void visitUsedExpr(MCStreamer &Streamer) const override; findAssociatedFragment()100 MCFragment *findAssociatedFragment() const override { 101 return getSubExpr()->findAssociatedFragment(); 102 } 103 104 void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override; 105 classof(const MCExpr * E)106 static bool classof(const MCExpr *E) { 107 return E->getKind() == MCExpr::Target; 108 } 109 110 static VariantKind parseVariantKind(StringRef name); 111 static bool printVariantKind(raw_ostream &OS, VariantKind Kind); 112 static Sparc::Fixups getFixupKind(VariantKind Kind); 113 }; 114 115 } // end namespace llvm. 116 117 #endif 118