1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//=--- 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
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_AARCH64_MCTARGETDESC_AARCH64MCEXPR_H
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_AARCH64_MCTARGETDESC_AARCH64MCEXPR_H
1772062f5744557e270a38192554c3126ea5f97434Tim Northover
1872062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/MC/MCExpr.h"
19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/ErrorHandling.h"
2072062f5744557e270a38192554c3126ea5f97434Tim Northover
2172062f5744557e270a38192554c3126ea5f97434Tim Northovernamespace llvm {
2272062f5744557e270a38192554c3126ea5f97434Tim Northover
2372062f5744557e270a38192554c3126ea5f97434Tim Northoverclass AArch64MCExpr : public MCTargetExpr {
2472062f5744557e270a38192554c3126ea5f97434Tim Northoverpublic:
2572062f5744557e270a38192554c3126ea5f97434Tim Northover  enum VariantKind {
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_NONE     = 0x000,
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Symbol locations specifying (roughly speaking) what calculation should be
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // performed to construct the final address for the relocated
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // symbol. E.g. direct, via the GOT, ...
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS      = 0x001,
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_SABS     = 0x002,
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_GOT      = 0x003,
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_DTPREL   = 0x004,
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_GOTTPREL = 0x005,
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TPREL    = 0x006,
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TLSDESC  = 0x007,
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_SymLocBits = 0x00f,
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Variants specifying which part of the final address calculation is
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // used. E.g. the low 12 bits for an ADD/LDR, the middle 16 bits for a
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // MOVZ/MOVK.
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_PAGE     = 0x010,
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_PAGEOFF  = 0x020,
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_HI12     = 0x030,
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_G0       = 0x040,
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_G1       = 0x050,
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_G2       = 0x060,
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_G3       = 0x070,
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_AddressFragBits = 0x0f0,
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Whether the final relocation is a checked one (where a linker should
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // perform a range-check on the final address) or not. Note that this field
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // is unfortunately sometimes omitted from the assembly syntax. E.g. :lo12:
55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // on its own is a non-checked relocation. We side with ELF on being
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // explicit about this!
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_NC       = 0x100,
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Convenience definitions for referring to specific textual representations
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // of relocation specifiers. Note that this means the "_NC" is sometimes
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // omitted in line with assembly syntax here (VK_LO12 rather than VK_LO12_NC
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // since a user would write ":lo12:").
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_CALL              = VK_ABS,
64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_PAGE          = VK_ABS      | VK_PAGE,
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_G3            = VK_ABS      | VK_G3,
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_G2            = VK_ABS      | VK_G2,
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_G2_S          = VK_SABS     | VK_G2,
68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_G2_NC         = VK_ABS      | VK_G2      | VK_NC,
69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_G1            = VK_ABS      | VK_G1,
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_G1_S          = VK_SABS     | VK_G1,
71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_G1_NC         = VK_ABS      | VK_G1      | VK_NC,
72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_G0            = VK_ABS      | VK_G0,
73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_G0_S          = VK_SABS     | VK_G0,
74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_ABS_G0_NC         = VK_ABS      | VK_G0      | VK_NC,
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_LO12              = VK_ABS      | VK_PAGEOFF | VK_NC,
76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_GOT_LO12          = VK_GOT      | VK_PAGEOFF | VK_NC,
77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_GOT_PAGE          = VK_GOT      | VK_PAGE,
78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_DTPREL_G2         = VK_DTPREL   | VK_G2,
79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_DTPREL_G1         = VK_DTPREL   | VK_G1,
80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_DTPREL_G1_NC      = VK_DTPREL   | VK_G1      | VK_NC,
81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_DTPREL_G0         = VK_DTPREL   | VK_G0,
82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_DTPREL_G0_NC      = VK_DTPREL   | VK_G0      | VK_NC,
83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_DTPREL_HI12       = VK_DTPREL   | VK_HI12,
84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_DTPREL_LO12       = VK_DTPREL   | VK_PAGEOFF,
85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_DTPREL_LO12_NC    = VK_DTPREL   | VK_PAGEOFF | VK_NC,
86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_GOTTPREL_PAGE     = VK_GOTTPREL | VK_PAGE,
87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_GOTTPREL_LO12_NC  = VK_GOTTPREL | VK_PAGEOFF | VK_NC,
88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_GOTTPREL_G1       = VK_GOTTPREL | VK_G1,
89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_GOTTPREL_G0_NC    = VK_GOTTPREL | VK_G0      | VK_NC,
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TPREL_G2          = VK_TPREL    | VK_G2,
91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TPREL_G1          = VK_TPREL    | VK_G1,
92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TPREL_G1_NC       = VK_TPREL    | VK_G1      | VK_NC,
93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TPREL_G0          = VK_TPREL    | VK_G0,
94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TPREL_G0_NC       = VK_TPREL    | VK_G0      | VK_NC,
95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TPREL_HI12        = VK_TPREL    | VK_HI12,
96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TPREL_LO12        = VK_TPREL    | VK_PAGEOFF,
97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TPREL_LO12_NC     = VK_TPREL    | VK_PAGEOFF | VK_NC,
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TLSDESC_LO12      = VK_TLSDESC  | VK_PAGEOFF | VK_NC,
99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_TLSDESC_PAGE      = VK_TLSDESC  | VK_PAGE,
100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    VK_INVALID  = 0xfff
10272062f5744557e270a38192554c3126ea5f97434Tim Northover  };
10372062f5744557e270a38192554c3126ea5f97434Tim Northover
10472062f5744557e270a38192554c3126ea5f97434Tim Northoverprivate:
10572062f5744557e270a38192554c3126ea5f97434Tim Northover  const MCExpr *Expr;
106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const VariantKind Kind;
10772062f5744557e270a38192554c3126ea5f97434Tim Northover
108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  explicit AArch64MCExpr(const MCExpr *Expr, VariantKind Kind)
109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : Expr(Expr), Kind(Kind) {}
11072062f5744557e270a38192554c3126ea5f97434Tim Northover
11172062f5744557e270a38192554c3126ea5f97434Tim Northoverpublic:
11272062f5744557e270a38192554c3126ea5f97434Tim Northover  /// @name Construction
11372062f5744557e270a38192554c3126ea5f97434Tim Northover  /// @{
11472062f5744557e270a38192554c3126ea5f97434Tim Northover
1156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  static const AArch64MCExpr *create(const MCExpr *Expr, VariantKind Kind,
116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                   MCContext &Ctx);
11772062f5744557e270a38192554c3126ea5f97434Tim Northover
118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// @}
119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// @name Accessors
120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// @{
12172062f5744557e270a38192554c3126ea5f97434Tim Northover
122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Get the kind of this expression.
1236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  VariantKind getKind() const { return Kind; }
12472062f5744557e270a38192554c3126ea5f97434Tim Northover
125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Get the expression this modifier applies to.
126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCExpr *getSubExpr() const { return Expr; }
12772062f5744557e270a38192554c3126ea5f97434Tim Northover
128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// @}
129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// @name VariantKind information extractors.
130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// @{
13145db92038bf540fbbd8dfe5dff520aa8566d7cefTim Northover
132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  static VariantKind getSymbolLoc(VariantKind Kind) {
133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return static_cast<VariantKind>(Kind & VK_SymLocBits);
13445db92038bf540fbbd8dfe5dff520aa8566d7cefTim Northover  }
13545db92038bf540fbbd8dfe5dff520aa8566d7cefTim Northover
136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  static VariantKind getAddressFrag(VariantKind Kind) {
137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return static_cast<VariantKind>(Kind & VK_AddressFragBits);
13845db92038bf540fbbd8dfe5dff520aa8566d7cefTim Northover  }
13945db92038bf540fbbd8dfe5dff520aa8566d7cefTim Northover
140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  static bool isNotChecked(VariantKind Kind) { return Kind & VK_NC; }
14145db92038bf540fbbd8dfe5dff520aa8566d7cefTim Northover
14272062f5744557e270a38192554c3126ea5f97434Tim Northover  /// @}
14372062f5744557e270a38192554c3126ea5f97434Tim Northover
144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Convert the variant kind into an ELF-appropriate modifier
145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// (e.g. ":got:", ":lo12:").
146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StringRef getVariantKindName() const;
14772062f5744557e270a38192554c3126ea5f97434Tim Northover
1486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
14972062f5744557e270a38192554c3126ea5f97434Tim Northover
150c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void visitUsedExpr(MCStreamer &Streamer) const override;
151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
152f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  MCFragment *findAssociatedFragment() const override;
15372062f5744557e270a38192554c3126ea5f97434Tim Northover
154f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool evaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout,
155f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                 const MCFixup *Fixup) const override;
15672062f5744557e270a38192554c3126ea5f97434Tim Northover
157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
15872062f5744557e270a38192554c3126ea5f97434Tim Northover
15972062f5744557e270a38192554c3126ea5f97434Tim Northover  static bool classof(const MCExpr *E) {
16072062f5744557e270a38192554c3126ea5f97434Tim Northover    return E->getKind() == MCExpr::Target;
16172062f5744557e270a38192554c3126ea5f97434Tim Northover  }
16272062f5744557e270a38192554c3126ea5f97434Tim Northover
16372062f5744557e270a38192554c3126ea5f97434Tim Northover  static bool classof(const AArch64MCExpr *) { return true; }
16472062f5744557e270a38192554c3126ea5f97434Tim Northover};
16572062f5744557e270a38192554c3126ea5f97434Tim Northover} // end namespace llvm
16672062f5744557e270a38192554c3126ea5f97434Tim Northover
16772062f5744557e270a38192554c3126ea5f97434Tim Northover#endif
168