diff options
author | Fangrui Song <i@maskray.me> | 2025-06-16 09:57:10 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2025-06-16 09:57:10 -0700 |
commit | 20a1b357c0ff3c3f71de45bae42cb2dead7b66c9 (patch) | |
tree | a982ac2c14eb4ca1208459713e3bbc3edec85c72 | |
parent | d1dc080a858ca47c314334fb14f1ecb605fb4371 (diff) | |
download | llvm-20a1b357c0ff3c3f71de45bae42cb2dead7b66c9.zip llvm-20a1b357c0ff3c3f71de45bae42cb2dead7b66c9.tar.gz llvm-20a1b357c0ff3c3f71de45bae42cb2dead7b66c9.tar.bz2 |
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).
5 files changed, 165 insertions, 112 deletions
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp index 31965d85d..b2cd1d0 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp @@ -15,6 +15,7 @@ #include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCValue.h" #include "llvm/Support/CommandLine.h" #include "llvm/TargetParser/Triple.h" using namespace llvm; @@ -53,6 +54,80 @@ const MCAsmInfo::AtSpecifier MachOAtSpecifiers[] = { {AArch64MCExpr::M_TLVPPAGEOFF, "TLVPPAGEOFF"}, }; +StringRef AArch64::getSpecifierName(const MCSpecifierExpr &Expr) { + // clang-format off + switch (static_cast<uint32_t>(Expr.getSpecifier())) { + case AArch64MCExpr::VK_CALL: return ""; + case AArch64MCExpr::VK_LO12: return ":lo12:"; + case AArch64MCExpr::VK_ABS_G3: return ":abs_g3:"; + case AArch64MCExpr::VK_ABS_G2: return ":abs_g2:"; + case AArch64MCExpr::VK_ABS_G2_S: return ":abs_g2_s:"; + case AArch64MCExpr::VK_ABS_G2_NC: return ":abs_g2_nc:"; + case AArch64MCExpr::VK_ABS_G1: return ":abs_g1:"; + case AArch64MCExpr::VK_ABS_G1_S: return ":abs_g1_s:"; + case AArch64MCExpr::VK_ABS_G1_NC: return ":abs_g1_nc:"; + case AArch64MCExpr::VK_ABS_G0: return ":abs_g0:"; + case AArch64MCExpr::VK_ABS_G0_S: return ":abs_g0_s:"; + case AArch64MCExpr::VK_ABS_G0_NC: return ":abs_g0_nc:"; + case AArch64MCExpr::VK_PREL_G3: return ":prel_g3:"; + case AArch64MCExpr::VK_PREL_G2: return ":prel_g2:"; + case AArch64MCExpr::VK_PREL_G2_NC: return ":prel_g2_nc:"; + case AArch64MCExpr::VK_PREL_G1: return ":prel_g1:"; + case AArch64MCExpr::VK_PREL_G1_NC: return ":prel_g1_nc:"; + case AArch64MCExpr::VK_PREL_G0: return ":prel_g0:"; + case AArch64MCExpr::VK_PREL_G0_NC: return ":prel_g0_nc:"; + case AArch64MCExpr::VK_DTPREL_G2: return ":dtprel_g2:"; + case AArch64MCExpr::VK_DTPREL_G1: return ":dtprel_g1:"; + case AArch64MCExpr::VK_DTPREL_G1_NC: return ":dtprel_g1_nc:"; + case AArch64MCExpr::VK_DTPREL_G0: return ":dtprel_g0:"; + case AArch64MCExpr::VK_DTPREL_G0_NC: return ":dtprel_g0_nc:"; + case AArch64MCExpr::VK_DTPREL_HI12: return ":dtprel_hi12:"; + case AArch64MCExpr::VK_DTPREL_LO12: return ":dtprel_lo12:"; + case AArch64MCExpr::VK_DTPREL_LO12_NC: return ":dtprel_lo12_nc:"; + case AArch64MCExpr::VK_TPREL_G2: return ":tprel_g2:"; + case AArch64MCExpr::VK_TPREL_G1: return ":tprel_g1:"; + case AArch64MCExpr::VK_TPREL_G1_NC: return ":tprel_g1_nc:"; + case AArch64MCExpr::VK_TPREL_G0: return ":tprel_g0:"; + case AArch64MCExpr::VK_TPREL_G0_NC: return ":tprel_g0_nc:"; + case AArch64MCExpr::VK_TPREL_HI12: return ":tprel_hi12:"; + case AArch64MCExpr::VK_TPREL_LO12: return ":tprel_lo12:"; + case AArch64MCExpr::VK_TPREL_LO12_NC: return ":tprel_lo12_nc:"; + case AArch64MCExpr::VK_TLSDESC_LO12: return ":tlsdesc_lo12:"; + case AArch64MCExpr::VK_TLSDESC_AUTH_LO12: return ":tlsdesc_auth_lo12:"; + case AArch64MCExpr::VK_ABS_PAGE: return ""; + case AArch64MCExpr::VK_ABS_PAGE_NC: return ":pg_hi21_nc:"; + case AArch64MCExpr::VK_GOT: return ":got:"; + case AArch64MCExpr::VK_GOT_PAGE: return ":got:"; + case AArch64MCExpr::VK_GOT_PAGE_LO15: return ":gotpage_lo15:"; + case AArch64MCExpr::VK_GOT_LO12: return ":got_lo12:"; + case AArch64MCExpr::VK_GOTTPREL: return ":gottprel:"; + case AArch64MCExpr::VK_GOTTPREL_PAGE: return ":gottprel:"; + case AArch64MCExpr::VK_GOTTPREL_LO12_NC: return ":gottprel_lo12:"; + case AArch64MCExpr::VK_GOTTPREL_G1: return ":gottprel_g1:"; + case AArch64MCExpr::VK_GOTTPREL_G0_NC: return ":gottprel_g0_nc:"; + case AArch64MCExpr::VK_TLSDESC: return ""; + case AArch64MCExpr::VK_TLSDESC_PAGE: return ":tlsdesc:"; + case AArch64MCExpr::VK_TLSDESC_AUTH: return ""; + case AArch64MCExpr::VK_TLSDESC_AUTH_PAGE: return ":tlsdesc_auth:"; + case AArch64MCExpr::VK_SECREL_LO12: return ":secrel_lo12:"; + case AArch64MCExpr::VK_SECREL_HI12: return ":secrel_hi12:"; + case AArch64MCExpr::VK_GOT_AUTH: return ":got_auth:"; + case AArch64MCExpr::VK_GOT_AUTH_PAGE: return ":got_auth:"; + case AArch64MCExpr::VK_GOT_AUTH_LO12: return ":got_auth_lo12:"; + default: + llvm_unreachable("Invalid relocation specifier"); + } + // clang-format on +} + +static bool evaluate(const MCSpecifierExpr &Expr, MCValue &Res, + const MCAssembler *Asm) { + if (!Expr.getSubExpr()->evaluateAsRelocatable(Res, Asm)) + return false; + Res.setSpecifier(Expr.getSpecifier()); + return true; +} + AArch64MCAsmInfoDarwin::AArch64MCAsmInfoDarwin(bool IsILP32) { // We prefer NEON instructions to be printed in the short, Apple-specific // form when targeting Darwin. @@ -91,6 +166,33 @@ const MCExpr *AArch64MCAsmInfoDarwin::getExprForPersonalitySymbol( return MCBinaryExpr::createSub(Res, PC, Context); } +void AArch64AuthMCExpr::print(raw_ostream &OS, const MCAsmInfo *MAI) const { + bool WrapSubExprInParens = !isa<MCSymbolRefExpr>(getSubExpr()); + if (WrapSubExprInParens) + OS << '('; + getSubExpr()->print(OS, MAI); + if (WrapSubExprInParens) + OS << ')'; + + OS << "@AUTH(" << AArch64PACKeyIDToString(Key) << ',' << Discriminator; + if (hasAddressDiversity()) + OS << ",addr"; + OS << ')'; +} + +void AArch64MCAsmInfoDarwin::printSpecifierExpr( + raw_ostream &OS, const MCSpecifierExpr &Expr) const { + if (auto *AE = dyn_cast<AArch64AuthMCExpr>(&Expr)) + return AE->print(OS, this); + OS << AArch64::getSpecifierName(Expr); + printExpr(OS, *Expr.getSubExpr()); +} + +bool AArch64MCAsmInfoDarwin::evaluateAsRelocatableImpl( + const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const { + return evaluate(Expr, Res, Asm); +} + AArch64MCAsmInfoELF::AArch64MCAsmInfoELF(const Triple &T) { if (T.getArch() == Triple::aarch64_be) IsLittleEndian = false; @@ -127,6 +229,19 @@ AArch64MCAsmInfoELF::AArch64MCAsmInfoELF(const Triple &T) { initializeVariantKinds(ELFAtSpecifiers); } +void AArch64MCAsmInfoELF::printSpecifierExpr( + raw_ostream &OS, const MCSpecifierExpr &Expr) const { + if (auto *AE = dyn_cast<AArch64AuthMCExpr>(&Expr)) + return AE->print(OS, this); + OS << AArch64::getSpecifierName(Expr); + printExpr(OS, *Expr.getSubExpr()); +} + +bool AArch64MCAsmInfoELF::evaluateAsRelocatableImpl( + const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const { + return evaluate(Expr, Res, Asm); +} + AArch64MCAsmInfoMicrosoftCOFF::AArch64MCAsmInfoMicrosoftCOFF() { PrivateGlobalPrefix = ".L"; PrivateLabelPrefix = ".L"; @@ -146,6 +261,17 @@ AArch64MCAsmInfoMicrosoftCOFF::AArch64MCAsmInfoMicrosoftCOFF() { initializeVariantKinds(COFFAtSpecifiers); } +void AArch64MCAsmInfoMicrosoftCOFF::printSpecifierExpr( + raw_ostream &OS, const MCSpecifierExpr &Expr) const { + OS << AArch64::getSpecifierName(Expr); + printExpr(OS, *Expr.getSubExpr()); +} + +bool AArch64MCAsmInfoMicrosoftCOFF::evaluateAsRelocatableImpl( + const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const { + return evaluate(Expr, Res, Asm); +} + AArch64MCAsmInfoGNUCOFF::AArch64MCAsmInfoGNUCOFF() { PrivateGlobalPrefix = ".L"; PrivateLabelPrefix = ".L"; @@ -164,3 +290,14 @@ AArch64MCAsmInfoGNUCOFF::AArch64MCAsmInfoGNUCOFF() { initializeVariantKinds(COFFAtSpecifiers); } + +void AArch64MCAsmInfoGNUCOFF::printSpecifierExpr( + raw_ostream &OS, const MCSpecifierExpr &Expr) const { + OS << AArch64::getSpecifierName(Expr); + printExpr(OS, *Expr.getSubExpr()); +} + +bool AArch64MCAsmInfoGNUCOFF::evaluateAsRelocatableImpl( + const MCSpecifierExpr &Expr, MCValue &Res, const MCAssembler *Asm) const { + return evaluate(Expr, Res, Asm); +} diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.h b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.h index 225e0c8..bc02586 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.h +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.h @@ -13,6 +13,7 @@ #ifndef LLVM_LIB_TARGET_AARCH64_MCTARGETDESC_AARCH64MCASMINFO_H #define LLVM_LIB_TARGET_AARCH64_MCTARGETDESC_AARCH64MCASMINFO_H +#include "MCTargetDesc/AArch64MCExpr.h" #include "llvm/MC/MCAsmInfoCOFF.h" #include "llvm/MC/MCAsmInfoDarwin.h" #include "llvm/MC/MCAsmInfoELF.h" @@ -26,20 +27,42 @@ struct AArch64MCAsmInfoDarwin : public MCAsmInfoDarwin { const MCExpr * getExprForPersonalitySymbol(const MCSymbol *Sym, unsigned Encoding, MCStreamer &Streamer) const override; + void printSpecifierExpr(raw_ostream &OS, + const MCSpecifierExpr &Expr) const override; + bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, + const MCAssembler *Asm) const override; }; struct AArch64MCAsmInfoELF : public MCAsmInfoELF { explicit AArch64MCAsmInfoELF(const Triple &T); + void printSpecifierExpr(raw_ostream &OS, + const MCSpecifierExpr &Expr) const override; + bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, + const MCAssembler *Asm) const override; }; struct AArch64MCAsmInfoMicrosoftCOFF : public MCAsmInfoMicrosoft { explicit AArch64MCAsmInfoMicrosoftCOFF(); + void printSpecifierExpr(raw_ostream &OS, + const MCSpecifierExpr &Expr) const override; + bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, + const MCAssembler *Asm) const override; }; struct AArch64MCAsmInfoGNUCOFF : public MCAsmInfoGNUCOFF { explicit AArch64MCAsmInfoGNUCOFF(); + void printSpecifierExpr(raw_ostream &OS, + const MCSpecifierExpr &Expr) const override; + bool evaluateAsRelocatableImpl(const MCSpecifierExpr &Expr, MCValue &Res, + const MCAssembler *Asm) const override; }; +namespace AArch64 { +/// Return the string representation of the ELF relocation specifier +/// (e.g. ":got:", ":lo12:"). +StringRef getSpecifierName(const MCSpecifierExpr &Expr); +} // namespace AArch64 + } // namespace llvm #endif diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp index d934af9..7a7c6f7 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp @@ -12,100 +12,19 @@ //===----------------------------------------------------------------------===// #include "AArch64MCExpr.h" +#include "AArch64MCAsmInfo.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCStreamer.h" -#include "llvm/MC/MCValue.h" #include "llvm/Support/Casting.h" #include "llvm/Support/ErrorHandling.h" using namespace llvm; -#define DEBUG_TYPE "aarch64symbolrefexpr" - const AArch64MCExpr *AArch64MCExpr::create(const MCExpr *Expr, Specifier S, MCContext &Ctx) { return new (Ctx) AArch64MCExpr(Expr, S); } -StringRef AArch64MCExpr::getSpecifierName() const { - // clang-format off - switch (static_cast<uint32_t>(getSpecifier())) { - case VK_CALL: return ""; - case VK_LO12: return ":lo12:"; - case VK_ABS_G3: return ":abs_g3:"; - case VK_ABS_G2: return ":abs_g2:"; - case VK_ABS_G2_S: return ":abs_g2_s:"; - case VK_ABS_G2_NC: return ":abs_g2_nc:"; - case VK_ABS_G1: return ":abs_g1:"; - case VK_ABS_G1_S: return ":abs_g1_s:"; - case VK_ABS_G1_NC: return ":abs_g1_nc:"; - case VK_ABS_G0: return ":abs_g0:"; - case VK_ABS_G0_S: return ":abs_g0_s:"; - case VK_ABS_G0_NC: return ":abs_g0_nc:"; - case VK_PREL_G3: return ":prel_g3:"; - case VK_PREL_G2: return ":prel_g2:"; - case VK_PREL_G2_NC: return ":prel_g2_nc:"; - case VK_PREL_G1: return ":prel_g1:"; - case VK_PREL_G1_NC: return ":prel_g1_nc:"; - case VK_PREL_G0: return ":prel_g0:"; - case VK_PREL_G0_NC: return ":prel_g0_nc:"; - case VK_DTPREL_G2: return ":dtprel_g2:"; - case VK_DTPREL_G1: return ":dtprel_g1:"; - case VK_DTPREL_G1_NC: return ":dtprel_g1_nc:"; - case VK_DTPREL_G0: return ":dtprel_g0:"; - case VK_DTPREL_G0_NC: return ":dtprel_g0_nc:"; - case VK_DTPREL_HI12: return ":dtprel_hi12:"; - case VK_DTPREL_LO12: return ":dtprel_lo12:"; - case VK_DTPREL_LO12_NC: return ":dtprel_lo12_nc:"; - case VK_TPREL_G2: return ":tprel_g2:"; - case VK_TPREL_G1: return ":tprel_g1:"; - case VK_TPREL_G1_NC: return ":tprel_g1_nc:"; - case VK_TPREL_G0: return ":tprel_g0:"; - case VK_TPREL_G0_NC: return ":tprel_g0_nc:"; - case VK_TPREL_HI12: return ":tprel_hi12:"; - case VK_TPREL_LO12: return ":tprel_lo12:"; - case VK_TPREL_LO12_NC: return ":tprel_lo12_nc:"; - case VK_TLSDESC_LO12: return ":tlsdesc_lo12:"; - case VK_TLSDESC_AUTH_LO12: return ":tlsdesc_auth_lo12:"; - case VK_ABS_PAGE: return ""; - case VK_ABS_PAGE_NC: return ":pg_hi21_nc:"; - case VK_GOT: return ":got:"; - case VK_GOT_PAGE: return ":got:"; - case VK_GOT_PAGE_LO15: return ":gotpage_lo15:"; - case VK_GOT_LO12: return ":got_lo12:"; - case VK_GOTTPREL: return ":gottprel:"; - case VK_GOTTPREL_PAGE: return ":gottprel:"; - case VK_GOTTPREL_LO12_NC: return ":gottprel_lo12:"; - case VK_GOTTPREL_G1: return ":gottprel_g1:"; - case VK_GOTTPREL_G0_NC: return ":gottprel_g0_nc:"; - case VK_TLSDESC: return ""; - case VK_TLSDESC_PAGE: return ":tlsdesc:"; - case VK_TLSDESC_AUTH: return ""; - case VK_TLSDESC_AUTH_PAGE: return ":tlsdesc_auth:"; - case VK_SECREL_LO12: return ":secrel_lo12:"; - case VK_SECREL_HI12: return ":secrel_hi12:"; - case VK_GOT_AUTH: return ":got_auth:"; - case VK_GOT_AUTH_PAGE: return ":got_auth:"; - case VK_GOT_AUTH_LO12: return ":got_auth_lo12:"; - default: - llvm_unreachable("Invalid relocation specifier"); - } - // clang-format on -} - -void AArch64MCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { - OS << getSpecifierName(); - Expr->print(OS, MAI); -} - -bool AArch64MCExpr::evaluateAsRelocatableImpl(MCValue &Res, - const MCAssembler *Asm) const { - if (!getSubExpr()->evaluateAsRelocatable(Res, Asm)) - return false; - Res.setSpecifier(getSpecifier()); - return true; -} - const AArch64AuthMCExpr *AArch64AuthMCExpr::create(const MCExpr *Expr, uint16_t Discriminator, AArch64PACKey::ID Key, @@ -114,17 +33,3 @@ const AArch64AuthMCExpr *AArch64AuthMCExpr::create(const MCExpr *Expr, return new (Ctx) AArch64AuthMCExpr(Expr, Discriminator, Key, HasAddressDiversity); } - -void AArch64AuthMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { - bool WrapSubExprInParens = !isa<MCSymbolRefExpr>(getSubExpr()); - if (WrapSubExprInParens) - OS << '('; - getSubExpr()->print(OS, MAI); - if (WrapSubExprInParens) - OS << ')'; - - OS << "@AUTH(" << AArch64PACKeyIDToString(Key) << ',' << Discriminator; - if (hasAddressDiversity()) - OS << ",addr"; - OS << ')'; -} diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.h b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.h index 9c38389..541f24c 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.h +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.h @@ -147,8 +147,6 @@ protected: public: static const AArch64MCExpr *create(const MCExpr *Expr, Specifier, MCContext &Ctx); - /// @name VariantKind information extractors. - /// @{ static Specifier getSymbolLoc(Specifier S) { return static_cast<Specifier>(S & VK_SymLocBits); @@ -159,16 +157,6 @@ public: } static bool isNotChecked(Specifier S) { return S & VK_NC; } - - /// @} - - /// Return the string representation of the ELF relocation specifier - /// (e.g. ":got:", ":lo12:"). - StringRef getSpecifierName() const; - - void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; - bool evaluateAsRelocatableImpl(MCValue &Res, - const MCAssembler *Asm) const override; }; class AArch64AuthMCExpr final : public AArch64MCExpr { @@ -189,7 +177,7 @@ public: uint16_t getDiscriminator() const { return Discriminator; } bool hasAddressDiversity() const { return getSpecifier() == VK_AUTHADDR; } - void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override; + void print(raw_ostream &OS, const MCAsmInfo *MAI) const; static bool classof(const MCExpr *E) { return isa<AArch64MCExpr>(E) && classof(cast<AArch64MCExpr>(E)); diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp index 3009bd2..2e99763 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp @@ -8,7 +8,7 @@ #include "AArch64MCTargetDesc.h" #include "MCTargetDesc/AArch64FixupKinds.h" -#include "MCTargetDesc/AArch64MCExpr.h" +#include "MCTargetDesc/AArch64MCAsmInfo.h" #include "llvm/ADT/Twine.h" #include "llvm/BinaryFormat/COFF.h" #include "llvm/MC/MCAsmBackend.h" @@ -73,7 +73,7 @@ unsigned AArch64WinCOFFObjectWriter::getRelocType( break; default: Ctx.reportError(Fixup.getLoc(), "relocation specifier " + - A64E->getSpecifierName() + + AArch64::getSpecifierName(*A64E) + " unsupported on COFF targets"); return COFF::IMAGE_REL_ARM64_ABSOLUTE; // Dummy return value } @@ -83,7 +83,7 @@ unsigned AArch64WinCOFFObjectWriter::getRelocType( default: { if (const AArch64MCExpr *A64E = dyn_cast<AArch64MCExpr>(Expr)) { Ctx.reportError(Fixup.getLoc(), "relocation specifier " + - A64E->getSpecifierName() + + AArch64::getSpecifierName(*A64E) + " unsupported on COFF targets"); } else { MCFixupKindInfo Info = MAB.getFixupKindInfo(Fixup.getKind()); |