[llvm] 7d423c0 - Sparc: Use mc::isRelocation and remove GOT fixup kinds that map to relocation types
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat May 3 18:08:55 PDT 2025
Author: Fangrui Song
Date: 2025-05-03T18:08:50-07:00
New Revision: 7d423c09c0e063eeeaa2f91100eb6f04dc15767c
URL: https://github.com/llvm/llvm-project/commit/7d423c09c0e063eeeaa2f91100eb6f04dc15767c
DIFF: https://github.com/llvm/llvm-project/commit/7d423c09c0e063eeeaa2f91100eb6f04dc15767c.diff
LOG: Sparc: Use mc::isRelocation and remove GOT fixup kinds that map to relocation types
Simplify code, which is enabled by
40789ce7f1b7cff6de82b7f93db25a8c54194d46 ("MCFixup: Move relocation values before FK_NONE")
Added:
Modified:
llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
Removed:
################################################################################
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
index cc8b86e6135b5..2ece0ce6fc06d 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
@@ -54,7 +54,6 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
return (~Value >> 10) & 0x3fffff;
case Sparc::fixup_sparc_pc22:
- case Sparc::fixup_sparc_got22:
case Sparc::fixup_sparc_tls_gd_hi22:
case Sparc::fixup_sparc_tls_ldm_hi22:
case Sparc::fixup_sparc_tls_ie_hi22:
@@ -62,7 +61,6 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
case Sparc::fixup_sparc_lm:
return (Value >> 10) & 0x3fffff;
- case Sparc::fixup_sparc_got13:
case Sparc::fixup_sparc_13:
return Value & 0x1fff;
@@ -70,7 +68,6 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
return (Value & 0x3ff) | 0x1c00;
case Sparc::fixup_sparc_pc10:
- case Sparc::fixup_sparc_got10:
case Sparc::fixup_sparc_tls_gd_lo10:
case Sparc::fixup_sparc_tls_ldm_lo10:
case Sparc::fixup_sparc_tls_ie_lo10:
@@ -178,9 +175,6 @@ namespace {
{ "fixup_sparc_lm", 10, 22, 0 },
{ "fixup_sparc_pc22", 10, 22, MCFixupKindInfo::FKF_IsPCRel },
{ "fixup_sparc_pc10", 22, 10, MCFixupKindInfo::FKF_IsPCRel },
- { "fixup_sparc_got22", 10, 22, 0 },
- { "fixup_sparc_got10", 22, 10, 0 },
- { "fixup_sparc_got13", 19, 13, 0 },
{ "fixup_sparc_wplt30", 2, 30, MCFixupKindInfo::FKF_IsPCRel },
{ "fixup_sparc_tls_gd_hi22", 10, 22, 0 },
{ "fixup_sparc_tls_gd_lo10", 22, 10, 0 },
@@ -224,9 +218,6 @@ namespace {
{ "fixup_sparc_lm", 0, 22, 0 },
{ "fixup_sparc_pc22", 0, 22, MCFixupKindInfo::FKF_IsPCRel },
{ "fixup_sparc_pc10", 0, 10, MCFixupKindInfo::FKF_IsPCRel },
- { "fixup_sparc_got22", 0, 22, 0 },
- { "fixup_sparc_got10", 0, 10, 0 },
- { "fixup_sparc_got13", 0, 13, 0 },
{ "fixup_sparc_wplt30", 0, 30, MCFixupKindInfo::FKF_IsPCRel },
{ "fixup_sparc_tls_gd_hi22", 0, 22, 0 },
{ "fixup_sparc_tls_gd_lo10", 0, 10, 0 },
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
index f95e5ac1664e6..0d705de61b0bd 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
@@ -66,13 +66,19 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
break;
}
+ // Extract the relocation type from the fixup kind, after applying STT_TLS as
+ // needed.
+ unsigned Kind = Fixup.getTargetKind();
+ if (mc::isRelocation(Fixup.getKind()))
+ return Kind;
+
if (const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(Fixup.getValue())) {
if (SExpr->getSpecifier() == SparcMCExpr::VK_R_DISP32)
return ELF::R_SPARC_DISP32;
}
if (IsPCRel) {
- switch(Fixup.getTargetKind()) {
+ switch (Kind) {
default:
llvm_unreachable("Unimplemented fixup -> relocation");
case FK_Data_1: return ELF::R_SPARC_DISP8;
@@ -113,9 +119,6 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
case Sparc::fixup_sparc_hh: return ELF::R_SPARC_HH22;
case Sparc::fixup_sparc_hm: return ELF::R_SPARC_HM10;
case Sparc::fixup_sparc_lm: return ELF::R_SPARC_LM22;
- case Sparc::fixup_sparc_got22: return ELF::R_SPARC_GOT22;
- case Sparc::fixup_sparc_got10: return ELF::R_SPARC_GOT10;
- case Sparc::fixup_sparc_got13: return ELF::R_SPARC_GOT13;
case Sparc::fixup_sparc_tls_gd_hi22: return ELF::R_SPARC_TLS_GD_HI22;
case Sparc::fixup_sparc_tls_gd_lo10: return ELF::R_SPARC_TLS_GD_LO10;
case Sparc::fixup_sparc_tls_gd_add: return ELF::R_SPARC_TLS_GD_ADD;
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
index 3b91326589894..fc4e315521b62 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
@@ -62,15 +62,6 @@ namespace llvm {
/// fixup_sparc_pc10 - 10-bit fixup corresponding to %pc10(foo)
fixup_sparc_pc10,
- /// fixup_sparc_got22 - 22-bit fixup corresponding to %got22(foo)
- fixup_sparc_got22,
-
- /// fixup_sparc_got10 - 10-bit fixup corresponding to %got10(foo)
- fixup_sparc_got10,
-
- /// fixup_sparc_got13 - 13-bit fixup corresponding to %got13(foo)
- fixup_sparc_got13,
-
/// fixup_sparc_wplt30
fixup_sparc_wplt30,
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
index 0c9ba6a8a297c..b23cc16b76de4 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
@@ -15,6 +15,7 @@
#include "SparcMCTargetDesc.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
+#include "llvm/BinaryFormat/ELF.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCContext.h"
@@ -128,8 +129,7 @@ getMachineOpValue(const MCInst &MI, const MCOperand &MO,
assert(MO.isExpr());
const MCExpr *Expr = MO.getExpr();
if (const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(Expr)) {
- MCFixupKind Kind = (MCFixupKind)SExpr->getFixupKind();
- Fixups.push_back(MCFixup::create(0, Expr, Kind));
+ Fixups.push_back(MCFixup::create(0, Expr, SExpr->getFixupKind()));
return 0;
}
@@ -159,15 +159,13 @@ SparcMCCodeEmitter::getSImm13OpValue(const MCInst &MI, unsigned OpNo,
if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))
return CE->getValue();
- MCFixupKind Kind;
if (const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(Expr)) {
- Kind = MCFixupKind(SExpr->getFixupKind());
- } else {
- bool IsPic = Ctx.getObjectFileInfo()->isPositionIndependent();
- Kind = IsPic ? MCFixupKind(Sparc::fixup_sparc_got13)
- : MCFixupKind(Sparc::fixup_sparc_13);
+ Fixups.push_back(MCFixup::create(0, Expr, SExpr->getFixupKind()));
+ return 0;
}
-
+ uint16_t Kind = Sparc::fixup_sparc_13;
+ if (Ctx.getObjectFileInfo()->isPositionIndependent())
+ Kind = ELF::R_SPARC_GOT13;
Fixups.push_back(MCFixup::create(0, Expr, Kind));
return 0;
}
@@ -194,8 +192,7 @@ getCallTargetOpValue(const MCInst &MI, unsigned OpNo,
return 0;
}
- MCFixupKind Kind = MCFixupKind(SExpr->getFixupKind());
- Fixups.push_back(MCFixup::create(0, Expr, Kind));
+ Fixups.push_back(MCFixup::create(0, Expr, SExpr->getFixupKind()));
return 0;
}
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
index fa05622ad75b1..4ae2d302df390 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
@@ -135,9 +135,9 @@ SparcMCExpr::Specifier SparcMCExpr::parseSpecifier(StringRef name) {
.Default(VK_None);
}
-Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::Specifier S) {
+uint16_t SparcMCExpr::getFixupKind() const {
// clang-format off
- switch (S) {
+ switch (specifier) {
default: llvm_unreachable("Unhandled SparcMCExpr::Specifier");
case VK_LO: return Sparc::fixup_sparc_lo10;
case VK_HI: return Sparc::fixup_sparc_hi22;
@@ -149,9 +149,9 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::Specifier S) {
case VK_LM: return Sparc::fixup_sparc_lm;
case VK_PC22: return Sparc::fixup_sparc_pc22;
case VK_PC10: return Sparc::fixup_sparc_pc10;
- case VK_GOT22: return Sparc::fixup_sparc_got22;
- case VK_GOT10: return Sparc::fixup_sparc_got10;
- case VK_GOT13: return Sparc::fixup_sparc_got13;
+ case VK_GOT22: return ELF::R_SPARC_GOT22;
+ case VK_GOT10: return ELF::R_SPARC_GOT10;
+ case VK_GOT13: return ELF::R_SPARC_GOT13;
case VK_13: return Sparc::fixup_sparc_13;
case VK_WPLT30: return Sparc::fixup_sparc_wplt30;
case VK_WDISP30: return Sparc::fixup_sparc_call30;
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
index 05d9a5ce67104..107f6a4cb2e9e 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
@@ -85,7 +85,7 @@ class SparcMCExpr : public MCTargetExpr {
Specifier getSpecifier() const { return specifier; }
const MCExpr *getSubExpr() const { return Expr; }
- Sparc::Fixups getFixupKind() const { return getFixupKind(specifier); }
+ uint16_t getFixupKind() const;
/// @}
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
@@ -102,7 +102,6 @@ class SparcMCExpr : public MCTargetExpr {
static Specifier parseSpecifier(StringRef name);
static bool printSpecifier(raw_ostream &OS, Specifier Kind);
- static Sparc::Fixups getFixupKind(Specifier Kind);
};
} // end namespace llvm.
More information about the llvm-commits
mailing list