xref: /llvm-project/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCExpr.h (revision e27358c8ed7abac200546e808ea30a86aa9aa580)
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