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