/src/keystone/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
Line | Count | Source |
1 | | //====- SparcMCExpr.h - Sparc specific MC expression classes --*- C++ -*-=====// |
2 | | // |
3 | | // The LLVM Compiler Infrastructure |
4 | | // |
5 | | // This file is distributed under the University of Illinois Open Source |
6 | | // License. See LICENSE.TXT for details. |
7 | | // |
8 | | //===----------------------------------------------------------------------===// |
9 | | // |
10 | | // This file describes Sparc-specific MCExprs, used for modifiers like |
11 | | // "%hi" or "%lo" etc., |
12 | | // |
13 | | //===----------------------------------------------------------------------===// |
14 | | |
15 | | #ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H |
16 | | #define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCEXPR_H |
17 | | |
18 | | #include "SparcFixupKinds.h" |
19 | | #include "llvm/MC/MCExpr.h" |
20 | | |
21 | | namespace llvm_ks { |
22 | | |
23 | | class StringRef; |
24 | | class SparcMCExpr : public MCTargetExpr { |
25 | | public: |
26 | | enum VariantKind { |
27 | | VK_Sparc_None, |
28 | | VK_Sparc_LO, |
29 | | VK_Sparc_HI, |
30 | | VK_Sparc_H44, |
31 | | VK_Sparc_M44, |
32 | | VK_Sparc_L44, |
33 | | VK_Sparc_HH, |
34 | | VK_Sparc_HM, |
35 | | VK_Sparc_PC22, |
36 | | VK_Sparc_PC10, |
37 | | VK_Sparc_GOT22, |
38 | | VK_Sparc_GOT10, |
39 | | VK_Sparc_WPLT30, |
40 | | VK_Sparc_R_DISP32, |
41 | | VK_Sparc_TLS_GD_HI22, |
42 | | VK_Sparc_TLS_GD_LO10, |
43 | | VK_Sparc_TLS_GD_ADD, |
44 | | VK_Sparc_TLS_GD_CALL, |
45 | | VK_Sparc_TLS_LDM_HI22, |
46 | | VK_Sparc_TLS_LDM_LO10, |
47 | | VK_Sparc_TLS_LDM_ADD, |
48 | | VK_Sparc_TLS_LDM_CALL, |
49 | | VK_Sparc_TLS_LDO_HIX22, |
50 | | VK_Sparc_TLS_LDO_LOX10, |
51 | | VK_Sparc_TLS_LDO_ADD, |
52 | | VK_Sparc_TLS_IE_HI22, |
53 | | VK_Sparc_TLS_IE_LO10, |
54 | | VK_Sparc_TLS_IE_LD, |
55 | | VK_Sparc_TLS_IE_LDX, |
56 | | VK_Sparc_TLS_IE_ADD, |
57 | | VK_Sparc_TLS_LE_HIX22, |
58 | | VK_Sparc_TLS_LE_LOX10 |
59 | | }; |
60 | | |
61 | | private: |
62 | | const VariantKind Kind; |
63 | | const MCExpr *Expr; |
64 | | |
65 | | explicit SparcMCExpr(VariantKind Kind, const MCExpr *Expr) |
66 | 3 | : Kind(Kind), Expr(Expr) {} |
67 | | |
68 | | public: |
69 | | /// @name Construction |
70 | | /// @{ |
71 | | |
72 | | static const SparcMCExpr *create(VariantKind Kind, const MCExpr *Expr, |
73 | | MCContext &Ctx); |
74 | | /// @} |
75 | | /// @name Accessors |
76 | | /// @{ |
77 | | |
78 | | /// getOpcode - Get the kind of this expression. |
79 | 5 | VariantKind getKind() const { return Kind; } |
80 | | |
81 | | /// getSubExpr - Get the child of this expression. |
82 | 6 | const MCExpr *getSubExpr() const { return Expr; } |
83 | | |
84 | | /// getFixupKind - Get the fixup kind of this expression. |
85 | 1 | Sparc::Fixups getFixupKind() const { return getFixupKind(Kind); } |
86 | | |
87 | | /// @} |
88 | | void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; |
89 | | bool evaluateAsRelocatableImpl(MCValue &Res, |
90 | | const MCAsmLayout *Layout, |
91 | | const MCFixup *Fixup) const override; |
92 | | void visitUsedExpr(MCStreamer &Streamer) const override; |
93 | 0 | MCFragment *findAssociatedFragment() const override { |
94 | 0 | return getSubExpr()->findAssociatedFragment(); |
95 | 0 | } |
96 | | |
97 | | void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override; |
98 | | |
99 | 4.55k | static bool classof(const MCExpr *E) { |
100 | 4.55k | return E->getKind() == MCExpr::Target; |
101 | 4.55k | } |
102 | | |
103 | 0 | static bool classof(const SparcMCExpr *) { return true; } |
104 | | |
105 | | static VariantKind parseVariantKind(StringRef name); |
106 | | static bool printVariantKind(raw_ostream &OS, VariantKind Kind); |
107 | | static Sparc::Fixups getFixupKind(VariantKind Kind); |
108 | | }; |
109 | | |
110 | | } // end namespace llvm_ks. |
111 | | |
112 | | #endif |