[llvm] f39696e - Sparc: Remove fixup kinds and specifiers for H44/M44/L44

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sun May 4 19:05:49 PDT 2025


Author: Fangrui Song
Date: 2025-05-04T19:05:44-07:00
New Revision: f39696e7dee4f1dce8c10d2b17f987643c480895

URL: https://github.com/llvm/llvm-project/commit/f39696e7dee4f1dce8c10d2b17f987643c480895
DIFF: https://github.com/llvm/llvm-project/commit/f39696e7dee4f1dce8c10d2b17f987643c480895.diff

LOG: Sparc: Remove fixup kinds and specifiers for H44/M44/L44

The simm13 format OR instruction should use one single fixup kind, while
it currently uses a lot more, including %m44/%l44.

This change refactors R_SPARC_H44/R_SPARC_M44/R_SPARC_M44 handling to
remove fixup kinds and specifiers. We utilize the [0,
FirstLiteralRelocationKind) MCFixupKind range to encode raw relocation
types that may be resolved (see the MCAssembler.cpp change).

The `evaluateAsRelocatableImpl` implementation resembles
PPCMCExpr::evaluateAsRelocatableImpl.

Added: 
    

Modified: 
    llvm/lib/MC/MCAssembler.cpp
    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/SparcMCExpr.cpp
    llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
    llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
    llvm/lib/Target/Sparc/SparcISelLowering.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index b1fd253d1cf60..eaaa57408becf 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -203,7 +203,7 @@ bool MCAssembler::evaluateFixup(const MCFixup &Fixup, const MCFragment *DF,
   if (IsResolved) {
     auto TargetVal = Target;
     TargetVal.Cst = Value;
-    if (mc::isRelocation(Fixup.getKind()) ||
+    if (mc::isRelocRelocation(Fixup.getKind()) ||
         getBackend().shouldForceRelocation(*this, Fixup, TargetVal, STI))
       IsResolved = false;
   }

diff  --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
index dde44d86d228c..7223c9ccd063b 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
@@ -24,7 +24,8 @@ using namespace llvm;
 static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
   switch (Kind) {
   default:
-    llvm_unreachable("Unknown fixup kind!");
+    assert(uint16_t(Kind) < FirstTargetFixupKind && "Unknown fixup kind!");
+    return Value;
   case FK_Data_1:
   case FK_Data_2:
   case FK_Data_4:
@@ -67,15 +68,6 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
   case Sparc::fixup_sparc_lo10:
     return Value & 0x3ff;
 
-  case Sparc::fixup_sparc_h44:
-    return (Value >> 22) & 0x3fffff;
-
-  case Sparc::fixup_sparc_m44:
-    return (Value >> 12) & 0x3ff;
-
-  case Sparc::fixup_sparc_l44:
-    return Value & 0xfff;
-
   case Sparc::fixup_sparc_hh:
     return (Value >> 42) & 0x3fffff;
 
@@ -141,9 +133,6 @@ namespace {
         { "fixup_sparc_13",        19,     13,  0 },
         { "fixup_sparc_hi22",      10,     22,  0 },
         { "fixup_sparc_lo10",      22,     10,  0 },
-        { "fixup_sparc_h44",       10,     22,  0 },
-        { "fixup_sparc_m44",       22,     10,  0 },
-        { "fixup_sparc_l44",       20,     12,  0 },
         { "fixup_sparc_hh",        10,     22,  0 },
         { "fixup_sparc_hm",        22,     10,  0 },
         { "fixup_sparc_lm",        10,     22,  0 },
@@ -162,9 +151,6 @@ namespace {
         { "fixup_sparc_13",         0,     13,  0 },
         { "fixup_sparc_hi22",       0,     22,  0 },
         { "fixup_sparc_lo10",       0,     10,  0 },
-        { "fixup_sparc_h44",        0,     22,  0 },
-        { "fixup_sparc_m44",        0,     10,  0 },
-        { "fixup_sparc_l44",        0,     12,  0 },
         { "fixup_sparc_hh",         0,     22,  0 },
         { "fixup_sparc_hm",         0,     10,  0 },
         { "fixup_sparc_lm",         0,     22,  0 },
@@ -230,8 +216,7 @@ namespace {
                     const MCValue &Target, MutableArrayRef<char> Data,
                     uint64_t Value, bool IsResolved,
                     const MCSubtargetInfo *STI) const override {
-
-      if (mc::isRelocation(Fixup.getKind()))
+      if (mc::isRelocRelocation(Fixup.getKind()))
         return;
       Value = adjustFixupValue(Fixup.getKind(), Value);
       if (!Value) return;           // Doesn't change encoding.

diff  --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
index 726f2327b04cd..c365b9b9f589f 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
@@ -122,9 +122,6 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
 
   case Sparc::fixup_sparc_hi22:  return ELF::R_SPARC_HI22;
   case Sparc::fixup_sparc_lo10:  return ELF::R_SPARC_LO10;
-  case Sparc::fixup_sparc_h44:   return ELF::R_SPARC_H44;
-  case Sparc::fixup_sparc_m44:   return ELF::R_SPARC_M44;
-  case Sparc::fixup_sparc_l44:   return ELF::R_SPARC_L44;
   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;

diff  --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
index d1107d267452c..a7c1d509b9051 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
@@ -39,15 +39,6 @@ namespace llvm {
       /// fixup_sparc_lo10  - 10-bit fixup corresponding to %lo(foo)
       fixup_sparc_lo10,
 
-      /// fixup_sparc_h44  - 22-bit fixup corresponding to %h44(foo)
-      fixup_sparc_h44,
-
-      /// fixup_sparc_m44  - 10-bit fixup corresponding to %m44(foo)
-      fixup_sparc_m44,
-
-      /// fixup_sparc_l44  - 12-bit fixup corresponding to %l44(foo)
-      fixup_sparc_l44,
-
       /// fixup_sparc_hh  -  22-bit fixup corresponding to %hh(foo)
       fixup_sparc_hh,
 

diff  --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
index 8be7dca625c6a..325d8b7dd1ecb 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
@@ -40,13 +40,13 @@ void SparcMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
 
 StringRef SparcMCExpr::getSpecifierName(SparcMCExpr::Specifier S) {
   // clang-format off
-  switch (S) {
+  switch (uint16_t(S)) {
   case VK_None:          return {};
   case VK_LO:            return "lo";
   case VK_HI:            return "hi";
-  case VK_H44:           return "h44";
-  case VK_M44:           return "m44";
-  case VK_L44:           return "l44";
+  case ELF::R_SPARC_H44:           return "h44";
+  case ELF::R_SPARC_M44:           return "m44";
+  case ELF::R_SPARC_L44:           return "l44";
   case VK_HH:            return "hh";
   case VK_HM:            return "hm";
   case VK_LM:            return "lm";
@@ -89,9 +89,9 @@ SparcMCExpr::Specifier SparcMCExpr::parseSpecifier(StringRef name) {
   return StringSwitch<SparcMCExpr::Specifier>(name)
       .Case("lo", VK_LO)
       .Case("hi", VK_HI)
-      .Case("h44", VK_H44)
-      .Case("m44", VK_M44)
-      .Case("l44", VK_L44)
+      .Case("h44", (SparcMCExpr::Specifier)ELF::R_SPARC_H44)
+      .Case("m44", (SparcMCExpr::Specifier)ELF::R_SPARC_M44)
+      .Case("l44", (SparcMCExpr::Specifier)ELF::R_SPARC_L44)
       .Case("hh", VK_HH)
       .Case("uhi", VK_HH) // Nonstandard GNU extension
       .Case("hm", VK_HM)
@@ -132,12 +132,11 @@ SparcMCExpr::Specifier SparcMCExpr::parseSpecifier(StringRef name) {
 uint16_t SparcMCExpr::getFixupKind() const {
   // clang-format off
   switch (specifier) {
-  default: llvm_unreachable("Unhandled SparcMCExpr::Specifier");
+  default:
+    assert(uint16_t(specifier) < FirstTargetFixupKind);
+    return specifier;
   case VK_LO:            return Sparc::fixup_sparc_lo10;
   case VK_HI:            return Sparc::fixup_sparc_hi22;
-  case VK_H44:           return Sparc::fixup_sparc_h44;
-  case VK_M44:           return Sparc::fixup_sparc_m44;
-  case VK_L44:           return Sparc::fixup_sparc_l44;
   case VK_HH:            return Sparc::fixup_sparc_hh;
   case VK_HM:            return Sparc::fixup_sparc_hm;
   case VK_LM:            return Sparc::fixup_sparc_lm;
@@ -177,6 +176,27 @@ bool SparcMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
                                             const MCAssembler *Asm) const {
   if (!getSubExpr()->evaluateAsRelocatable(Res, Asm))
     return false;
+
+  if (Res.isAbsolute()) {
+    std::optional<int64_t> V;
+    auto C = (uint64_t)Res.getConstant();
+    switch (uint16_t(specifier)) {
+    case ELF::R_SPARC_H44:
+      V = (C >> 22) & 0x3fffff;
+      break;
+    case ELF::R_SPARC_M44:
+      V = (C >> 12) & 0x3ff;
+      break;
+    case ELF::R_SPARC_L44:
+      V = C & 0xfff;
+      break;
+    }
+    if (V) {
+      Res = MCValue::get(*V);
+      return true;
+    }
+  }
+
   Res.setSpecifier(specifier);
   return true;
 }

diff  --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
index 93723af6877d0..724d6761dd933 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
@@ -24,11 +24,8 @@ class SparcMCExpr : public MCTargetExpr {
 public:
   enum Specifier {
     VK_None,
-    VK_LO,
+    VK_LO = 200, // larger than any relocation type
     VK_HI,
-    VK_H44,
-    VK_M44,
-    VK_L44,
     VK_HH,
     VK_HM,
     VK_LM,

diff  --git a/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp b/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
index 1282540b5d72f..e82652632c983 100644
--- a/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
+++ b/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
@@ -19,6 +19,7 @@
 #include "SparcInstrInfo.h"
 #include "SparcTargetMachine.h"
 #include "TargetInfo/SparcTargetInfo.h"
+#include "llvm/BinaryFormat/ELF.h"
 #include "llvm/CodeGen/AsmPrinter.h"
 #include "llvm/CodeGen/MachineInstr.h"
 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
@@ -75,11 +76,11 @@ class SparcAsmPrinter : public AsmPrinter {
 };
 } // end of anonymous namespace
 
-static MCOperand createSparcMCOperand(SparcMCExpr::Specifier Kind,
-                                      MCSymbol *Sym, MCContext &OutContext) {
-  const MCSymbolRefExpr *MCSym = MCSymbolRefExpr::create(Sym,
-                                                         OutContext);
-  const SparcMCExpr *expr = SparcMCExpr::create(Kind, MCSym, OutContext);
+static MCOperand createSparcMCOperand(uint16_t Kind, MCSymbol *Sym,
+                                      MCContext &OutContext) {
+  const MCSymbolRefExpr *MCSym = MCSymbolRefExpr::create(Sym, OutContext);
+  const SparcMCExpr *expr =
+      SparcMCExpr::create(SparcMCExpr::Specifier(Kind), MCSym, OutContext);
   return MCOperand::createExpr(expr);
 }
 static MCOperand createPCXCallOP(MCSymbol *Label,
@@ -163,11 +164,9 @@ static void EmitSHL(MCStreamer &OutStreamer,
   EmitBinary(OutStreamer, SP::SLLri, RS1, Imm, RD, STI);
 }
 
-static void EmitHiLo(MCStreamer &OutStreamer, MCSymbol *GOTSym,
-                     SparcMCExpr::Specifier HiKind,
-                     SparcMCExpr::Specifier LoKind, MCOperand &RD,
-                     MCContext &OutContext, const MCSubtargetInfo &STI) {
-
+static void EmitHiLo(MCStreamer &OutStreamer, MCSymbol *GOTSym, uint16_t HiKind,
+                     uint16_t LoKind, MCOperand &RD, MCContext &OutContext,
+                     const MCSubtargetInfo &STI) {
   MCOperand hi = createSparcMCOperand(HiKind, GOTSym, OutContext);
   MCOperand lo = createSparcMCOperand(LoKind, GOTSym, OutContext);
   EmitSETHI(OutStreamer, hi, RD, STI);
@@ -197,13 +196,13 @@ void SparcAsmPrinter::LowerGETPCXAndEmitMCInsts(const MachineInstr *MI,
                MCRegOP, OutContext, STI);
       break;
     case CodeModel::Medium: {
-      EmitHiLo(*OutStreamer, GOTLabel, SparcMCExpr::VK_H44, SparcMCExpr::VK_M44,
+      EmitHiLo(*OutStreamer, GOTLabel, ELF::R_SPARC_H44, ELF::R_SPARC_M44,
                MCRegOP, OutContext, STI);
       MCOperand imm = MCOperand::createExpr(MCConstantExpr::create(12,
                                                                    OutContext));
       EmitSHL(*OutStreamer, MCRegOP, imm, MCRegOP, STI);
       MCOperand lo =
-          createSparcMCOperand(SparcMCExpr::VK_L44, GOTLabel, OutContext);
+          createSparcMCOperand(ELF::R_SPARC_L44, GOTLabel, OutContext);
       EmitOR(*OutStreamer, MCRegOP, lo, MCRegOP, STI);
       break;
     }

diff  --git a/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
index a4ea262c14b15..f0273daac6045 100644
--- a/llvm/lib/Target/Sparc/SparcISelLowering.cpp
+++ b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
@@ -20,6 +20,7 @@
 #include "SparcTargetObjectFile.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringSwitch.h"
+#include "llvm/BinaryFormat/ELF.h"
 #include "llvm/CodeGen/CallingConvLower.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
 #include "llvm/CodeGen/MachineFunction.h"
@@ -2204,10 +2205,9 @@ SDValue SparcTargetLowering::makeAddress(SDValue Op, SelectionDAG &DAG) const {
     return makeHiLoPair(Op, SparcMCExpr::VK_HI, SparcMCExpr::VK_LO, DAG);
   case CodeModel::Medium: {
     // abs44.
-    SDValue H44 =
-        makeHiLoPair(Op, SparcMCExpr::VK_H44, SparcMCExpr::VK_M44, DAG);
+    SDValue H44 = makeHiLoPair(Op, ELF::R_SPARC_H44, ELF::R_SPARC_M44, DAG);
     H44 = DAG.getNode(ISD::SHL, DL, VT, H44, DAG.getConstant(12, DL, MVT::i32));
-    SDValue L44 = withTargetFlags(Op, SparcMCExpr::VK_L44, DAG);
+    SDValue L44 = withTargetFlags(Op, ELF::R_SPARC_L44, DAG);
     L44 = DAG.getNode(SPISD::Lo, DL, VT, L44);
     return DAG.getNode(ISD::ADD, DL, VT, H44, L44);
   }


        


More information about the llvm-commits mailing list