1 //===-- ARMMCExpr.h - ARM specific MC expression classes --------*- C++ -*-===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCEXPR_H 10 #define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCEXPR_H 11 12 #include "llvm/MC/MCExpr.h" 13 14 namespace llvm { 15 16 class ARMMCExpr : public MCTargetExpr { 17 public: 18 enum VariantKind { 19 VK_ARM_None, 20 VK_ARM_HI16, // The R_ARM_MOVT_ABS relocation (:upper16: in the .s file) 21 VK_ARM_LO16 // The R_ARM_MOVW_ABS_NC relocation (:lower16: in the .s file) 22 }; 23 24 private: 25 const VariantKind Kind; 26 const MCExpr *Expr; 27 ARMMCExpr(VariantKind Kind,const MCExpr * Expr)28 explicit ARMMCExpr(VariantKind Kind, const MCExpr *Expr) 29 : Kind(Kind), Expr(Expr) {} 30 31 public: 32 /// @name Construction 33 /// @{ 34 35 static const ARMMCExpr *create(VariantKind Kind, const MCExpr *Expr, 36 MCContext &Ctx); 37 createUpper16(const MCExpr * Expr,MCContext & Ctx)38 static const ARMMCExpr *createUpper16(const MCExpr *Expr, MCContext &Ctx) { 39 return create(VK_ARM_HI16, Expr, Ctx); 40 } 41 createLower16(const MCExpr * Expr,MCContext & Ctx)42 static const ARMMCExpr *createLower16(const MCExpr *Expr, MCContext &Ctx) { 43 return create(VK_ARM_LO16, Expr, Ctx); 44 } 45 46 /// @} 47 /// @name Accessors 48 /// @{ 49 50 /// getOpcode - Get the kind of this expression. getKind()51 VariantKind getKind() const { return Kind; } 52 53 /// getSubExpr - Get the child of this expression. getSubExpr()54 const MCExpr *getSubExpr() const { return Expr; } 55 56 /// @} 57 58 void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; evaluateAsRelocatableImpl(MCValue & Res,const MCAsmLayout * Layout,const MCFixup * Fixup)59 bool evaluateAsRelocatableImpl(MCValue &Res, 60 const MCAsmLayout *Layout, 61 const MCFixup *Fixup) const override { 62 return false; 63 } 64 void visitUsedExpr(MCStreamer &Streamer) const override; findAssociatedFragment()65 MCFragment *findAssociatedFragment() const override { 66 return getSubExpr()->findAssociatedFragment(); 67 } 68 69 // There are no TLS ARMMCExprs at the moment. fixELFSymbolsInTLSFixups(MCAssembler & Asm)70 void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} 71 classof(const MCExpr * E)72 static bool classof(const MCExpr *E) { 73 return E->getKind() == MCExpr::Target; 74 } 75 }; 76 } // end namespace llvm 77 78 #endif 79