[llvm] ed2f89f - Simplify R_SPARC_WDISP30 and R_SPARC_WPLT30 handling
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun May 4 16:47:28 PDT 2025
Author: Fangrui Song
Date: 2025-05-04T16:47:23-07:00
New Revision: ed2f89fa00c784c6a4290955fb2c68dea033fe59
URL: https://github.com/llvm/llvm-project/commit/ed2f89fa00c784c6a4290955fb2c68dea033fe59
DIFF: https://github.com/llvm/llvm-project/commit/ed2f89fa00c784c6a4290955fb2c68dea033fe59.diff
LOG: Simplify R_SPARC_WDISP30 and R_SPARC_WPLT30 handling
Instead of determining the relocation type during SparcMCExpr
construction (in AsmParser or AsmPrinter), use fixup_sparc_call30 and
expand it to either R_SPARC_WDISP30 or R_SPARC_WPLT30.
Added:
Modified:
llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.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/SparcMCCodeEmitter.cpp
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/Target/Sparc/AsmParser/SparcAsmParser.cpp b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
index 0df56c41376bb..bba96b68c8559 100644
--- a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
+++ b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
@@ -1322,12 +1322,7 @@ ParseStatus SparcAsmParser::parseCallTarget(OperandVector &Operands) {
if (getParser().parseExpression(DestValue))
return ParseStatus::NoMatch;
- bool IsPic = getContext().getObjectFileInfo()->isPositionIndependent();
- SparcMCExpr::Specifier Kind =
- IsPic ? SparcMCExpr::VK_WPLT30 : SparcMCExpr::VK_WDISP30;
-
- const MCExpr *DestExpr = SparcMCExpr::create(Kind, DestValue, getContext());
- Operands.push_back(SparcOperand::CreateImm(DestExpr, S, E));
+ Operands.push_back(SparcOperand::CreateImm(DestValue, S, E));
return ParseStatus::Success;
}
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
index 59febfb405fa8..dde44d86d228c 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
@@ -31,7 +31,6 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
case FK_Data_8:
return Value;
- case Sparc::fixup_sparc_wplt30:
case Sparc::fixup_sparc_call30:
return (Value >> 2) & 0x3fffffff;
@@ -150,7 +149,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_wplt30", 2, 30, MCFixupKindInfo::FKF_IsPCRel },
{ "fixup_sparc_hix22", 10, 22, 0 },
{ "fixup_sparc_lox10", 19, 13, 0 },
};
@@ -172,7 +170,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_wplt30", 0, 30, MCFixupKindInfo::FKF_IsPCRel },
{ "fixup_sparc_hix22", 0, 22, 0 },
{ "fixup_sparc_lox10", 0, 13, 0 },
};
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
index 111e65847d352..726f2327b04cd 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
@@ -87,14 +87,16 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
case FK_Data_2: return ELF::R_SPARC_DISP16;
case FK_Data_4: return ELF::R_SPARC_DISP32;
case FK_Data_8: return ELF::R_SPARC_DISP64;
- case Sparc::fixup_sparc_call30: return ELF::R_SPARC_WDISP30;
+ case Sparc::fixup_sparc_call30:
+ if (Ctx.getObjectFileInfo()->isPositionIndependent())
+ return ELF::R_SPARC_WPLT30;
+ return ELF::R_SPARC_WDISP30;
case Sparc::fixup_sparc_br22: return ELF::R_SPARC_WDISP22;
case Sparc::fixup_sparc_br19: return ELF::R_SPARC_WDISP19;
case Sparc::fixup_sparc_br16:
return ELF::R_SPARC_WDISP16;
case Sparc::fixup_sparc_pc22: return ELF::R_SPARC_PC22;
case Sparc::fixup_sparc_pc10: return ELF::R_SPARC_PC10;
- case Sparc::fixup_sparc_wplt30: return ELF::R_SPARC_WPLT30;
}
}
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
index c99b583df1920..d1107d267452c 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h
@@ -63,9 +63,6 @@ namespace llvm {
/// fixup_sparc_pc10 - 10-bit fixup corresponding to %pc10(foo)
fixup_sparc_pc10,
- /// fixup_sparc_wplt30
- fixup_sparc_wplt30,
-
/// 22-bit fixup corresponding to %hix(foo)
fixup_sparc_hix22,
/// 13-bit fixup corresponding to %lox(foo)
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
index e5a277ecabdd0..4e282f3a6868a 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
@@ -178,9 +178,7 @@ getCallTargetOpValue(const MCInst &MI, unsigned OpNo,
}
const MCOperand &MO = MI.getOperand(OpNo);
- const MCExpr *Expr = MO.getExpr();
- auto *SExpr = cast<SparcMCExpr>(Expr);
- Fixups.push_back(MCFixup::create(0, Expr, SExpr->getFixupKind()));
+ Fixups.push_back(MCFixup::create(0, MO.getExpr(), Sparc::fixup_sparc_call30));
return 0;
}
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
index bd4c47491d1b3..8be7dca625c6a 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
@@ -56,8 +56,6 @@ StringRef SparcMCExpr::getSpecifierName(SparcMCExpr::Specifier S) {
case VK_GOT22: return "hi";
case VK_GOT10: return "lo";
case VK_GOT13: return {};
- case VK_WDISP30: return {};
- case VK_WPLT30: return {};
case VK_R_DISP32: return "r_disp32";
case VK_TLS_GD_HI22: return "tgd_hi22";
case VK_TLS_GD_LO10: return "tgd_lo10";
@@ -148,8 +146,6 @@ uint16_t SparcMCExpr::getFixupKind() const {
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_WPLT30: return Sparc::fixup_sparc_wplt30;
- case VK_WDISP30: return Sparc::fixup_sparc_call30;
case VK_TLS_GD_HI22: return ELF::R_SPARC_TLS_GD_HI22;
case VK_TLS_GD_LO10: return ELF::R_SPARC_TLS_GD_LO10;
case VK_TLS_GD_ADD: return ELF::R_SPARC_TLS_GD_ADD;
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
index 4689dacb0db79..93723af6877d0 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
@@ -37,8 +37,6 @@ class SparcMCExpr : public MCTargetExpr {
VK_GOT22,
VK_GOT10,
VK_GOT13,
- VK_WPLT30,
- VK_WDISP30,
VK_R_DISP32,
VK_TLS_GD_HI22,
VK_TLS_GD_LO10,
diff --git a/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp b/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
index 06c938e1cc215..1282540b5d72f 100644
--- a/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
+++ b/llvm/lib/Target/Sparc/SparcAsmPrinter.cpp
@@ -84,7 +84,7 @@ static MCOperand createSparcMCOperand(SparcMCExpr::Specifier Kind,
}
static MCOperand createPCXCallOP(MCSymbol *Label,
MCContext &OutContext) {
- return createSparcMCOperand(SparcMCExpr::VK_WDISP30, Label, OutContext);
+ return MCOperand::createExpr(MCSymbolRefExpr::create(Label, OutContext));
}
static MCOperand createPCXRelExprOp(SparcMCExpr::Specifier Kind,
diff --git a/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
index 0b98327d53434..a4ea262c14b15 100644
--- a/llvm/lib/Target/Sparc/SparcISelLowering.cpp
+++ b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
@@ -1056,12 +1056,10 @@ SparcTargetLowering::LowerCall_32(TargetLowering::CallLoweringInfo &CLI,
// If the callee is a GlobalAddress node (quite common, every direct call is)
// turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
// Likewise ExternalSymbol -> TargetExternalSymbol.
- unsigned TF = isPositionIndependent() ? SparcMCExpr::VK_WPLT30
- : SparcMCExpr::VK_WDISP30;
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
- Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl, MVT::i32, 0, TF);
+ Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl, MVT::i32, 0);
else if (ExternalSymbolSDNode *E = dyn_cast<ExternalSymbolSDNode>(Callee))
- Callee = DAG.getTargetExternalSymbol(E->getSymbol(), MVT::i32, TF);
+ Callee = DAG.getTargetExternalSymbol(E->getSymbol(), MVT::i32);
// Returns a chain & a flag for retval copy to use
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
@@ -1390,12 +1388,10 @@ SparcTargetLowering::LowerCall_64(TargetLowering::CallLoweringInfo &CLI,
// Likewise ExternalSymbol -> TargetExternalSymbol.
SDValue Callee = CLI.Callee;
bool hasReturnsTwice = hasReturnsTwiceAttr(DAG, Callee, CLI.CB);
- unsigned TF = isPositionIndependent() ? SparcMCExpr::VK_WPLT30
- : SparcMCExpr::VK_WDISP30;
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
- Callee = DAG.getTargetGlobalAddress(G->getGlobal(), DL, PtrVT, 0, TF);
+ Callee = DAG.getTargetGlobalAddress(G->getGlobal(), DL, PtrVT, 0);
else if (ExternalSymbolSDNode *E = dyn_cast<ExternalSymbolSDNode>(Callee))
- Callee = DAG.getTargetExternalSymbol(E->getSymbol(), PtrVT, TF);
+ Callee = DAG.getTargetExternalSymbol(E->getSymbol(), PtrVT);
// Build the operands for the call instruction itself.
SmallVector<SDValue, 8> Ops;
More information about the llvm-commits
mailing list