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