172062f5744557e270a38192554c3126ea5f97434Tim Northover//==- AArch64MCExpr.h - AArch64 specific MC expression classes --*- C++ -*-===//
272062f5744557e270a38192554c3126ea5f97434Tim Northover//
372062f5744557e270a38192554c3126ea5f97434Tim Northover//                     The LLVM Compiler Infrastructure
472062f5744557e270a38192554c3126ea5f97434Tim Northover//
572062f5744557e270a38192554c3126ea5f97434Tim Northover// This file is distributed under the University of Illinois Open Source
672062f5744557e270a38192554c3126ea5f97434Tim Northover// License. See LICENSE.TXT for details.
772062f5744557e270a38192554c3126ea5f97434Tim Northover//
872062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===//
95bd6cb2dabf3fea9cb9fa0b275fbc7ceb85ba970Tim Northover//
105bd6cb2dabf3fea9cb9fa0b275fbc7ceb85ba970Tim Northover// This file describes AArch64-specific MCExprs, used for modifiers like
115bd6cb2dabf3fea9cb9fa0b275fbc7ceb85ba970Tim Northover// ":lo12:" or ":gottprel_g1:".
125bd6cb2dabf3fea9cb9fa0b275fbc7ceb85ba970Tim Northover//
135bd6cb2dabf3fea9cb9fa0b275fbc7ceb85ba970Tim Northover//===----------------------------------------------------------------------===//
1472062f5744557e270a38192554c3126ea5f97434Tim Northover
1572062f5744557e270a38192554c3126ea5f97434Tim Northover#ifndef LLVM_AARCH64MCEXPR_H
1672062f5744557e270a38192554c3126ea5f97434Tim Northover#define LLVM_AARCH64MCEXPR_H
1772062f5744557e270a38192554c3126ea5f97434Tim Northover
1872062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/MC/MCExpr.h"
1972062f5744557e270a38192554c3126ea5f97434Tim Northover
2072062f5744557e270a38192554c3126ea5f97434Tim Northovernamespace llvm {
2172062f5744557e270a38192554c3126ea5f97434Tim Northover
2272062f5744557e270a38192554c3126ea5f97434Tim Northoverclass AArch64MCExpr : public MCTargetExpr {
2372062f5744557e270a38192554c3126ea5f97434Tim Northoverpublic:
2472062f5744557e270a38192554c3126ea5f97434Tim Northover  enum VariantKind {
2572062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_None,
2672062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_GOT,      // :got: modifier in assembly
2772062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_GOT_LO12, // :got_lo12:
2872062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_LO12,     // :lo12:
2972062f5744557e270a38192554c3126ea5f97434Tim Northover
3072062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_ABS_G0, // :abs_g0:
3172062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_ABS_G0_NC, // :abs_g0_nc:
3272062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_ABS_G1,
3372062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_ABS_G1_NC,
3472062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_ABS_G2,
3572062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_ABS_G2_NC,
3672062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_ABS_G3,
3772062f5744557e270a38192554c3126ea5f97434Tim Northover
3872062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_SABS_G0, // :abs_g0_s:
3972062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_SABS_G1,
4072062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_SABS_G2,
4172062f5744557e270a38192554c3126ea5f97434Tim Northover
4272062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_DTPREL_G2, // :dtprel_g2:
4372062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_DTPREL_G1,
4472062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_DTPREL_G1_NC,
4572062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_DTPREL_G0,
4672062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_DTPREL_G0_NC,
4772062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_DTPREL_HI12,
4872062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_DTPREL_LO12,
4972062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_DTPREL_LO12_NC,
5072062f5744557e270a38192554c3126ea5f97434Tim Northover
5172062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_GOTTPREL_G1, // :gottprel:
5272062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_GOTTPREL_G0_NC,
5372062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_GOTTPREL,
5472062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_GOTTPREL_LO12,
5572062f5744557e270a38192554c3126ea5f97434Tim Northover
5672062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_TPREL_G2, // :tprel:
5772062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_TPREL_G1,
5872062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_TPREL_G1_NC,
5972062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_TPREL_G0,
6072062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_TPREL_G0_NC,
6172062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_TPREL_HI12,
6272062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_TPREL_LO12,
6372062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_TPREL_LO12_NC,
6472062f5744557e270a38192554c3126ea5f97434Tim Northover
6572062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_TLSDESC, // :tlsdesc:
6672062f5744557e270a38192554c3126ea5f97434Tim Northover    VK_AARCH64_TLSDESC_LO12
6772062f5744557e270a38192554c3126ea5f97434Tim Northover  };
6872062f5744557e270a38192554c3126ea5f97434Tim Northover
6972062f5744557e270a38192554c3126ea5f97434Tim Northoverprivate:
7072062f5744557e270a38192554c3126ea5f97434Tim Northover  const VariantKind Kind;
7172062f5744557e270a38192554c3126ea5f97434Tim Northover  const MCExpr *Expr;
7272062f5744557e270a38192554c3126ea5f97434Tim Northover
7372062f5744557e270a38192554c3126ea5f97434Tim Northover  explicit AArch64MCExpr(VariantKind _Kind, const MCExpr *_Expr)
7472062f5744557e270a38192554c3126ea5f97434Tim Northover    : Kind(_Kind), Expr(_Expr) {}
7572062f5744557e270a38192554c3126ea5f97434Tim Northover
7672062f5744557e270a38192554c3126ea5f97434Tim Northoverpublic:
7772062f5744557e270a38192554c3126ea5f97434Tim Northover  /// @name Construction
7872062f5744557e270a38192554c3126ea5f97434Tim Northover  /// @{
7972062f5744557e270a38192554c3126ea5f97434Tim Northover
8072062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *Create(VariantKind Kind, const MCExpr *Expr,
8172062f5744557e270a38192554c3126ea5f97434Tim Northover                                     MCContext &Ctx);
8272062f5744557e270a38192554c3126ea5f97434Tim Northover
8372062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *CreateLo12(const MCExpr *Expr, MCContext &Ctx) {
8472062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_LO12, Expr, Ctx);
8572062f5744557e270a38192554c3126ea5f97434Tim Northover  }
8672062f5744557e270a38192554c3126ea5f97434Tim Northover
8772062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *CreateGOT(const MCExpr *Expr, MCContext &Ctx) {
8872062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_GOT, Expr, Ctx);
8972062f5744557e270a38192554c3126ea5f97434Tim Northover  }
9072062f5744557e270a38192554c3126ea5f97434Tim Northover
91dfe076af9879eb68a7b8331f9c02eecf563d85beTim Northover  static const AArch64MCExpr *CreateGOTLo12(const MCExpr *Expr,
92dfe076af9879eb68a7b8331f9c02eecf563d85beTim Northover                                            MCContext &Ctx) {
9372062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_GOT_LO12, Expr, Ctx);
9472062f5744557e270a38192554c3126ea5f97434Tim Northover  }
9572062f5744557e270a38192554c3126ea5f97434Tim Northover
9672062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *CreateDTPREL_G1(const MCExpr *Expr,
9772062f5744557e270a38192554c3126ea5f97434Tim Northover                                             MCContext &Ctx) {
9872062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_DTPREL_G1, Expr, Ctx);
9972062f5744557e270a38192554c3126ea5f97434Tim Northover  }
10072062f5744557e270a38192554c3126ea5f97434Tim Northover
10172062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *CreateDTPREL_G0_NC(const MCExpr *Expr,
10272062f5744557e270a38192554c3126ea5f97434Tim Northover                                                MCContext &Ctx) {
10372062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_DTPREL_G0_NC, Expr, Ctx);
10472062f5744557e270a38192554c3126ea5f97434Tim Northover  }
10572062f5744557e270a38192554c3126ea5f97434Tim Northover
10672062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *CreateGOTTPREL(const MCExpr *Expr,
10772062f5744557e270a38192554c3126ea5f97434Tim Northover                                             MCContext &Ctx) {
10872062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_GOTTPREL, Expr, Ctx);
10972062f5744557e270a38192554c3126ea5f97434Tim Northover  }
11072062f5744557e270a38192554c3126ea5f97434Tim Northover
11172062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *CreateGOTTPRELLo12(const MCExpr *Expr,
11272062f5744557e270a38192554c3126ea5f97434Tim Northover                                                 MCContext &Ctx) {
11372062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_GOTTPREL_LO12, Expr, Ctx);
11472062f5744557e270a38192554c3126ea5f97434Tim Northover  }
11572062f5744557e270a38192554c3126ea5f97434Tim Northover
11672062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *CreateTLSDesc(const MCExpr *Expr,
11772062f5744557e270a38192554c3126ea5f97434Tim Northover                                            MCContext &Ctx) {
11872062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_TLSDESC, Expr, Ctx);
11972062f5744557e270a38192554c3126ea5f97434Tim Northover  }
12072062f5744557e270a38192554c3126ea5f97434Tim Northover
12172062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *CreateTLSDescLo12(const MCExpr *Expr,
12272062f5744557e270a38192554c3126ea5f97434Tim Northover                                                MCContext &Ctx) {
12372062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_TLSDESC_LO12, Expr, Ctx);
12472062f5744557e270a38192554c3126ea5f97434Tim Northover  }
12572062f5744557e270a38192554c3126ea5f97434Tim Northover
12672062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *CreateTPREL_G1(const MCExpr *Expr,
12772062f5744557e270a38192554c3126ea5f97434Tim Northover                                             MCContext &Ctx) {
12872062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_TPREL_G1, Expr, Ctx);
12972062f5744557e270a38192554c3126ea5f97434Tim Northover  }
13072062f5744557e270a38192554c3126ea5f97434Tim Northover
13172062f5744557e270a38192554c3126ea5f97434Tim Northover  static const AArch64MCExpr *CreateTPREL_G0_NC(const MCExpr *Expr,
13272062f5744557e270a38192554c3126ea5f97434Tim Northover                                                MCContext &Ctx) {
13372062f5744557e270a38192554c3126ea5f97434Tim Northover    return Create(VK_AARCH64_TPREL_G0_NC, Expr, Ctx);
13472062f5744557e270a38192554c3126ea5f97434Tim Northover  }
13572062f5744557e270a38192554c3126ea5f97434Tim Northover
13672062f5744557e270a38192554c3126ea5f97434Tim Northover  /// @}
13772062f5744557e270a38192554c3126ea5f97434Tim Northover  /// @name Accessors
13872062f5744557e270a38192554c3126ea5f97434Tim Northover  /// @{
13972062f5744557e270a38192554c3126ea5f97434Tim Northover
14072062f5744557e270a38192554c3126ea5f97434Tim Northover  /// getOpcode - Get the kind of this expression.
14172062f5744557e270a38192554c3126ea5f97434Tim Northover  VariantKind getKind() const { return Kind; }
14272062f5744557e270a38192554c3126ea5f97434Tim Northover
14372062f5744557e270a38192554c3126ea5f97434Tim Northover  /// getSubExpr - Get the child of this expression.
14472062f5744557e270a38192554c3126ea5f97434Tim Northover  const MCExpr *getSubExpr() const { return Expr; }
14572062f5744557e270a38192554c3126ea5f97434Tim Northover
14672062f5744557e270a38192554c3126ea5f97434Tim Northover  /// @}
14772062f5744557e270a38192554c3126ea5f97434Tim Northover
14872062f5744557e270a38192554c3126ea5f97434Tim Northover  void PrintImpl(raw_ostream &OS) const;
14972062f5744557e270a38192554c3126ea5f97434Tim Northover  bool EvaluateAsRelocatableImpl(MCValue &Res,
15072062f5744557e270a38192554c3126ea5f97434Tim Northover                                 const MCAsmLayout *Layout) const;
15172062f5744557e270a38192554c3126ea5f97434Tim Northover  void AddValueSymbols(MCAssembler *) const;
15272062f5744557e270a38192554c3126ea5f97434Tim Northover  const MCSection *FindAssociatedSection() const {
15372062f5744557e270a38192554c3126ea5f97434Tim Northover    return getSubExpr()->FindAssociatedSection();
15472062f5744557e270a38192554c3126ea5f97434Tim Northover  }
15572062f5744557e270a38192554c3126ea5f97434Tim Northover
15672062f5744557e270a38192554c3126ea5f97434Tim Northover  void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const;
15772062f5744557e270a38192554c3126ea5f97434Tim Northover
15872062f5744557e270a38192554c3126ea5f97434Tim Northover  static bool classof(const MCExpr *E) {
15972062f5744557e270a38192554c3126ea5f97434Tim Northover    return E->getKind() == MCExpr::Target;
16072062f5744557e270a38192554c3126ea5f97434Tim Northover  }
16172062f5744557e270a38192554c3126ea5f97434Tim Northover
16272062f5744557e270a38192554c3126ea5f97434Tim Northover  static bool classof(const AArch64MCExpr *) { return true; }
16372062f5744557e270a38192554c3126ea5f97434Tim Northover
16472062f5744557e270a38192554c3126ea5f97434Tim Northover};
16572062f5744557e270a38192554c3126ea5f97434Tim Northover} // end namespace llvm
16672062f5744557e270a38192554c3126ea5f97434Tim Northover
16772062f5744557e270a38192554c3126ea5f97434Tim Northover#endif
168