1515#include " llvm/MC/MCContext.h"
1616#include " llvm/MC/MCExpr.h"
1717#include " llvm/MC/MCStreamer.h"
18+ #include " llvm/MC/MCValue.h"
1819#include " llvm/Support/CommandLine.h"
1920#include " llvm/TargetParser/Triple.h"
2021using namespace llvm ;
@@ -53,6 +54,80 @@ const MCAsmInfo::AtSpecifier MachOAtSpecifiers[] = {
5354 {AArch64MCExpr::M_TLVPPAGEOFF, " TLVPPAGEOFF" },
5455};
5556
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+
56131AArch64MCAsmInfoDarwin::AArch64MCAsmInfoDarwin (bool IsILP32) {
57132 // We prefer NEON instructions to be printed in the short, Apple-specific
58133 // form when targeting Darwin.
@@ -91,6 +166,34 @@ const MCExpr *AArch64MCAsmInfoDarwin::getExprForPersonalitySymbol(
91166 return MCBinaryExpr::createSub (Res, PC, Context);
92167}
93168
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+ // FIXME: tryParseAdrLabel should not use VK_ABS for Mach-O
188+ assert (Expr.getSpecifier () == AArch64MCExpr::VK_ABS);
189+ printExpr (OS, *Expr.getSubExpr ());
190+ }
191+
192+ bool AArch64MCAsmInfoDarwin::evaluateAsRelocatableImpl (
193+ const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const {
194+ return evaluate (Expr, Res, Asm);
195+ }
196+
94197AArch64MCAsmInfoELF::AArch64MCAsmInfoELF (const Triple &T) {
95198 if (T.getArch () == Triple::aarch64_be)
96199 IsLittleEndian = false ;
@@ -127,6 +230,19 @@ AArch64MCAsmInfoELF::AArch64MCAsmInfoELF(const Triple &T) {
127230 initializeVariantKinds (ELFAtSpecifiers);
128231}
129232
233+ void AArch64MCAsmInfoELF::printSpecifierExpr (
234+ raw_ostream &OS, const MCSpecifierExpr &Expr) const {
235+ if (auto *AE = dyn_cast<AArch64AuthMCExpr>(&Expr))
236+ return AE->print (OS, this );
237+ OS << AArch64::getSpecifierName (Expr);
238+ printExpr (OS, *Expr.getSubExpr ());
239+ }
240+
241+ bool AArch64MCAsmInfoELF::evaluateAsRelocatableImpl (
242+ const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const {
243+ return evaluate (Expr, Res, Asm);
244+ }
245+
130246AArch64MCAsmInfoMicrosoftCOFF::AArch64MCAsmInfoMicrosoftCOFF () {
131247 PrivateGlobalPrefix = " .L" ;
132248 PrivateLabelPrefix = " .L" ;
@@ -146,6 +262,17 @@ AArch64MCAsmInfoMicrosoftCOFF::AArch64MCAsmInfoMicrosoftCOFF() {
146262 initializeVariantKinds (COFFAtSpecifiers);
147263}
148264
265+ void AArch64MCAsmInfoMicrosoftCOFF::printSpecifierExpr (
266+ raw_ostream &OS, const MCSpecifierExpr &Expr) const {
267+ OS << AArch64::getSpecifierName (Expr);
268+ printExpr (OS, *Expr.getSubExpr ());
269+ }
270+
271+ bool AArch64MCAsmInfoMicrosoftCOFF::evaluateAsRelocatableImpl (
272+ const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const {
273+ return evaluate (Expr, Res, Asm);
274+ }
275+
149276AArch64MCAsmInfoGNUCOFF::AArch64MCAsmInfoGNUCOFF () {
150277 PrivateGlobalPrefix = " .L" ;
151278 PrivateLabelPrefix = " .L" ;
@@ -164,3 +291,14 @@ AArch64MCAsmInfoGNUCOFF::AArch64MCAsmInfoGNUCOFF() {
164291
165292 initializeVariantKinds (COFFAtSpecifiers);
166293}
294+
295+ void AArch64MCAsmInfoGNUCOFF::printSpecifierExpr (
296+ raw_ostream &OS, const MCSpecifierExpr &Expr) const {
297+ OS << AArch64::getSpecifierName (Expr);
298+ printExpr (OS, *Expr.getSubExpr ());
299+ }
300+
301+ bool AArch64MCAsmInfoGNUCOFF::evaluateAsRelocatableImpl (
302+ const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const {
303+ return evaluate (Expr, Res, Asm);
304+ }
0 commit comments