131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- ARMMCExpr.h - ARM specific MC expression classes --------*- C++ -*-===// 27597212abced110723f2fee985a7d60557c092ecEvan Cheng// 37597212abced110723f2fee985a7d60557c092ecEvan Cheng// The LLVM Compiler Infrastructure 47597212abced110723f2fee985a7d60557c092ecEvan Cheng// 57597212abced110723f2fee985a7d60557c092ecEvan Cheng// This file is distributed under the University of Illinois Open Source 67597212abced110723f2fee985a7d60557c092ecEvan Cheng// License. See LICENSE.TXT for details. 77597212abced110723f2fee985a7d60557c092ecEvan Cheng// 87597212abced110723f2fee985a7d60557c092ecEvan Cheng//===----------------------------------------------------------------------===// 97597212abced110723f2fee985a7d60557c092ecEvan Cheng 107597212abced110723f2fee985a7d60557c092ecEvan Cheng#ifndef ARMMCEXPR_H 117597212abced110723f2fee985a7d60557c092ecEvan Cheng#define ARMMCEXPR_H 127597212abced110723f2fee985a7d60557c092ecEvan Cheng 137597212abced110723f2fee985a7d60557c092ecEvan Cheng#include "llvm/MC/MCExpr.h" 147597212abced110723f2fee985a7d60557c092ecEvan Cheng 157597212abced110723f2fee985a7d60557c092ecEvan Chengnamespace llvm { 167597212abced110723f2fee985a7d60557c092ecEvan Cheng 177597212abced110723f2fee985a7d60557c092ecEvan Chengclass ARMMCExpr : public MCTargetExpr { 187597212abced110723f2fee985a7d60557c092ecEvan Chengpublic: 197597212abced110723f2fee985a7d60557c092ecEvan Cheng enum VariantKind { 207597212abced110723f2fee985a7d60557c092ecEvan Cheng VK_ARM_None, 217597212abced110723f2fee985a7d60557c092ecEvan Cheng VK_ARM_HI16, // The R_ARM_MOVT_ABS relocation (:upper16: in the .s file) 227597212abced110723f2fee985a7d60557c092ecEvan Cheng VK_ARM_LO16 // The R_ARM_MOVW_ABS_NC relocation (:lower16: in the .s file) 237597212abced110723f2fee985a7d60557c092ecEvan Cheng }; 247597212abced110723f2fee985a7d60557c092ecEvan Cheng 257597212abced110723f2fee985a7d60557c092ecEvan Chengprivate: 267597212abced110723f2fee985a7d60557c092ecEvan Cheng const VariantKind Kind; 277597212abced110723f2fee985a7d60557c092ecEvan Cheng const MCExpr *Expr; 287597212abced110723f2fee985a7d60557c092ecEvan Cheng 297597212abced110723f2fee985a7d60557c092ecEvan Cheng explicit ARMMCExpr(VariantKind _Kind, const MCExpr *_Expr) 307597212abced110723f2fee985a7d60557c092ecEvan Cheng : Kind(_Kind), Expr(_Expr) {} 317597212abced110723f2fee985a7d60557c092ecEvan Cheng 327597212abced110723f2fee985a7d60557c092ecEvan Chengpublic: 337597212abced110723f2fee985a7d60557c092ecEvan Cheng /// @name Construction 347597212abced110723f2fee985a7d60557c092ecEvan Cheng /// @{ 357597212abced110723f2fee985a7d60557c092ecEvan Cheng 367597212abced110723f2fee985a7d60557c092ecEvan Cheng static const ARMMCExpr *Create(VariantKind Kind, const MCExpr *Expr, 377597212abced110723f2fee985a7d60557c092ecEvan Cheng MCContext &Ctx); 387597212abced110723f2fee985a7d60557c092ecEvan Cheng 397597212abced110723f2fee985a7d60557c092ecEvan Cheng static const ARMMCExpr *CreateUpper16(const MCExpr *Expr, MCContext &Ctx) { 407597212abced110723f2fee985a7d60557c092ecEvan Cheng return Create(VK_ARM_HI16, Expr, Ctx); 417597212abced110723f2fee985a7d60557c092ecEvan Cheng } 427597212abced110723f2fee985a7d60557c092ecEvan Cheng 437597212abced110723f2fee985a7d60557c092ecEvan Cheng static const ARMMCExpr *CreateLower16(const MCExpr *Expr, MCContext &Ctx) { 447597212abced110723f2fee985a7d60557c092ecEvan Cheng return Create(VK_ARM_LO16, Expr, Ctx); 457597212abced110723f2fee985a7d60557c092ecEvan Cheng } 467597212abced110723f2fee985a7d60557c092ecEvan Cheng 477597212abced110723f2fee985a7d60557c092ecEvan Cheng /// @} 487597212abced110723f2fee985a7d60557c092ecEvan Cheng /// @name Accessors 497597212abced110723f2fee985a7d60557c092ecEvan Cheng /// @{ 507597212abced110723f2fee985a7d60557c092ecEvan Cheng 517597212abced110723f2fee985a7d60557c092ecEvan Cheng /// getOpcode - Get the kind of this expression. 527597212abced110723f2fee985a7d60557c092ecEvan Cheng VariantKind getKind() const { return Kind; } 537597212abced110723f2fee985a7d60557c092ecEvan Cheng 547597212abced110723f2fee985a7d60557c092ecEvan Cheng /// getSubExpr - Get the child of this expression. 557597212abced110723f2fee985a7d60557c092ecEvan Cheng const MCExpr *getSubExpr() const { return Expr; } 567597212abced110723f2fee985a7d60557c092ecEvan Cheng 577597212abced110723f2fee985a7d60557c092ecEvan Cheng /// @} 587597212abced110723f2fee985a7d60557c092ecEvan Cheng 597597212abced110723f2fee985a7d60557c092ecEvan Cheng void PrintImpl(raw_ostream &OS) const; 607597212abced110723f2fee985a7d60557c092ecEvan Cheng bool EvaluateAsRelocatableImpl(MCValue &Res, 617597212abced110723f2fee985a7d60557c092ecEvan Cheng const MCAsmLayout *Layout) const; 627597212abced110723f2fee985a7d60557c092ecEvan Cheng void AddValueSymbols(MCAssembler *) const; 630eab5c4d85b4c4bb161bcdd959aa58a6f54415ccDaniel Dunbar const MCSection *FindAssociatedSection() const { 640eab5c4d85b4c4bb161bcdd959aa58a6f54415ccDaniel Dunbar return getSubExpr()->FindAssociatedSection(); 650eab5c4d85b4c4bb161bcdd959aa58a6f54415ccDaniel Dunbar } 667597212abced110723f2fee985a7d60557c092ecEvan Cheng 677597212abced110723f2fee985a7d60557c092ecEvan Cheng static bool classof(const MCExpr *E) { 687597212abced110723f2fee985a7d60557c092ecEvan Cheng return E->getKind() == MCExpr::Target; 697597212abced110723f2fee985a7d60557c092ecEvan Cheng } 707597212abced110723f2fee985a7d60557c092ecEvan Cheng 717597212abced110723f2fee985a7d60557c092ecEvan Cheng static bool classof(const ARMMCExpr *) { return true; } 727597212abced110723f2fee985a7d60557c092ecEvan Cheng 737597212abced110723f2fee985a7d60557c092ecEvan Cheng}; 747597212abced110723f2fee985a7d60557c092ecEvan Cheng} // end namespace llvm 757597212abced110723f2fee985a7d60557c092ecEvan Cheng 767597212abced110723f2fee985a7d60557c092ecEvan Cheng#endif 77