1c2ee21cfSwanglei //= LoongArchMCExpr.h - LoongArch specific MC expression classes -*- C++ -*-==// 2c2ee21cfSwanglei // 3c2ee21cfSwanglei // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4c2ee21cfSwanglei // See https://llvm.org/LICENSE.txt for license information. 5c2ee21cfSwanglei // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c2ee21cfSwanglei // 7c2ee21cfSwanglei //===----------------------------------------------------------------------===// 8c2ee21cfSwanglei // 9c2ee21cfSwanglei // This file describes LoongArch-specific MCExprs, used for modifiers like 10c2ee21cfSwanglei // "%pc_hi20" or "%pc_lo12" etc. 11c2ee21cfSwanglei // 12c2ee21cfSwanglei //===----------------------------------------------------------------------===// 13c2ee21cfSwanglei 14c2ee21cfSwanglei #ifndef LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHMCEXPR_H 15c2ee21cfSwanglei #define LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHMCEXPR_H 16c2ee21cfSwanglei 17c2ee21cfSwanglei #include "llvm/MC/MCExpr.h" 18c2ee21cfSwanglei 19c2ee21cfSwanglei namespace llvm { 20c2ee21cfSwanglei 21c2ee21cfSwanglei class StringRef; 22c2ee21cfSwanglei 23c2ee21cfSwanglei class LoongArchMCExpr : public MCTargetExpr { 24c2ee21cfSwanglei public: 25c2ee21cfSwanglei enum VariantKind { 26c2ee21cfSwanglei VK_LoongArch_None, 27c2ee21cfSwanglei VK_LoongArch_CALL, 28c2ee21cfSwanglei VK_LoongArch_CALL_PLT, 29bf479547Swanglei VK_LoongArch_B16, 30bf479547Swanglei VK_LoongArch_B21, 31bf479547Swanglei VK_LoongArch_B26, 32bf479547Swanglei VK_LoongArch_ABS_HI20, 33bf479547Swanglei VK_LoongArch_ABS_LO12, 34bf479547Swanglei VK_LoongArch_ABS64_LO20, 35bf479547Swanglei VK_LoongArch_ABS64_HI12, 36bf479547Swanglei VK_LoongArch_PCALA_HI20, 37bf479547Swanglei VK_LoongArch_PCALA_LO12, 38bf479547Swanglei VK_LoongArch_PCALA64_LO20, 39bf479547Swanglei VK_LoongArch_PCALA64_HI12, 40bf479547Swanglei VK_LoongArch_GOT_PC_HI20, 41bf479547Swanglei VK_LoongArch_GOT_PC_LO12, 42bf479547Swanglei VK_LoongArch_GOT64_PC_LO20, 43bf479547Swanglei VK_LoongArch_GOT64_PC_HI12, 44bf479547Swanglei VK_LoongArch_GOT_HI20, 45bf479547Swanglei VK_LoongArch_GOT_LO12, 46bf479547Swanglei VK_LoongArch_GOT64_LO20, 47bf479547Swanglei VK_LoongArch_GOT64_HI12, 48bf479547Swanglei VK_LoongArch_TLS_LE_HI20, 49bf479547Swanglei VK_LoongArch_TLS_LE_LO12, 50bf479547Swanglei VK_LoongArch_TLS_LE64_LO20, 51bf479547Swanglei VK_LoongArch_TLS_LE64_HI12, 52bf479547Swanglei VK_LoongArch_TLS_IE_PC_HI20, 53bf479547Swanglei VK_LoongArch_TLS_IE_PC_LO12, 54bf479547Swanglei VK_LoongArch_TLS_IE64_PC_LO20, 55bf479547Swanglei VK_LoongArch_TLS_IE64_PC_HI12, 56bf479547Swanglei VK_LoongArch_TLS_IE_HI20, 57bf479547Swanglei VK_LoongArch_TLS_IE_LO12, 58bf479547Swanglei VK_LoongArch_TLS_IE64_LO20, 59bf479547Swanglei VK_LoongArch_TLS_IE64_HI12, 60bf479547Swanglei VK_LoongArch_TLS_LD_PC_HI20, 61bf479547Swanglei VK_LoongArch_TLS_LD_HI20, 62bf479547Swanglei VK_LoongArch_TLS_GD_PC_HI20, 63bf479547Swanglei VK_LoongArch_TLS_GD_HI20, 642cf420d5Swanglei VK_LoongArch_CALL36, 654a84d8e4Swanglei VK_LoongArch_TLS_DESC_PC_HI20, 664a84d8e4Swanglei VK_LoongArch_TLS_DESC_PC_LO12, 674a84d8e4Swanglei VK_LoongArch_TLS_DESC64_PC_LO20, 684a84d8e4Swanglei VK_LoongArch_TLS_DESC64_PC_HI12, 694a84d8e4Swanglei VK_LoongArch_TLS_DESC_HI20, 704a84d8e4Swanglei VK_LoongArch_TLS_DESC_LO12, 714a84d8e4Swanglei VK_LoongArch_TLS_DESC64_LO20, 724a84d8e4Swanglei VK_LoongArch_TLS_DESC64_HI12, 734a84d8e4Swanglei VK_LoongArch_TLS_DESC_LD, 744a84d8e4Swanglei VK_LoongArch_TLS_DESC_CALL, 750f231567Swanglei VK_LoongArch_TLS_LE_HI20_R, 760f231567Swanglei VK_LoongArch_TLS_LE_ADD_R, 770f231567Swanglei VK_LoongArch_TLS_LE_LO12_R, 78*e27358c8Swanglei VK_LoongArch_PCREL20_S2, 79*e27358c8Swanglei VK_LoongArch_TLS_LD_PCREL20_S2, 80*e27358c8Swanglei VK_LoongArch_TLS_GD_PCREL20_S2, 81*e27358c8Swanglei VK_LoongArch_TLS_DESC_PCREL20_S2, 82c2ee21cfSwanglei VK_LoongArch_Invalid // Must be the last item. 83c2ee21cfSwanglei }; 84c2ee21cfSwanglei 85c2ee21cfSwanglei private: 86c2ee21cfSwanglei const MCExpr *Expr; 87c2ee21cfSwanglei const VariantKind Kind; 88b3ef8dceSJinyang He const bool RelaxHint; 89c2ee21cfSwanglei 90b3ef8dceSJinyang He explicit LoongArchMCExpr(const MCExpr *Expr, VariantKind Kind, bool Hint) 91b3ef8dceSJinyang He : Expr(Expr), Kind(Kind), RelaxHint(Hint) {} 92c2ee21cfSwanglei 93c2ee21cfSwanglei public: 94c2ee21cfSwanglei static const LoongArchMCExpr *create(const MCExpr *Expr, VariantKind Kind, 95b3ef8dceSJinyang He MCContext &Ctx, bool Hint = false); 96c2ee21cfSwanglei 97c2ee21cfSwanglei VariantKind getKind() const { return Kind; } 98c2ee21cfSwanglei const MCExpr *getSubExpr() const { return Expr; } 99b3ef8dceSJinyang He bool getRelaxHint() const { return RelaxHint; } 100c2ee21cfSwanglei 101c2ee21cfSwanglei void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; 102e25e8003SFangrui Song bool evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, 103c2ee21cfSwanglei const MCFixup *Fixup) const override; 104c2ee21cfSwanglei void visitUsedExpr(MCStreamer &Streamer) const override; 105c2ee21cfSwanglei MCFragment *findAssociatedFragment() const override { 106c2ee21cfSwanglei return getSubExpr()->findAssociatedFragment(); 107c2ee21cfSwanglei } 108c2ee21cfSwanglei 10939b1fec1Swanglei void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override; 110c2ee21cfSwanglei 111c2ee21cfSwanglei static bool classof(const MCExpr *E) { 112c2ee21cfSwanglei return E->getKind() == MCExpr::Target; 113c2ee21cfSwanglei } 114c2ee21cfSwanglei 115c2ee21cfSwanglei static StringRef getVariantKindName(VariantKind Kind); 116c2ee21cfSwanglei static VariantKind getVariantKindForName(StringRef name); 117c2ee21cfSwanglei }; 118c2ee21cfSwanglei 119c2ee21cfSwanglei } // end namespace llvm 120c2ee21cfSwanglei 121c2ee21cfSwanglei #endif 122