[llvm] 911953a - [Sparc] Move fixELFSymbolsInTLSFixups to getRelocType
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 15 10:32:02 PDT 2025
Author: Fangrui Song
Date: 2025-03-15T10:31:57-07:00
New Revision: 911953a2e40845cc341f80dfb7689e7a375455b1
URL: https://github.com/llvm/llvm-project/commit/911953a2e40845cc341f80dfb7689e7a375455b1
DIFF: https://github.com/llvm/llvm-project/commit/911953a2e40845cc341f80dfb7689e7a375455b1.diff
LOG: [Sparc] Move fixELFSymbolsInTLSFixups to getRelocType
fixELFSymbolsInTLSFixups walks the expression tree, which is complex and
unnecessary. As the expression must be relocatable, we can move the code
to getRelocType and just set SymA. The behavior is similar to GNU
assembler.
__tls_get_addr registery (https://reviews.llvm.org/D43271) is unnecessary
now. SparcMCExpr::visitUsedExpr registers the symbol.
Added:
Modified:
llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
Removed:
################################################################################
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
index bdb20e3ffee54..6e1c3f7016d9e 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
@@ -46,6 +46,30 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
if (Kind >= FirstLiteralRelocationKind)
return Kind - FirstLiteralRelocationKind;
+ switch (Target.getRefKind()) {
+ case SparcMCExpr::VK_Sparc_TLS_GD_HI22:
+ case SparcMCExpr::VK_Sparc_TLS_GD_LO10:
+ case SparcMCExpr::VK_Sparc_TLS_GD_ADD:
+ case SparcMCExpr::VK_Sparc_TLS_LDM_HI22:
+ case SparcMCExpr::VK_Sparc_TLS_LDM_LO10:
+ case SparcMCExpr::VK_Sparc_TLS_LDM_ADD:
+ case SparcMCExpr::VK_Sparc_TLS_LDO_HIX22:
+ case SparcMCExpr::VK_Sparc_TLS_LDO_LOX10:
+ case SparcMCExpr::VK_Sparc_TLS_LDO_ADD:
+ case SparcMCExpr::VK_Sparc_TLS_IE_HI22:
+ case SparcMCExpr::VK_Sparc_TLS_IE_LO10:
+ case SparcMCExpr::VK_Sparc_TLS_IE_LD:
+ case SparcMCExpr::VK_Sparc_TLS_IE_LDX:
+ case SparcMCExpr::VK_Sparc_TLS_IE_ADD:
+ case SparcMCExpr::VK_Sparc_TLS_LE_HIX22:
+ case SparcMCExpr::VK_Sparc_TLS_LE_LOX10:
+ if (auto *S = Target.getSymA())
+ cast<MCSymbolELF>(S->getSymbol()).setType(ELF::STT_TLS);
+ break;
+ default:
+ break;
+ }
+
if (const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(Fixup.getValue())) {
if (SExpr->getKind() == SparcMCExpr::VK_Sparc_R_DISP32)
return ELF::R_SPARC_DISP32;
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
index 3da19a890e942..54dc68800fade 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
@@ -17,6 +17,7 @@
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCObjectStreamer.h"
#include "llvm/MC/MCSymbolELF.h"
+#include "llvm/MC/MCValue.h"
#include "llvm/Support/Casting.h"
using namespace llvm;
@@ -183,71 +184,11 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::VariantKind Kind) {
bool SparcMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
const MCAssembler *Asm,
const MCFixup *Fixup) const {
- return getSubExpr()->evaluateAsRelocatable(Res, Asm, Fixup);
-}
-
-static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
- switch (Expr->getKind()) {
- case MCExpr::Target:
- llvm_unreachable("Can't handle nested target expr!");
- break;
-
- case MCExpr::Constant:
- break;
-
- case MCExpr::Binary: {
- const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr);
- fixELFSymbolsInTLSFixupsImpl(BE->getLHS(), Asm);
- fixELFSymbolsInTLSFixupsImpl(BE->getRHS(), Asm);
- break;
- }
-
- case MCExpr::SymbolRef: {
- const MCSymbolRefExpr &SymRef = *cast<MCSymbolRefExpr>(Expr);
- cast<MCSymbolELF>(SymRef.getSymbol()).setType(ELF::STT_TLS);
- break;
- }
-
- case MCExpr::Unary:
- fixELFSymbolsInTLSFixupsImpl(cast<MCUnaryExpr>(Expr)->getSubExpr(), Asm);
- break;
- }
-
-}
-
-void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
- switch(getKind()) {
- default: return;
- case VK_Sparc_TLS_GD_CALL:
- case VK_Sparc_TLS_LDM_CALL: {
- // The corresponding relocations reference __tls_get_addr, as they call it,
- // but this is only implicit; we must explicitly add it to our symbol table
- // to bind it for these uses.
- MCSymbol *Symbol = Asm.getContext().getOrCreateSymbol("__tls_get_addr");
- Asm.registerSymbol(*Symbol);
- auto ELFSymbol = cast<MCSymbolELF>(Symbol);
- if (!ELFSymbol->isBindingSet())
- ELFSymbol->setBinding(ELF::STB_GLOBAL);
- [[fallthrough]];
- }
- case VK_Sparc_TLS_GD_HI22:
- case VK_Sparc_TLS_GD_LO10:
- case VK_Sparc_TLS_GD_ADD:
- case VK_Sparc_TLS_LDM_HI22:
- case VK_Sparc_TLS_LDM_LO10:
- case VK_Sparc_TLS_LDM_ADD:
- case VK_Sparc_TLS_LDO_HIX22:
- case VK_Sparc_TLS_LDO_LOX10:
- case VK_Sparc_TLS_LDO_ADD:
- case VK_Sparc_TLS_IE_HI22:
- case VK_Sparc_TLS_IE_LO10:
- case VK_Sparc_TLS_IE_LD:
- case VK_Sparc_TLS_IE_LDX:
- case VK_Sparc_TLS_IE_ADD:
- case VK_Sparc_TLS_LE_HIX22:
- case VK_Sparc_TLS_LE_LOX10: break;
- }
- fixELFSymbolsInTLSFixupsImpl(getSubExpr(), Asm);
+ if (!getSubExpr()->evaluateAsRelocatable(Res, Asm, Fixup))
+ return false;
+ Res =
+ MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind());
+ return true;
}
void SparcMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
index 74f90ae83dc5b..eafad3987ce1c 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
@@ -101,8 +101,6 @@ class SparcMCExpr : public MCTargetExpr {
return getSubExpr()->findAssociatedFragment();
}
- void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
-
static bool classof(const MCExpr *E) {
return E->getKind() == MCExpr::Target;
}
More information about the llvm-commits
mailing list