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) {} 31d314ab525db93cdb51ede18830b95c97af497e3cJim Grosbach 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 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void PrintImpl(raw_ostream &OS) const override; 607597212abced110723f2fee985a7d60557c092ecEvan Cheng bool EvaluateAsRelocatableImpl(MCValue &Res, 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCAsmLayout *Layout) const override; 62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines void visitUsedExpr(MCStreamer &Streamer) const override; 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSection *FindAssociatedSection() const override { 640eab5c4d85b4c4bb161bcdd959aa58a6f54415ccDaniel Dunbar return getSubExpr()->FindAssociatedSection(); 650eab5c4d85b4c4bb161bcdd959aa58a6f54415ccDaniel Dunbar } 667597212abced110723f2fee985a7d60557c092ecEvan Cheng 6772062f5744557e270a38192554c3126ea5f97434Tim Northover // There are no TLS ARMMCExprs at the moment. 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override {} 6972062f5744557e270a38192554c3126ea5f97434Tim Northover 707597212abced110723f2fee985a7d60557c092ecEvan Cheng static bool classof(const MCExpr *E) { 717597212abced110723f2fee985a7d60557c092ecEvan Cheng return E->getKind() == MCExpr::Target; 727597212abced110723f2fee985a7d60557c092ecEvan Cheng } 737597212abced110723f2fee985a7d60557c092ecEvan Cheng}; 747597212abced110723f2fee985a7d60557c092ecEvan Cheng} // end namespace llvm 757597212abced110723f2fee985a7d60557c092ecEvan Cheng 767597212abced110723f2fee985a7d60557c092ecEvan Cheng#endif 77