Skip to content

Commit 20a1b35

Browse files
committed
AArch64: Move AArch64MCExpr functions to AArch64MCAsmInfo
To migrate away from the legacy XXXMCExpr::printImpl/evaluateAsRelocatableImpl overrides and align with other targets. While the AArch64MCAsmInfoXXX hooks introduce some duplication, they enable better separation for object file formats. Note: While AArch64MCAsmInfoDarwin uses the `@specifier` notation, it might use AArch64MCExpr with specifier VK_ABS. test/tools/llvm-mca/AArch64/Exynos/zero-latency-move.s abuses a parser behavior that :lo12: is also parsed for Mach-O (though it will fail for -filetype=obj).
1 parent d1dc080 commit 20a1b35

File tree

5 files changed

+165
-112
lines changed

5 files changed

+165
-112
lines changed

llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
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"
2021
using 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+
56131
AArch64MCAsmInfoDarwin::AArch64MCAsmInfoDarwin(bool IsILP32) {
57132
// We prefer NEON instructions to be printed in the short, Apple-specific
58133
// form when targeting Darwin.
@@ -91,6 +166,33 @@ 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+
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+
94196
AArch64MCAsmInfoELF::AArch64MCAsmInfoELF(const Triple &T) {
95197
if (T.getArch() == Triple::aarch64_be)
96198
IsLittleEndian = false;
@@ -127,6 +229,19 @@ AArch64MCAsmInfoELF::AArch64MCAsmInfoELF(const Triple &T) {
127229
initializeVariantKinds(ELFAtSpecifiers);
128230
}
129231

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+
130245
AArch64MCAsmInfoMicrosoftCOFF::AArch64MCAsmInfoMicrosoftCOFF() {
131246
PrivateGlobalPrefix = ".L";
132247
PrivateLabelPrefix = ".L";
@@ -146,6 +261,17 @@ AArch64MCAsmInfoMicrosoftCOFF::AArch64MCAsmInfoMicrosoftCOFF() {
146261
initializeVariantKinds(COFFAtSpecifiers);
147262
}
148263

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+
149275
AArch64MCAsmInfoGNUCOFF::AArch64MCAsmInfoGNUCOFF() {
150276
PrivateGlobalPrefix = ".L";
151277
PrivateLabelPrefix = ".L";
@@ -164,3 +290,14 @@ AArch64MCAsmInfoGNUCOFF::AArch64MCAsmInfoGNUCOFF() {
164290

165291
initializeVariantKinds(COFFAtSpecifiers);
166292
}
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+
}

llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#ifndef LLVM_LIB_TARGET_AARCH64_MCTARGETDESC_AARCH64MCASMINFO_H
1414
#define LLVM_LIB_TARGET_AARCH64_MCTARGETDESC_AARCH64MCASMINFO_H
1515

16+
#include "MCTargetDesc/AArch64MCExpr.h"
1617
#include "llvm/MC/MCAsmInfoCOFF.h"
1718
#include "llvm/MC/MCAsmInfoDarwin.h"
1819
#include "llvm/MC/MCAsmInfoELF.h"
@@ -26,20 +27,42 @@ struct AArch64MCAsmInfoDarwin : public MCAsmInfoDarwin {
2627
const MCExpr *
2728
getExprForPersonalitySymbol(const MCSymbol *Sym, unsigned Encoding,
2829
MCStreamer &Streamer) const override;
30+
void printSpecifierExpr(raw_ostream &OS,
31+
const MCSpecifierExpr &Expr) const override;
32+
bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res,
33+
const MCAssembler *Asm) const override;
2934
};
3035

3136
struct AArch64MCAsmInfoELF : public MCAsmInfoELF {
3237
explicit AArch64MCAsmInfoELF(const Triple &T);
38+
void printSpecifierExpr(raw_ostream &OS,
39+
const MCSpecifierExpr &Expr) const override;
40+
bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res,
41+
const MCAssembler *Asm) const override;
3342
};
3443

3544
struct AArch64MCAsmInfoMicrosoftCOFF : public MCAsmInfoMicrosoft {
3645
explicit AArch64MCAsmInfoMicrosoftCOFF();
46+
void printSpecifierExpr(raw_ostream &OS,
47+
const MCSpecifierExpr &Expr) const override;
48+
bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res,
49+
const MCAssembler *Asm) const override;
3750
};
3851

