1 | //===-- PPCMCAsmInfo.h - PPC asm properties --------------------*- C++ -*--===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file contains the declarations of the PowerPC MCAsmInfo classes. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCASMINFO_H |
14 | #define LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCASMINFO_H |
15 | |
16 | #include "llvm/MC/MCAsmInfoELF.h" |
17 | #include "llvm/MC/MCAsmInfoXCOFF.h" |
18 | #include "llvm/MC/MCExpr.h" |
19 | #include "llvm/MC/MCValue.h" |
20 | |
21 | namespace llvm { |
22 | class Triple; |
23 | |
24 | class PPCELFMCAsmInfo : public MCAsmInfoELF { |
25 | void anchor() override; |
26 | |
27 | public: |
28 | explicit PPCELFMCAsmInfo(bool is64Bit, const Triple &); |
29 | void printSpecifierExpr(raw_ostream &OS, |
30 | const MCSpecifierExpr &Expr) const override; |
31 | bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, |
32 | const MCAssembler *Asm) const override; |
33 | }; |
34 | |
35 | class PPCXCOFFMCAsmInfo : public MCAsmInfoXCOFF { |
36 | void anchor() override; |
37 | |
38 | public: |
39 | explicit PPCXCOFFMCAsmInfo(bool is64Bit, const Triple &); |
40 | void printSpecifierExpr(raw_ostream &OS, |
41 | const MCSpecifierExpr &Expr) const override; |
42 | bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, |
43 | const MCAssembler *Asm) const override; |
44 | }; |
45 | |
46 | namespace PPC { |
47 | enum Specifier { |
48 | S_None, |
49 | |
50 | S_LO, |
51 | S_HI, |
52 | S_HA, |
53 | S_HIGH, |
54 | S_HIGHA, |
55 | S_HIGHER, |
56 | S_HIGHERA, |
57 | S_HIGHEST, |
58 | S_HIGHESTA, |
59 | |
60 | S_AIX_TLSGD, // symbol@gd |
61 | S_AIX_TLSGDM, // symbol@m |
62 | S_AIX_TLSIE, // symbol@ie |
63 | S_AIX_TLSLD, // symbol@ld |
64 | S_AIX_TLSLE, // symbol@le |
65 | S_AIX_TLSML, // symbol@ml |
66 | S_DTPMOD, // symbol@dtpmod |
67 | S_DTPREL, // symbol@dprel |
68 | S_DTPREL_HA, // symbol@dtprel@ha |
69 | S_DTPREL_HI, // symbol@dtprel@h |
70 | S_DTPREL_HIGH, // symbol@dtprel@high |
71 | S_DTPREL_HIGHA, // symbol@dtprel@higha |
72 | S_DTPREL_HIGHER, // symbol@dtprel@higher |
73 | S_DTPREL_HIGHERA, // symbol@dtprel@highera |
74 | S_DTPREL_HIGHEST, // symbol@dtprel@highest |
75 | S_DTPREL_HIGHESTA, // symbol@dtprel@highesta |
76 | S_DTPREL_LO, // symbol@dtprel@l |
77 | S_GOT, // symbol@got |
78 | S_GOT_DTPREL, // symbol@got@dtprel |
79 | S_GOT_DTPREL_HA, // symbol@got@dtprel@ha |
80 | S_GOT_DTPREL_HI, // symbol@got@dtprel@h |
81 | S_GOT_DTPREL_LO, // symbol@got@dtprel@l |
82 | S_GOT_HA, // symbol@got@ha |
83 | S_GOT_HI, // symbol@got@h |
84 | S_GOT_LO, // symbol@got@l |
85 | S_GOT_PCREL, // symbol@got@pcrel |
86 | S_GOT_TLSGD, // symbol@got@tlsgd |
87 | S_GOT_TLSGD_HA, // symbol@got@tlsgd@ha |
88 | S_GOT_TLSGD_HI, // symbol@got@tlsgd@h |
89 | S_GOT_TLSGD_LO, // symbol@got@tlsgd@l |
90 | S_GOT_TLSGD_PCREL, // symbol@got@tlsgd@pcrel |
91 | S_GOT_TLSLD, // symbol@got@tlsld |
92 | S_GOT_TLSLD_HA, // symbol@got@tlsld@ha |
93 | S_GOT_TLSLD_HI, // symbol@got@tlsld@h |
94 | S_GOT_TLSLD_LO, // symbol@got@tlsld@l |
95 | S_GOT_TLSLD_PCREL, // symbol@got@tlsld@pcrel |
96 | S_GOT_TPREL, // symbol@got@tprel |
97 | S_GOT_TPREL_HA, // symbol@got@tprel@ha |
98 | S_GOT_TPREL_HI, // symbol@got@tprel@h |
99 | S_GOT_TPREL_LO, // symbol@got@tprel@l |
100 | S_GOT_TPREL_PCREL, // symbol@got@tprel@pcrel |
101 | S_L, // symbol@l |
102 | S_LOCAL, // symbol@local |
103 | S_NOTOC, // symbol@notoc |
104 | S_PCREL, |
105 | S_PCREL_OPT, // .reloc expr, R_PPC64_PCREL_OPT, expr |
106 | S_PLT, // symbol@plt |
107 | S_TLS, // symbol@tls |
108 | S_TLSGD, // symbol@tlsgd |
109 | S_TLSLD, // symbol@tlsld |
110 | S_TLS_PCREL, // symbol@tls@pcrel |
111 | S_TOC, // symbol@toc |
112 | S_TOCBASE, // symbol@tocbase |
113 | S_TOC_HA, // symbol@toc@ha |
114 | S_TOC_HI, // symbol@toc@h |
115 | S_TOC_LO, // symbol@toc@l |
116 | S_TPREL, // symbol@tprel |
117 | S_TPREL_HA, // symbol@tprel@ha |
118 | S_TPREL_HI, // symbol@tprel@h |
119 | S_TPREL_HIGH, // symbol@tprel@high |
120 | S_TPREL_HIGHA, // symbol@tprel@higha |
121 | S_TPREL_HIGHER, // symbol@tprel@higher |
122 | S_TPREL_HIGHERA, // symbol@tprel@highera |
123 | S_TPREL_HIGHEST, // symbol@tprel@highest |
124 | S_TPREL_HIGHESTA, // symbol@tprel@highesta |
125 | S_TPREL_LO, // symbol@tprel@l |
126 | S_U, // symbol@u |
127 | }; |
128 | |
129 | bool evaluateAsConstant(const MCSpecifierExpr &Expr, int64_t &Res); |
130 | } |
131 | |
132 | namespace PPCMCExpr { |
133 | using Specifier = uint16_t; |
134 | } |
135 | |
136 | static inline uint16_t getSpecifier(const MCSymbolRefExpr *SRE) { |
137 | return SRE->getKind(); |
138 | } |
139 | } // namespace llvm |
140 | |
141 | #endif |
142 | |