xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCExpr.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1fe6060f1SDimitry Andric //===-- CSKYMCExpr.h - CSKY specific MC expression classes -*- C++ -*----===//
2fe6060f1SDimitry Andric //
3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe6060f1SDimitry Andric //
7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8fe6060f1SDimitry Andric 
9fe6060f1SDimitry Andric #ifndef LLVM_LIB_TARGET_LANAI_MCTARGETDESC_LANAIMCEXPR_H
10fe6060f1SDimitry Andric #define LLVM_LIB_TARGET_LANAI_MCTARGETDESC_LANAIMCEXPR_H
11fe6060f1SDimitry Andric 
12fe6060f1SDimitry Andric #include "llvm/MC/MCExpr.h"
13fe6060f1SDimitry Andric #include "llvm/MC/MCValue.h"
14fe6060f1SDimitry Andric 
15fe6060f1SDimitry Andric namespace llvm {
16fe6060f1SDimitry Andric 
17fe6060f1SDimitry Andric class CSKYMCExpr : public MCTargetExpr {
18fe6060f1SDimitry Andric public:
19fe6060f1SDimitry Andric   enum VariantKind {
20fe6060f1SDimitry Andric     VK_CSKY_None,
21fe6060f1SDimitry Andric     VK_CSKY_ADDR,
22349cc55cSDimitry Andric     VK_CSKY_ADDR_HI16,
23349cc55cSDimitry Andric     VK_CSKY_ADDR_LO16,
24fe6060f1SDimitry Andric     VK_CSKY_PCREL,
25fe6060f1SDimitry Andric     VK_CSKY_GOT,
26349cc55cSDimitry Andric     VK_CSKY_GOT_IMM18_BY4,
27fe6060f1SDimitry Andric     VK_CSKY_GOTPC,
28fe6060f1SDimitry Andric     VK_CSKY_GOTOFF,
29fe6060f1SDimitry Andric     VK_CSKY_PLT,
30349cc55cSDimitry Andric     VK_CSKY_PLT_IMM18_BY4,
31349cc55cSDimitry Andric     VK_CSKY_TLSIE,
32349cc55cSDimitry Andric     VK_CSKY_TLSLE,
33fe6060f1SDimitry Andric     VK_CSKY_TLSGD,
34349cc55cSDimitry Andric     VK_CSKY_TLSLDO,
35349cc55cSDimitry Andric     VK_CSKY_TLSLDM,
36fe6060f1SDimitry Andric     VK_CSKY_Invalid
37fe6060f1SDimitry Andric   };
38fe6060f1SDimitry Andric 
39fe6060f1SDimitry Andric private:
40fe6060f1SDimitry Andric   const VariantKind Kind;
41fe6060f1SDimitry Andric   const MCExpr *Expr;
42fe6060f1SDimitry Andric 
43fe6060f1SDimitry Andric   explicit CSKYMCExpr(VariantKind Kind, const MCExpr *Expr)
44fe6060f1SDimitry Andric       : Kind(Kind), Expr(Expr) {}
45fe6060f1SDimitry Andric 
46fe6060f1SDimitry Andric public:
47fe6060f1SDimitry Andric   static const CSKYMCExpr *create(const MCExpr *Expr, VariantKind Kind,
48fe6060f1SDimitry Andric                                   MCContext &Ctx);
49fe6060f1SDimitry Andric 
50fe6060f1SDimitry Andric   // Returns the kind of this expression.
51fe6060f1SDimitry Andric   VariantKind getKind() const { return Kind; }
52fe6060f1SDimitry Andric 
53fe6060f1SDimitry Andric   // Returns the child of this expression.
54fe6060f1SDimitry Andric   const MCExpr *getSubExpr() const { return Expr; }
55fe6060f1SDimitry Andric 
56fe6060f1SDimitry Andric   void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
57fe6060f1SDimitry Andric 
58*0fca6ea1SDimitry Andric   bool evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
59fe6060f1SDimitry Andric                                  const MCFixup *Fixup) const override;
60fe6060f1SDimitry Andric   void visitUsedExpr(MCStreamer &Streamer) const override;
61fe6060f1SDimitry Andric 
62fe6060f1SDimitry Andric   MCFragment *findAssociatedFragment() const override {
63fe6060f1SDimitry Andric     return getSubExpr()->findAssociatedFragment();
64fe6060f1SDimitry Andric   }
65fe6060f1SDimitry Andric 
66fe6060f1SDimitry Andric   void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
67fe6060f1SDimitry Andric 
68fe6060f1SDimitry Andric   static bool classof(const MCExpr *E) {
69fe6060f1SDimitry Andric     return E->getKind() == MCExpr::Target;
70fe6060f1SDimitry Andric   }
71fe6060f1SDimitry Andric 
72fe6060f1SDimitry Andric   static StringRef getVariantKindName(VariantKind Kind);
73fe6060f1SDimitry Andric };
74fe6060f1SDimitry Andric } // end namespace llvm
75fe6060f1SDimitry Andric 
76fe6060f1SDimitry Andric #endif
77