3952
struct AArch64MCAsmInfoGNUCOFF : public MCAsmInfoGNUCOFF {
4053
explicit AArch64MCAsmInfoGNUCOFF();
54+
void printSpecifierExpr(raw_ostream &OS,
55+
const MCSpecifierExpr &Expr) const override;
56+
bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res,
57+
const MCAssembler *Asm) const override;
4158
};
4259

60+
namespace AArch64 {
61+
/// Return the string representation of the ELF relocation specifier
62+
/// (e.g. ":got:", ":lo12:").
63+
StringRef getSpecifierName(const MCSpecifierExpr &Expr);
64+
} // namespace AArch64
65+
4366
} // namespace llvm
4467

4568
#endif

llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp

Lines changed: 1 addition & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -12,100 +12,19 @@
1212
//===----------------------------------------------------------------------===//
1313

1414
#include "AArch64MCExpr.h"
15+
#include "AArch64MCAsmInfo.h"
1516
#include "llvm/MC/MCContext.h"
1617
#include "llvm/MC/MCStreamer.h"
17-
#include "llvm/MC/MCValue.h"
1818
#include "llvm/Support/Casting.h"
1919
#include "llvm/Support/ErrorHandling.h"
2020

2121
using namespace llvm;
2222

23-
#define DEBUG_TYPE "aarch64symbolrefexpr"
24-
2523
const AArch64MCExpr *AArch64MCExpr::create(const MCExpr *Expr, Specifier S,
2624
MCContext &Ctx) {
2725
return new (Ctx) AArch64MCExpr(Expr, S);
2826
}
2927

30-
StringRef AArch64MCExpr::getSpecifierName() const {
31-
// clang-format off
32-
switch (static_cast<uint32_t>(getSpecifier())) {
33-
case VK_CALL: return "";
34-
case VK_LO12: return ":lo12:";
35-
case VK_ABS_G3: return ":abs_g3:";
36-
case VK_ABS_G2: return ":abs_g2:";
37-
case VK_ABS_G2_S: return ":abs_g2_s:";
38-
case VK_ABS_G2_NC: return ":abs_g2_nc:";
39-
case VK_ABS_G1: return ":abs_g1:";
40-
case VK_ABS_G1_S: return ":abs_g1_s:";
41-
case VK_ABS_G1_NC: return ":abs_g1_nc:";
42-
case VK_ABS_G0: return ":abs_g0:";
43-
case VK_ABS_G0_S: return ":abs_g0_s:";
44-
case VK_ABS_G0_NC: return ":abs_g0_nc:";
45-
case VK_PREL_G3: return ":prel_g3:";
46-
case VK_PREL_G2: return ":prel_g2:";
47-
case VK_PREL_G2_NC: return ":prel_g2_nc:";
48-
case VK_PREL_G1: return ":prel_g1:";
49-
case VK_PREL_G1_NC: return ":prel_g1_nc:";
50-
case VK_PREL_G0: return ":prel_g0:";
51-
case VK_PREL_G0_NC: return ":prel_g0_nc:";
52-
case VK_DTPREL_G2: return ":dtprel_g2:";
53-
case VK_DTPREL_G1: return ":dtprel_g1:";
54-
case VK_DTPREL_G1_NC: return ":dtprel_g1_nc:";
55-
case VK_DTPREL_G0: return ":dtprel_g0:";
56-
case VK_DTPREL_G0_NC: return ":dtprel_g0_nc:";
57-
case VK_DTPREL_HI12: return ":dtprel_hi12:";
58-
case VK_DTPREL_LO12: return ":dtprel_lo12:";
59-
case VK_DTPREL_LO12_NC: return ":dtprel_lo12_nc:";
60-
case VK_TPREL_G2: return ":tprel_g2:";
61-
case VK_TPREL_G1: return ":tprel_g1:";
62-
case VK_TPREL_G1_NC: return ":tprel_g1_nc:";
63-
case VK_TPREL_G0: return ":tprel_g0:";
64-
case VK_TPREL_G0_NC: return ":tprel_g0_nc:";
65-
case VK_TPREL_HI12: return ":tprel_hi12:";
66-
case VK_TPREL_LO12: return ":tprel_lo12:";
67-
case VK_TPREL_LO12_NC: return ":tprel_lo12_nc:";
68-
case VK_TLSDESC_LO12: return ":tlsdesc_lo12:";
69-
case VK_TLSDESC_AUTH_LO12: return ":tlsdesc_auth_lo12:";
70-
case VK_ABS_PAGE: return "";
71-
case VK_ABS_PAGE_NC: return ":pg_hi21_nc:";
72-
case VK_GOT: return ":got:";
73-
case VK_GOT_PAGE: return ":got:";
74-
case VK_GOT_PAGE_LO15: return ":gotpage_lo15:";
75-
case VK_GOT_LO12: return ":got_lo12:";
76-
case VK_GOTTPREL: return ":gottprel:";
77-
case VK_GOTTPREL_PAGE: return ":gottprel:";
78-
case VK_GOTTPREL_LO12_NC: return ":gottprel_lo12:";
79-
case VK_GOTTPREL_G1: return ":gottprel_g1:";
80-
case VK_GOTTPREL_G0_NC: return ":gottprel_g0_nc:";
81-
case VK_TLSDESC: return "";
82-
case VK_TLSDESC_PAGE: return ":tlsdesc:";
83-
case VK_TLSDESC_AUTH: return "";
84-
case VK_TLSDESC_AUTH_PAGE: return ":tlsdesc_auth:";
85-
case VK_SECREL_LO12: return ":secrel_lo12:";
86-
case VK_SECREL_HI12: return ":secrel_hi12:";
87-
case VK_GOT_AUTH: return ":got_auth:";
88-
case VK_GOT_AUTH_PAGE: return ":got_auth:";
89-
case VK_GOT_AUTH_LO12: return ":got_auth_lo12:";
90-
default:
91-
llvm_unreachable("Invalid relocation specifier");
92-
}
93-
// clang-format on
94-
}
95-
96-
void AArch64MCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
97-
OS << getSpecifierName();
98-
Expr->print(OS, MAI);
99-
}
100-
101-
bool AArch64MCExpr::evaluateAsRelocatableImpl(MCValue &Res,
102-
const MCAssembler *Asm) const {
103-
if (!getSubExpr()->evaluateAsRelocatable(Res, Asm))
104-
return false;
105-
Res.setSpecifier(getSpecifier());
106-
return true;
107-
}
108-
10928
const AArch64AuthMCExpr *AArch64AuthMCExpr::create(const MCExpr *Expr,
11029
uint16_t Discriminator,
11130
AArch64PACKey::ID Key,
@@ -114,17 +33,3 @@ const AArch64AuthMCExpr *AArch64AuthMCExpr::create(const MCExpr *Expr,
11433
return new (Ctx)
11534
AArch64AuthMCExpr(Expr, Discriminator, Key, HasAddressDiversity);
11635
}
117-
118-
void AArch64AuthMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
119-
bool WrapSubExprInParens = !isa<MCSymbolRefExpr>(getSubExpr());
120-
if (WrapSubExprInParens)
121-
OS << '(';
122-
getSubExpr()->print(OS, MAI);
123-
if (WrapSubExprInParens)
124-
OS << ')';
125-
126-
OS << "@AUTH(" << AArch64PACKeyIDToString(Key) << ',' << Discriminator;
127-
if (hasAddressDiversity())
128-
OS << ",addr";
129-
OS << ')';
130-
}

llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.h

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,6 @@ class AArch64MCExpr : public MCSpecifierExpr {
147147
public:
148148
static const AArch64MCExpr *create(const MCExpr *Expr, Specifier,
149149
MCContext &Ctx);
150-
/// @name VariantKind information extractors.
151-
/// @{
152150

153151
static Specifier getSymbolLoc(Specifier S) {
154152
return static_cast<Specifier>(S & VK_SymLocBits);
@@ -159,16 +157,6 @@ class AArch64MCExpr : public MCSpecifierExpr {
159157
}
160158

161159
static bool isNotChecked(Specifier S) { return S & VK_NC; }
162-
163-
/// @}
164-
165-
/// Return the string representation of the ELF relocation specifier
166-
/// (e.g. ":got:", ":lo12:").
167-
StringRef getSpecifierName() const;
168-
169-
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
170-
bool evaluateAsRelocatableImpl(MCValue &Res,
171-
const MCAssembler *Asm) const override;
172160
};
173161

174162
class AArch64AuthMCExpr final : public AArch64MCExpr {
@@ -189,7 +177,7 @@ class AArch64AuthMCExpr final : public AArch64MCExpr {
189177
uint16_t getDiscriminator() const { return Discriminator; }
190178
bool hasAddressDiversity() const { return getSpecifier() == VK_AUTHADDR; }
191179

192-
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
180+
void print(raw_ostream &OS, const MCAsmInfo *MAI) const;
193181

194182
static bool classof(const MCExpr *E) {
195183
return isa<AArch64MCExpr>(E) && classof(cast<AArch64MCExpr>(E));

0 commit comments

Comments
 (0)