1234353Sdim//===-- ARMMCExpr.h - ARM specific MC expression classes --------*- C++ -*-===// 2226584Sdim// 3226584Sdim// The LLVM Compiler Infrastructure 4226584Sdim// 5226584Sdim// This file is distributed under the University of Illinois Open Source 6226584Sdim// License. See LICENSE.TXT for details. 7226584Sdim// 8226584Sdim//===----------------------------------------------------------------------===// 9226584Sdim 10226584Sdim#ifndef ARMMCEXPR_H 11226584Sdim#define ARMMCEXPR_H 12226584Sdim 13226584Sdim#include "llvm/MC/MCExpr.h" 14226584Sdim 15226584Sdimnamespace llvm { 16226584Sdim 17226584Sdimclass ARMMCExpr : public MCTargetExpr { 18226584Sdimpublic: 19226584Sdim enum VariantKind { 20226584Sdim VK_ARM_None, 21226584Sdim VK_ARM_HI16, // The R_ARM_MOVT_ABS relocation (:upper16: in the .s file) 22226584Sdim VK_ARM_LO16 // The R_ARM_MOVW_ABS_NC relocation (:lower16: in the .s file) 23226584Sdim }; 24226584Sdim 25226584Sdimprivate: 26226584Sdim const VariantKind Kind; 27226584Sdim const MCExpr *Expr; 28226584Sdim 29226584Sdim explicit ARMMCExpr(VariantKind _Kind, const MCExpr *_Expr) 30226584Sdim : Kind(_Kind), Expr(_Expr) {} 31243830Sdim 32226584Sdimpublic: 33226584Sdim /// @name Construction 34226584Sdim /// @{ 35226584Sdim 36226584Sdim static const ARMMCExpr *Create(VariantKind Kind, const MCExpr *Expr, 37226584Sdim MCContext &Ctx); 38226584Sdim 39226584Sdim static const ARMMCExpr *CreateUpper16(const MCExpr *Expr, MCContext &Ctx) { 40226584Sdim return Create(VK_ARM_HI16, Expr, Ctx); 41226584Sdim } 42226584Sdim 43226584Sdim static const ARMMCExpr *CreateLower16(const MCExpr *Expr, MCContext &Ctx) { 44226584Sdim return Create(VK_ARM_LO16, Expr, Ctx); 45226584Sdim } 46226584Sdim 47226584Sdim /// @} 48226584Sdim /// @name Accessors 49226584Sdim /// @{ 50226584Sdim 51226584Sdim /// getOpcode - Get the kind of this expression. 52226584Sdim VariantKind getKind() const { return Kind; } 53226584Sdim 54226584Sdim /// getSubExpr - Get the child of this expression. 55226584Sdim const MCExpr *getSubExpr() const { return Expr; } 56226584Sdim 57226584Sdim /// @} 58226584Sdim 59226584Sdim void PrintImpl(raw_ostream &OS) const; 60226584Sdim bool EvaluateAsRelocatableImpl(MCValue &Res, 61226584Sdim const MCAsmLayout *Layout) const; 62226584Sdim void AddValueSymbols(MCAssembler *) const; 63226584Sdim const MCSection *FindAssociatedSection() const { 64226584Sdim return getSubExpr()->FindAssociatedSection(); 65226584Sdim } 66226584Sdim 67249423Sdim // There are no TLS ARMMCExprs at the moment. 68249423Sdim void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {} 69249423Sdim 70226584Sdim static bool classof(const MCExpr *E) { 71226584Sdim return E->getKind() == MCExpr::Target; 72226584Sdim } 73226584Sdim}; 74226584Sdim} // end namespace llvm 75226584Sdim 76226584Sdim#endif 77