xref: /freebsd/contrib/llvm-project/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCExpr.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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