1 //===-- PPCMCExpr.h - PPC specific MC expression classes --------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCEXPR_H
10 #define LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCEXPR_H
12 #include "llvm/MC/MCAsmLayout.h"
13 #include "llvm/MC/MCExpr.h"
14 #include "llvm/MC/MCValue.h"
18 class PPCMCExpr
: public MCTargetExpr
{
34 const VariantKind Kind
;
38 int64_t evaluateAsInt64(int64_t Value
) const;
40 explicit PPCMCExpr(VariantKind Kind
, const MCExpr
*Expr
, bool IsDarwin
)
41 : Kind(Kind
), Expr(Expr
), IsDarwin(IsDarwin
) {}
44 /// @name Construction
47 static const PPCMCExpr
*create(VariantKind Kind
, const MCExpr
*Expr
,
48 bool IsDarwin
, MCContext
&Ctx
);
50 static const PPCMCExpr
*createLo(const MCExpr
*Expr
,
51 bool IsDarwin
, MCContext
&Ctx
) {
52 return create(VK_PPC_LO
, Expr
, IsDarwin
, Ctx
);
55 static const PPCMCExpr
*createHi(const MCExpr
*Expr
,
56 bool IsDarwin
, MCContext
&Ctx
) {
57 return create(VK_PPC_HI
, Expr
, IsDarwin
, Ctx
);
60 static const PPCMCExpr
*createHa(const MCExpr
*Expr
,
61 bool IsDarwin
, MCContext
&Ctx
) {
62 return create(VK_PPC_HA
, Expr
, IsDarwin
, Ctx
);
69 /// getOpcode - Get the kind of this expression.
70 VariantKind
getKind() const { return Kind
; }
72 /// getSubExpr - Get the child of this expression.
73 const MCExpr
*getSubExpr() const { return Expr
; }
75 /// isDarwinSyntax - True if expression is to be printed using Darwin syntax.
76 bool isDarwinSyntax() const { return IsDarwin
; }
81 void printImpl(raw_ostream
&OS
, const MCAsmInfo
*MAI
) const override
;
82 bool evaluateAsRelocatableImpl(MCValue
&Res
,
83 const MCAsmLayout
*Layout
,
84 const MCFixup
*Fixup
) const override
;
85 void visitUsedExpr(MCStreamer
&Streamer
) const override
;
86 MCFragment
*findAssociatedFragment() const override
{
87 return getSubExpr()->findAssociatedFragment();
90 // There are no TLS PPCMCExprs at the moment.
91 void fixELFSymbolsInTLSFixups(MCAssembler
&Asm
) const override
{}
93 bool evaluateAsConstant(int64_t &Res
) const;
95 static bool classof(const MCExpr
*E
) {
96 return E
->getKind() == MCExpr::Target
;
99 } // end namespace llvm