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