[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