[llvm] 52eb11f - [MC] Replace getSpecifier(Target.getSymA()) with Target.getSymSpecifier()
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 5 13:08:25 PDT 2025
Author: Fangrui Song
Date: 2025-04-05T13:08:19-07:00
New Revision: 52eb11f925ddeba4e1b3840fd636ee87387f3ada
URL: https://github.com/llvm/llvm-project/commit/52eb11f925ddeba4e1b3840fd636ee87387f3ada
DIFF: https://github.com/llvm/llvm-project/commit/52eb11f925ddeba4e1b3840fd636ee87387f3ada.diff
LOG: [MC] Replace getSpecifier(Target.getSymA()) with Target.getSymSpecifier()
Add MCValue::getSymSpecifier as a workaround for targets that encode the
relocation specifier on SymA. This function asserts that SymA is not
null.
Added:
Modified:
llvm/include/llvm/MC/MCValue.h
llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp
llvm/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp
llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp
llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp
llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
llvm/lib/Target/SystemZ/MCTargetDesc/SystemZELFObjectWriter.cpp
llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/MC/MCValue.h b/llvm/include/llvm/MC/MCValue.h
index cb89e245f2887..9ef77703356a4 100644
--- a/llvm/include/llvm/MC/MCValue.h
+++ b/llvm/include/llvm/MC/MCValue.h
@@ -67,6 +67,8 @@ class MCValue {
// Get the relocation specifier from SymA. This is a workaround for targets
// that do not use MCValue::Specifier.
+ uint16_t getSymSpecifier() const { return SymA->getSpecifier(); }
+ // Get the relocation specifier from SymA, or 0 when SymA is null.
uint16_t getAccessVariant() const;
static MCValue get(const MCSymbolRefExpr *SymA,
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index 38710e9344687..8b8c5a22b829c 100644
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -8224,7 +8224,7 @@ bool AArch64AsmParser::classifySymbolRef(const MCExpr *Expr,
return false;
if (Res.getSymA())
- DarwinSpec = AArch64MCExpr::Specifier(Res.getSymA()->getKind());
+ DarwinSpec = AArch64MCExpr::Specifier(Res.getSymSpecifier());
Addend = Res.getConstant();
// It's some symbol reference + a constant addend, but really
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp
index fa72cbf032cdf..4763fdf8deb05 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp
@@ -117,9 +117,9 @@ unsigned AArch64ELFObjectWriter::getRelocType(MCContext &Ctx,
bool IsNC = AArch64MCExpr::isNotChecked(RefKind);
assert((!Target.getSymA() ||
- getSpecifier(Target.getSymA()) == AArch64MCExpr::None ||
- getSpecifier(Target.getSymA()) == AArch64MCExpr::VK_PLT ||
- getSpecifier(Target.getSymA()) == AArch64MCExpr::VK_GOTPCREL) &&
+ Target.getSymSpecifier() == AArch64MCExpr::None ||
+ Target.getSymSpecifier() == AArch64MCExpr::VK_PLT ||
+ Target.getSymSpecifier() == AArch64MCExpr::VK_GOTPCREL) &&
"Should only be expression-level modifiers here");
switch (SymLoc) {
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
index c3a6174131806..cca337a1a66dd 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
@@ -221,7 +221,7 @@ void AArch64MachObjectWriter::recordRelocation(
// Check for "_foo at got - .", which comes through here as:
// Ltmp0:
// ... _foo at got - Ltmp0
- if (getSpecifier(Target.getSymA()) == AArch64MCExpr::M_GOT &&
+ if (Target.getSymSpecifier() == AArch64MCExpr::M_GOT &&
Asm.getSymbolOffset(*B) ==
Asm.getFragmentOffset(*Fragment) + Fixup.getOffset()) {
// SymB is the PC, so use a PC-rel pointer-to-GOT relocation.
@@ -232,7 +232,7 @@ void AArch64MachObjectWriter::recordRelocation(
MRE.r_word1 = (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
Writer->addRelocation(A_Base, Fragment->getParent(), MRE);
return;
- } else if (getSpecifier(Target.getSymA()) != AArch64MCExpr::None) {
+ } else if (Target.getSymSpecifier() != AArch64MCExpr::None) {
// Otherwise, neither symbol can be modified.
Asm.getContext().reportError(Fixup.getLoc(),
"unsupported relocation of modified symbol");
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp
index d679f5f621e0a..f580b37252e80 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp
@@ -62,7 +62,7 @@ unsigned AArch64WinCOFFObjectWriter::getRelocType(
}
auto Modifier =
- Target.isAbsolute() ? AArch64MCExpr::None : Target.getSymA()->getKind();
+ Target.isAbsolute() ? AArch64MCExpr::None : Target.getSymSpecifier();
const MCExpr *Expr = Fixup.getValue();
if (const AArch64MCExpr *A64E = dyn_cast<AArch64MCExpr>(Expr)) {
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp
index 0a605df41891e..da8762c855fb2 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp
@@ -44,10 +44,7 @@ unsigned ARMWinCOFFObjectWriter::getRelocType(MCContext &Ctx,
const MCFixup &Fixup,
bool IsCrossSection,
const MCAsmBackend &MAB) const {
- MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute()
- ? MCSymbolRefExpr::VK_None
- : Target.getSymA()->getKind();
-
+ auto Spec = Target.getAddSym() ? Target.getSymSpecifier() : 0;
unsigned FixupKind = Fixup.getKind();
if (IsCrossSection) {
if (FixupKind != FK_Data_4) {
@@ -64,7 +61,7 @@ unsigned ARMWinCOFFObjectWriter::getRelocType(MCContext &Ctx,
return COFF::IMAGE_REL_ARM_ABSOLUTE;
}
case FK_Data_4:
- switch (Modifier) {
+ switch (Spec) {
case MCSymbolRefExpr::VK_COFF_IMGREL32:
return COFF::IMAGE_REL_ARM_ADDR32NB;
case MCSymbolRefExpr::VK_SECREL:
diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp
index 97be62ff5da06..f36f25559365c 100644
--- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp
+++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp
@@ -41,7 +41,7 @@ llvm::createPPCXCOFFObjectWriter(bool Is64Bit) {
std::pair<uint8_t, uint8_t> PPCXCOFFObjectWriter::getRelocTypeAndSignSize(
const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const {
const auto Specifier =
- Target.isAbsolute() ? PPCMCExpr::VK_None : getSpecifier(Target.getSymA());
+ Target.isAbsolute() ? PPCMCExpr::VK_None : Target.getSymSpecifier();
// People from AIX OS team says AIX link editor does not care about
// the sign bit in the relocation entry "most" of the time.
// The system assembler seems to set the sign bit on relocation entry
diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
index 2e73ba54ae21b..77a55eceaf68e 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
@@ -51,7 +51,7 @@ unsigned RISCVELFObjectWriter::getRelocType(MCContext &Ctx,
const MCFixup &Fixup,
bool IsPCRel) const {
assert((!Target.getSymA() ||
- Target.getSymA()->getKind() == MCSymbolRefExpr::VK_None) &&
+ Target.getSymSpecifier() == MCSymbolRefExpr::VK_None) &&
"sym at specifier should have been rejected");
const MCExpr *Expr = Fixup.getValue();
// Determine the type of the relocation
diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZELFObjectWriter.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZELFObjectWriter.cpp
index cfec53bd5dec9..e5c51b0bdba8f 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZELFObjectWriter.cpp
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZELFObjectWriter.cpp
@@ -220,7 +220,7 @@ unsigned SystemZELFObjectWriter::getRelocType(MCContext &Ctx,
bool SystemZELFObjectWriter::needsRelocateWithSymbol(const MCValue &V,
const MCSymbol &Sym,
unsigned Type) const {
- switch (getSpecifier(V.getSymA())) {
+ switch (V.getSymSpecifier()) {
case SystemZMCExpr::VK_GOT:
case SystemZMCExpr::VK_PLT:
return true;
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
index d698c917d4382..65997840cbe8d 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
@@ -744,8 +744,7 @@ bool X86AsmBackend::fixupNeedsRelaxationAdvanced(const MCAssembler &Asm,
if (Fixup.getKind() == FK_Data_1) {
MCValue Target;
if (Fixup.getValue()->evaluateAsRelocatable(Target, &Asm) &&
- Target.getSymA() &&
- getSpecifier(Target.getSymA()) == X86MCExpr::VK_ABS8)
+ Target.getSymA() && Target.getSymSpecifier() == X86MCExpr::VK_ABS8)
return false;
}
return true;
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
index 94dc110726f0d..205392a2c96be 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
@@ -391,7 +391,7 @@ unsigned X86ELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
bool X86ELFObjectWriter::needsRelocateWithSymbol(const MCValue &V,
const MCSymbol &Sym,
unsigned Type) const {
- switch (getSpecifier(V.getSymA())) {
+ switch (V.getSymSpecifier()) {
case X86MCExpr::VK_GOT:
case X86MCExpr::VK_PLT:
case X86MCExpr::VK_GOTPCREL:
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
index 7e195e78ce087..c76ef4e936409 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
@@ -151,7 +151,7 @@ void X86MachObjectWriter::RecordX86_64Relocation(
const MCSymbol *B_Base = Writer->getAtom(*B);
// Neither symbol can be modified.
- if (getSpecifier(Target.getSymA()) != X86MCExpr::VK_None) {
+ if (Target.getSymSpecifier()) {
Asm.getContext().reportError(Fixup.getLoc(),
"unsupported relocation of modified symbol");
return;
@@ -266,7 +266,7 @@ void X86MachObjectWriter::RecordX86_64Relocation(
return;
}
- auto Specifier = getSpecifier(Target.getSymA());
+ auto Specifier = Target.getSymSpecifier();
if (IsPCRel) {
if (IsRIPRel) {
if (Specifier == X86MCExpr::VK_GOTPCREL) {
@@ -279,7 +279,7 @@ void X86MachObjectWriter::RecordX86_64Relocation(
Type = MachO::X86_64_RELOC_GOT;
} else if (Specifier == X86MCExpr::VK_TLVP) {
Type = MachO::X86_64_RELOC_TLV;
- } else if (Specifier != X86MCExpr::VK_None) {
+ } else if (Specifier) {
Asm.getContext().reportError(
Fixup.getLoc(), "unsupported symbol modifier in relocation");
return;
@@ -307,7 +307,7 @@ void X86MachObjectWriter::RecordX86_64Relocation(
}
}
} else {
- if (Specifier != X86MCExpr::VK_None) {
+ if (Specifier) {
Asm.getContext().reportError(
Fixup.getLoc(),
"unsupported symbol modifier in branch relocation");
@@ -330,7 +330,7 @@ void X86MachObjectWriter::RecordX86_64Relocation(
Asm.getContext().reportError(
Fixup.getLoc(), "TLVP symbol modifier should have been rip-rel");
return;
- } else if (Specifier != X86MCExpr::VK_None) {
+ } else if (Specifier) {
Asm.getContext().reportError(
Fixup.getLoc(), "unsupported symbol modifier in relocation");
return;
@@ -460,8 +460,8 @@ void X86MachObjectWriter::recordTLVPRelocation(MachObjectWriter *Writer,
const MCFixup &Fixup,
MCValue Target,
uint64_t &FixedValue) {
- const MCSymbolRefExpr *SymA = Target.getSymA();
- assert(getSpecifier(SymA) == X86MCExpr::VK_TLVP && !is64Bit() &&
+ const MCSymbol *SymA = Target.getAddSym();
+ assert(Target.getSymSpecifier() == X86MCExpr::VK_TLVP && !is64Bit() &&
"Should only be called with a 32-bit TLVP relocation!");
unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
@@ -489,7 +489,7 @@ void X86MachObjectWriter::recordTLVPRelocation(MachObjectWriter *Writer,
MRE.r_word0 = Value;
MRE.r_word1 =
(IsPCRel << 24) | (Log2Size << 25) | (MachO::GENERIC_RELOC_TLV << 28);
- Writer->addRelocation(&SymA->getSymbol(), Fragment->getParent(), MRE);
+ Writer->addRelocation(SymA, Fragment->getParent(), MRE);
}
void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
@@ -502,8 +502,7 @@ void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
// If this is a 32-bit TLVP reloc it's handled a bit
diff erently.
- if (Target.getSymA() &&
- getSpecifier(Target.getSymA()) == X86MCExpr::VK_TLVP) {
+ if (Target.getSymA() && Target.getSymSpecifier() == X86MCExpr::VK_TLVP) {
recordTLVPRelocation(Writer, Asm, Fragment, Fixup, Target, FixedValue);
return;
}
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp
index 7b8adfb292c00..30076978401be 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFObjectWriter.cpp
@@ -59,8 +59,7 @@ unsigned X86WinCOFFObjectWriter::getRelocType(MCContext &Ctx,
}
}
- auto Modifier = Target.isAbsolute() ? MCSymbolRefExpr::VK_None
- : Target.getSymA()->getKind();
+ auto Spec = Target.getAddSym() ? Target.getSymSpecifier() : 0;
if (Is64Bit) {
switch (FixupKind) {
case FK_PCRel_4:
@@ -76,9 +75,9 @@ unsigned X86WinCOFFObjectWriter::getRelocType(MCContext &Ctx,
case FK_Data_4:
case X86::reloc_signed_4byte:
case X86::reloc_signed_4byte_relax:
- if (Modifier == MCSymbolRefExpr::VK_COFF_IMGREL32)
+ if (Spec == MCSymbolRefExpr::VK_COFF_IMGREL32)
return COFF::IMAGE_REL_AMD64_ADDR32NB;
- if (Modifier == MCSymbolRefExpr::VK_SECREL)
+ if (Spec == MCSymbolRefExpr::VK_SECREL)
return COFF::IMAGE_REL_AMD64_SECREL;
return COFF::IMAGE_REL_AMD64_ADDR32;
case FK_Data_8:
@@ -100,9 +99,9 @@ unsigned X86WinCOFFObjectWriter::getRelocType(MCContext &Ctx,
case FK_Data_4:
case X86::reloc_signed_4byte:
case X86::reloc_signed_4byte_relax:
- if (Modifier == MCSymbolRefExpr::VK_COFF_IMGREL32)
+ if (Spec == MCSymbolRefExpr::VK_COFF_IMGREL32)
return COFF::IMAGE_REL_I386_DIR32NB;
- if (Modifier == MCSymbolRefExpr::VK_SECREL)
+ if (Spec == MCSymbolRefExpr::VK_SECREL)
return COFF::IMAGE_REL_I386_SECREL;
return COFF::IMAGE_REL_I386_DIR32;
case FK_SecRel_2:
More information about the llvm-commits
mailing list