Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 1 | //====- SparcMCExpr.h - Sparc specific MC expression classes --*- C++ -*-=====// |
| 2 | // |
Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 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 |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // This file describes Sparc-specific MCExprs, used for modifiers like |
| 10 | // "%hi" or "%lo" etc., |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
Benjamin Kramer | a7c40ef | 2014-08-13 16:26:38 +0000 | [diff] [blame] | 14 | #ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H |
| 15 | #define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 16 | |
Venkatraman Govindaraju | 104643d | 2014-02-07 04:24:35 +0000 | [diff] [blame] | 17 | #include "SparcFixupKinds.h" |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 18 | #include "llvm/MC/MCExpr.h" |
| 19 | |
| 20 | namespace llvm { |
| 21 | |
Venkatraman Govindaraju | 559c4ac | 2014-01-07 08:00:49 +0000 | [diff] [blame] | 22 | class StringRef; |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 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, |
Venkatraman Govindaraju | 104643d | 2014-02-07 04:24:35 +0000 | [diff] [blame] | 34 | VK_Sparc_PC22, |
| 35 | VK_Sparc_PC10, |
| 36 | VK_Sparc_GOT22, |
| 37 | VK_Sparc_GOT10, |
Daniel Cederman | 33f67a2 | 2018-06-11 05:50:08 +0000 | [diff] [blame] | 38 | VK_Sparc_GOT13, |
| 39 | VK_Sparc_13, |
Venkatraman Govindaraju | 104643d | 2014-02-07 04:24:35 +0000 | [diff] [blame] | 40 | VK_Sparc_WPLT30, |
Venkatraman Govindaraju | fd5c1f9 | 2014-01-29 04:51:35 +0000 | [diff] [blame] | 41 | VK_Sparc_R_DISP32, |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 42 | VK_Sparc_TLS_GD_HI22, |
| 43 | VK_Sparc_TLS_GD_LO10, |
| 44 | VK_Sparc_TLS_GD_ADD, |
| 45 | VK_Sparc_TLS_GD_CALL, |
| 46 | VK_Sparc_TLS_LDM_HI22, |
| 47 | VK_Sparc_TLS_LDM_LO10, |
| 48 | VK_Sparc_TLS_LDM_ADD, |
| 49 | VK_Sparc_TLS_LDM_CALL, |
| 50 | VK_Sparc_TLS_LDO_HIX22, |
| 51 | VK_Sparc_TLS_LDO_LOX10, |
| 52 | VK_Sparc_TLS_LDO_ADD, |
| 53 | VK_Sparc_TLS_IE_HI22, |
| 54 | VK_Sparc_TLS_IE_LO10, |
| 55 | VK_Sparc_TLS_IE_LD, |
| 56 | VK_Sparc_TLS_IE_LDX, |
| 57 | VK_Sparc_TLS_IE_ADD, |
| 58 | VK_Sparc_TLS_LE_HIX22, |
| 59 | VK_Sparc_TLS_LE_LOX10 |
| 60 | }; |
| 61 | |
| 62 | private: |
| 63 | const VariantKind Kind; |
| 64 | const MCExpr *Expr; |
| 65 | |
David Blaikie | 9f380a3 | 2015-03-16 18:06:57 +0000 | [diff] [blame] | 66 | explicit SparcMCExpr(VariantKind Kind, const MCExpr *Expr) |
| 67 | : Kind(Kind), Expr(Expr) {} |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 68 | |
| 69 | public: |
| 70 | /// @name Construction |
| 71 | /// @{ |
| 72 | |
Jim Grosbach | 13760bd | 2015-05-30 01:25:56 +0000 | [diff] [blame] | 73 | static const SparcMCExpr *create(VariantKind Kind, const MCExpr *Expr, |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 74 | MCContext &Ctx); |
| 75 | /// @} |
| 76 | /// @name Accessors |
| 77 | /// @{ |
| 78 | |
| 79 | /// getOpcode - Get the kind of this expression. |
| 80 | VariantKind getKind() const { return Kind; } |
| 81 | |
| 82 | /// getSubExpr - Get the child of this expression. |
| 83 | const MCExpr *getSubExpr() const { return Expr; } |
| 84 | |
Venkatraman Govindaraju | 104643d | 2014-02-07 04:24:35 +0000 | [diff] [blame] | 85 | /// getFixupKind - Get the fixup kind of this expression. |
| 86 | Sparc::Fixups getFixupKind() const { return getFixupKind(Kind); } |
| 87 | |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 88 | /// @} |
Matt Arsenault | 8b64355 | 2015-06-09 00:31:39 +0000 | [diff] [blame] | 89 | void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; |
Jim Grosbach | 13760bd | 2015-05-30 01:25:56 +0000 | [diff] [blame] | 90 | bool evaluateAsRelocatableImpl(MCValue &Res, |
Joerg Sonnenberger | 752b91b | 2014-08-10 11:35:12 +0000 | [diff] [blame] | 91 | const MCAsmLayout *Layout, |
| 92 | const MCFixup *Fixup) const override; |
Rafael Espindola | e2c6624 | 2014-06-25 15:45:33 +0000 | [diff] [blame] | 93 | void visitUsedExpr(MCStreamer &Streamer) const override; |
Rafael Espindola | e3a20f5 | 2015-10-05 12:07:05 +0000 | [diff] [blame] | 94 | MCFragment *findAssociatedFragment() const override { |
| 95 | return getSubExpr()->findAssociatedFragment(); |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 96 | } |
| 97 | |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 98 | void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override; |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 99 | |
| 100 | static bool classof(const MCExpr *E) { |
| 101 | return E->getKind() == MCExpr::Target; |
| 102 | } |
| 103 | |
| 104 | static bool classof(const SparcMCExpr *) { return true; } |
| 105 | |
Venkatraman Govindaraju | 559c4ac | 2014-01-07 08:00:49 +0000 | [diff] [blame] | 106 | static VariantKind parseVariantKind(StringRef name); |
Venkatraman Govindaraju | dfe09b1 | 2014-02-07 02:36:06 +0000 | [diff] [blame] | 107 | static bool printVariantKind(raw_ostream &OS, VariantKind Kind); |
Venkatraman Govindaraju | 104643d | 2014-02-07 04:24:35 +0000 | [diff] [blame] | 108 | static Sparc::Fixups getFixupKind(VariantKind Kind); |
Venkatraman Govindaraju | 08bcf29 | 2013-12-26 00:01:52 +0000 | [diff] [blame] | 109 | }; |
| 110 | |
| 111 | } // end namespace llvm. |
| 112 | |
| 113 | #endif |