15
15
#include " llvm/MC/MCContext.h"
16
16
#include " llvm/MC/MCExpr.h"
17
17
#include " llvm/MC/MCStreamer.h"
18
+ #include " llvm/MC/MCValue.h"
18
19
#include " llvm/Support/CommandLine.h"
19
20
#include " llvm/TargetParser/Triple.h"
20
21
using namespace llvm ;
@@ -53,6 +54,80 @@ const MCAsmInfo::AtSpecifier MachOAtSpecifiers[] = {
53
54
{AArch64MCExpr::M_TLVPPAGEOFF, " TLVPPAGEOFF" },
54
55
};
55
56
57
+ StringRef AArch64::getSpecifierName (const MCSpecifierExpr &Expr) {
58
+ // clang-format off
59
+ switch (static_cast <uint32_t >(Expr.getSpecifier ())) {
60
+ case AArch64MCExpr::VK_CALL: return " " ;
61
+ case AArch64MCExpr::VK_LO12: return " :lo12:" ;
62
+ case AArch64MCExpr::VK_ABS_G3: return " :abs_g3:" ;
63
+ case AArch64MCExpr::VK_ABS_G2: return " :abs_g2:" ;
64
+ case AArch64MCExpr::VK_ABS_G2_S: return " :abs_g2_s:" ;
65
+ case AArch64MCExpr::VK_ABS_G2_NC: return " :abs_g2_nc:" ;
66
+ case AArch64MCExpr::VK_ABS_G1: return " :abs_g1:" ;
67
+ case AArch64MCExpr::VK_ABS_G1_S: return " :abs_g1_s:" ;
68
+ case AArch64MCExpr::VK_ABS_G1_NC: return " :abs_g1_nc:" ;
69
+ case AArch64MCExpr::VK_ABS_G0: return " :abs_g0:" ;
70
+ case AArch64MCExpr::VK_ABS_G0_S: return " :abs_g0_s:" ;
71
+ case AArch64MCExpr::VK_ABS_G0_NC: return " :abs_g0_nc:" ;
72
+ case AArch64MCExpr::VK_PREL_G3: return " :prel_g3:" ;
73
+ case AArch64MCExpr::VK_PREL_G2: return " :prel_g2:" ;
74
+ case AArch64MCExpr::VK_PREL_G2_NC: return " :prel_g2_nc:" ;
75
+ case AArch64MCExpr::VK_PREL_G1: return " :prel_g1:" ;
76
+ case AArch64MCExpr::VK_PREL_G1_NC: return " :prel_g1_nc:" ;
77
+ case AArch64MCExpr::VK_PREL_G0: return " :prel_g0:" ;
78
+ case AArch64MCExpr::VK_PREL_G0_NC: return " :prel_g0_nc:" ;
79
+ case AArch64MCExpr::VK_DTPREL_G2: return " :dtprel_g2:" ;
80
+ case AArch64MCExpr::VK_DTPREL_G1: return " :dtprel_g1:" ;
81
+ case AArch64MCExpr::VK_DTPREL_G1_NC: return " :dtprel_g1_nc:" ;
82
+ case AArch64MCExpr::VK_DTPREL_G0: return " :dtprel_g0:" ;
83
+ case AArch64MCExpr::VK_DTPREL_G0_NC: return " :dtprel_g0_nc:" ;
84
+ case AArch64MCExpr::VK_DTPREL_HI12: return " :dtprel_hi12:" ;
85
+ case AArch64MCExpr::VK_DTPREL_LO12: return " :dtprel_lo12:" ;
86
+ case AArch64MCExpr::VK_DTPREL_LO12_NC: return " :dtprel_lo12_nc:" ;
87
+ case AArch64MCExpr::VK_TPREL_G2: return " :tprel_g2:" ;
88
+ case AArch64MCExpr::VK_TPREL_G1: return " :tprel_g1:" ;
89
+ case AArch64MCExpr::VK_TPREL_G1_NC: return " :tprel_g1_nc:" ;
90
+ case AArch64MCExpr::VK_TPREL_G0: return " :tprel_g0:" ;
91
+ case AArch64MCExpr::VK_TPREL_G0_NC: return " :tprel_g0_nc:" ;
92
+ case AArch64MCExpr::VK_TPREL_HI12: return " :tprel_hi12:" ;
93
+ case AArch64MCExpr::VK_TPREL_LO12: return " :tprel_lo12:" ;
94
+ case AArch64MCExpr::VK_TPREL_LO12_NC: return " :tprel_lo12_nc:" ;
95
+ case AArch64MCExpr::VK_TLSDESC_LO12: return " :tlsdesc_lo12:" ;
96
+ case AArch64MCExpr::VK_TLSDESC_AUTH_LO12: return " :tlsdesc_auth_lo12:" ;
97
+ case AArch64MCExpr::VK_ABS_PAGE: return " " ;
98
+ case AArch64MCExpr::VK_ABS_PAGE_NC: return " :pg_hi21_nc:" ;
99
+ case AArch64MCExpr::VK_GOT: return " :got:" ;
100
+ case AArch64MCExpr::VK_GOT_PAGE: return " :got:" ;
101
+ case AArch64MCExpr::VK_GOT_PAGE_LO15: return " :gotpage_lo15:" ;
102
+ case AArch64MCExpr::VK_GOT_LO12: return " :got_lo12:" ;
103
+ case AArch64MCExpr::VK_GOTTPREL: return " :gottprel:" ;
104
+ case AArch64MCExpr::VK_GOTTPREL_PAGE: return " :gottprel:" ;
105
+ case AArch64MCExpr::VK_GOTTPREL_LO12_NC: return " :gottprel_lo12:" ;
106
+ case AArch64MCExpr::VK_GOTTPREL_G1: return " :gottprel_g1:" ;
107
+ case AArch64MCExpr::VK_GOTTPREL_G0_NC: return " :gottprel_g0_nc:" ;
108
+ case AArch64MCExpr::VK_TLSDESC: return " " ;
109
+ case AArch64MCExpr::VK_TLSDESC_PAGE: return " :tlsdesc:" ;
110
+ case AArch64MCExpr::VK_TLSDESC_AUTH: return " " ;
111
+ case AArch64MCExpr::VK_TLSDESC_AUTH_PAGE: return " :tlsdesc_auth:" ;
112
+ case AArch64MCExpr::VK_SECREL_LO12: return " :secrel_lo12:" ;
113
+ case AArch64MCExpr::VK_SECREL_HI12: return " :secrel_hi12:" ;
114
+ case AArch64MCExpr::VK_GOT_AUTH: return " :got_auth:" ;
115
+ case AArch64MCExpr::VK_GOT_AUTH_PAGE: return " :got_auth:" ;
116
+ case AArch64MCExpr::VK_GOT_AUTH_LO12: return " :got_auth_lo12:" ;
117
+ default :
118
+ llvm_unreachable (" Invalid relocation specifier" );
119
+ }
120
+ // clang-format on
121
+ }
122
+
123
+ static bool evaluate (const MCSpecifierExpr &Expr, MCValue &Res,
124
+ const MCAssembler *Asm) {
125
+ if (!Expr.getSubExpr ()->evaluateAsRelocatable (Res, Asm))
126
+ return false ;
127
+ Res.setSpecifier (Expr.getSpecifier ());
128
+ return true ;
129
+ }
130
+
56
131
AArch64MCAsmInfoDarwin::AArch64MCAsmInfoDarwin (bool IsILP32) {
57
132
// We prefer NEON instructions to be printed in the short, Apple-specific
58
133
// form when targeting Darwin.
@@ -91,6 +166,33 @@ const MCExpr *AArch64MCAsmInfoDarwin::getExprForPersonalitySymbol(
91
166
return MCBinaryExpr::createSub (Res, PC, Context);
92
167
}
93
168
169
+ void AArch64AuthMCExpr::print (raw_ostream &OS, const MCAsmInfo *MAI) const {
170
+ bool WrapSubExprInParens = !isa<MCSymbolRefExpr>(getSubExpr ());
171
+ if (WrapSubExprInParens)
172
+ OS << ' (' ;
173
+ getSubExpr ()->print (OS, MAI);
174
+ if (WrapSubExprInParens)
175
+ OS << ' )' ;
176
+
177
+ OS << " @AUTH(" << AArch64PACKeyIDToString (Key) << ' ,' << Discriminator;
178
+ if (hasAddressDiversity ())
179
+ OS << " ,addr" ;
180
+ OS << ' )' ;
181
+ }
182
+
183
+ void AArch64MCAsmInfoDarwin::printSpecifierExpr (
184
+ raw_ostream &OS, const MCSpecifierExpr &Expr) const {
185
+ if (auto *AE = dyn_cast<AArch64AuthMCExpr>(&Expr))
186
+ return AE->print (OS, this );
187
+ OS << AArch64::getSpecifierName (Expr);
188
+ printExpr (OS, *Expr.getSubExpr ());
189
+ }
190
+
191
+ bool AArch64MCAsmInfoDarwin::evaluateAsRelocatableImpl (
192
+ const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const {
193
+ return evaluate (Expr, Res, Asm);
194
+ }
195
+
94
196
AArch64MCAsmInfoELF::AArch64MCAsmInfoELF (const Triple &T) {
95
197
if (T.getArch () == Triple::aarch64_be)
96
198
IsLittleEndian = false ;
@@ -127,6 +229,19 @@ AArch64MCAsmInfoELF::AArch64MCAsmInfoELF(const Triple &T) {
127
229
initializeVariantKinds (ELFAtSpecifiers);
128
230
}
129
231
232
+ void AArch64MCAsmInfoELF::printSpecifierExpr (
233
+ raw_ostream &OS, const MCSpecifierExpr &Expr) const {
234
+ if (auto *AE = dyn_cast<AArch64AuthMCExpr>(&Expr))
235
+ return AE->print (OS, this );
236
+ OS << AArch64::getSpecifierName (Expr);
237
+ printExpr (OS, *Expr.getSubExpr ());
238
+ }
239
+
240
+ bool AArch64MCAsmInfoELF::evaluateAsRelocatableImpl (
241
+ const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const {
242
+ return evaluate (Expr, Res, Asm);
243
+ }
244
+
130
245
AArch64MCAsmInfoMicrosoftCOFF::AArch64MCAsmInfoMicrosoftCOFF () {
131
246
PrivateGlobalPrefix = " .L" ;
132
247
PrivateLabelPrefix = " .L" ;
@@ -146,6 +261,17 @@ AArch64MCAsmInfoMicrosoftCOFF::AArch64MCAsmInfoMicrosoftCOFF() {
146
261
initializeVariantKinds (COFFAtSpecifiers);
147
262
}
148
263
264
+ void AArch64MCAsmInfoMicrosoftCOFF::printSpecifierExpr (
265
+ raw_ostream &OS, const MCSpecifierExpr &Expr) const {
266
+ OS << AArch64::getSpecifierName (Expr);
267
+ printExpr (OS, *Expr.getSubExpr ());
268
+ }
269
+
270
+ bool AArch64MCAsmInfoMicrosoftCOFF::evaluateAsRelocatableImpl (
271
+ const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const {
272
+ return evaluate (Expr, Res, Asm);
273
+ }
274
+
149
275
AArch64MCAsmInfoGNUCOFF::AArch64MCAsmInfoGNUCOFF () {
150
276
PrivateGlobalPrefix = " .L" ;
151
277
PrivateLabelPrefix = " .L" ;
@@ -164,3 +290,14 @@ AArch64MCAsmInfoGNUCOFF::AArch64MCAsmInfoGNUCOFF() {
164
290
165
291
initializeVariantKinds (COFFAtSpecifiers);
166
292
}
293
+
294
+ void AArch64MCAsmInfoGNUCOFF::printSpecifierExpr (
295
+ raw_ostream &OS, const MCSpecifierExpr &Expr) const {
296
+ OS << AArch64::getSpecifierName (Expr);
297
+ printExpr (OS, *Expr.getSubExpr ());
298
+ }
299
+
300
+ bool AArch64MCAsmInfoGNUCOFF::evaluateAsRelocatableImpl (
301
+ const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const {
302
+ return evaluate (Expr, Res, Asm);
303
+ }
0 commit comments