106c3fb27SDimitry Andric //===-- SystemZMCExpr.h - SystemZ specific MC expression classes -*- C++-*-===// 206c3fb27SDimitry Andric // 306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606c3fb27SDimitry Andric // 706c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 806c3fb27SDimitry Andric 95f757f3fSDimitry Andric #ifndef LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZMCEXPR_H 105f757f3fSDimitry Andric #define LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZMCEXPR_H 1106c3fb27SDimitry Andric 1206c3fb27SDimitry Andric #include "llvm/MC/MCExpr.h" 1306c3fb27SDimitry Andric #include "llvm/MC/MCStreamer.h" 1406c3fb27SDimitry Andric #include "llvm/MC/MCValue.h" 1506c3fb27SDimitry Andric 1606c3fb27SDimitry Andric namespace llvm { 1706c3fb27SDimitry Andric 1806c3fb27SDimitry Andric class SystemZMCExpr : public MCTargetExpr { 1906c3fb27SDimitry Andric public: 2006c3fb27SDimitry Andric // HLASM docs for address constants: 2106c3fb27SDimitry Andric // https://www.ibm.com/docs/en/hla-and-tf/1.6?topic=value-address-constants 2206c3fb27SDimitry Andric enum VariantKind { 2306c3fb27SDimitry Andric VK_SystemZ_None, 2406c3fb27SDimitry Andric VK_SystemZ_RCon, // Address of ADA of symbol. 2506c3fb27SDimitry Andric VK_SystemZ_VCon, // Address of external function symbol. 2606c3fb27SDimitry Andric }; 2706c3fb27SDimitry Andric 2806c3fb27SDimitry Andric private: 2906c3fb27SDimitry Andric const VariantKind Kind; 3006c3fb27SDimitry Andric const MCExpr *Expr; 3106c3fb27SDimitry Andric SystemZMCExpr(VariantKind Kind,const MCExpr * Expr)3206c3fb27SDimitry Andric explicit SystemZMCExpr(VariantKind Kind, const MCExpr *Expr) 3306c3fb27SDimitry Andric : Kind(Kind), Expr(Expr) {} 3406c3fb27SDimitry Andric 3506c3fb27SDimitry Andric public: 3606c3fb27SDimitry Andric static const SystemZMCExpr *create(VariantKind Kind, const MCExpr *Expr, 3706c3fb27SDimitry Andric MCContext &Ctx); 3806c3fb27SDimitry Andric 3906c3fb27SDimitry Andric /// getOpcode - Get the kind of this expression. getKind()4006c3fb27SDimitry Andric VariantKind getKind() const { return Kind; } 4106c3fb27SDimitry Andric 4206c3fb27SDimitry Andric /// getSubExpr - Get the child of this expression. getSubExpr()4306c3fb27SDimitry Andric const MCExpr *getSubExpr() const { return Expr; } 4406c3fb27SDimitry Andric 4506c3fb27SDimitry Andric StringRef getVariantKindName() const; 4606c3fb27SDimitry Andric 4706c3fb27SDimitry Andric void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; 48*0fca6ea1SDimitry Andric bool evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, 4906c3fb27SDimitry Andric const MCFixup *Fixup) const override; visitUsedExpr(MCStreamer & Streamer)5006c3fb27SDimitry Andric void visitUsedExpr(MCStreamer &Streamer) const override { 5106c3fb27SDimitry Andric Streamer.visitUsedExpr(*getSubExpr()); 5206c3fb27SDimitry Andric } findAssociatedFragment()5306c3fb27SDimitry Andric MCFragment *findAssociatedFragment() const override { 5406c3fb27SDimitry Andric return getSubExpr()->findAssociatedFragment(); 5506c3fb27SDimitry Andric } 5606c3fb27SDimitry Andric 5706c3fb27SDimitry Andric // There are no TLS SystemZMCExprs at the moment. fixELFSymbolsInTLSFixups(MCAssembler & Asm)5806c3fb27SDimitry Andric void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} 5906c3fb27SDimitry Andric classof(const MCExpr * E)6006c3fb27SDimitry Andric static bool classof(const MCExpr *E) { 6106c3fb27SDimitry Andric return E->getKind() == MCExpr::Target; 6206c3fb27SDimitry Andric } 6306c3fb27SDimitry Andric }; 6406c3fb27SDimitry Andric } // end namespace llvm 6506c3fb27SDimitry Andric 6606c3fb27SDimitry Andric #endif 67