[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