Skip to content

Commit 911953a

Browse files
committed
[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.
1 parent f4ea105 commit 911953a

File tree

3 files changed

+30
-67
lines changed

3 files changed

+30
-67
lines changed

llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,30 @@ unsigned SparcELFObjectWriter::getRelocType(MCContext &Ctx,
4646
if (Kind >= FirstLiteralRelocationKind)
4747
return Kind - FirstLiteralRelocationKind;
4848

49+
switch (Target.getRefKind()) {
50+
case SparcMCExpr::VK_Sparc_TLS_GD_HI22:
51+
case SparcMCExpr::VK_Sparc_TLS_GD_LO10:
52+
case SparcMCExpr::VK_Sparc_TLS_GD_ADD:
53+
case SparcMCExpr::VK_Sparc_TLS_LDM_HI22:
54+
case SparcMCExpr::VK_Sparc_TLS_LDM_LO10:
55+
case SparcMCExpr::VK_Sparc_TLS_LDM_ADD:
56+
case SparcMCExpr::VK_Sparc_TLS_LDO_HIX22:
57+
case SparcMCExpr::VK_Sparc_TLS_LDO_LOX10:
58+
case SparcMCExpr::VK_Sparc_TLS_LDO_ADD:
59+
case SparcMCExpr::VK_Sparc_TLS_IE_HI22:
60+
case SparcMCExpr::VK_Sparc_TLS_IE_LO10:
61+
case SparcMCExpr::VK_Sparc_TLS_IE_LD:
62+
case SparcMCExpr::VK_Sparc_TLS_IE_LDX:
63+
case SparcMCExpr::VK_Sparc_TLS_IE_ADD:
64+
case SparcMCExpr::VK_Sparc_TLS_LE_HIX22:
65+
case SparcMCExpr::VK_Sparc_TLS_LE_LOX10:
66+
if (auto *S = Target.getSymA())
67+
cast<MCSymbolELF>(S->getSymbol()).setType(ELF::STT_TLS);
68+
break;
69+
default:
70+
break;
71+
}
72+
4973
if (const SparcMCExpr *SExpr = dyn_cast<SparcMCExpr>(Fixup.getValue())) {
5074
if (SExpr->getKind() == SparcMCExpr::VK_Sparc_R_DISP32)
5175
return ELF::R_SPARC_DISP32;

llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp

Lines changed: 6 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "llvm/MC/MCContext.h"
1818
#include "llvm/MC/MCObjectStreamer.h"
1919
#include "llvm/MC/MCSymbolELF.h"
20+
#include "llvm/MC/MCValue.h"
2021
#include "llvm/Support/Casting.h"
2122

2223
using namespace llvm;
@@ -183,71 +184,11 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::VariantKind Kind) {
183184
bool SparcMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
184185
const MCAssembler *Asm,
185186
const MCFixup *Fixup) const {
186-
return getSubExpr()->evaluateAsRelocatable(Res, Asm, Fixup);
187-
}
188-
189-
static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
190-
switch (Expr->getKind()) {
191-
case MCExpr::Target:
192-
llvm_unreachable("Can't handle nested target expr!");
193-
break;
194-
195-
case MCExpr::Constant:
196-
break;
197-
198-
case MCExpr::Binary: {
199-
const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr);
200-
fixELFSymbolsInTLSFixupsImpl(BE->getLHS(), Asm);
201-
fixELFSymbolsInTLSFixupsImpl(BE->getRHS(), Asm);
202-
break;
203-
}
204-
205-
case MCExpr::SymbolRef: {
206-
const MCSymbolRefExpr &SymRef = *cast<MCSymbolRefExpr>(Expr);
207-
cast<MCSymbolELF>(SymRef.getSymbol()).setType(ELF::STT_TLS);
208-
break;
209-
}
210-
211-
case MCExpr::Unary:
212-
fixELFSymbolsInTLSFixupsImpl(cast<MCUnaryExpr>(Expr)->getSubExpr(), Asm);
213-
break;
214-
}
215-
216-
}
217-
218-
void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
219-
switch(getKind()) {
220-
default: return;
221-
case VK_Sparc_TLS_GD_CALL:
222-
case VK_Sparc_TLS_LDM_CALL: {
223-
// The corresponding relocations reference __tls_get_addr, as they call it,
224-
// but this is only implicit; we must explicitly add it to our symbol table
225-
// to bind it for these uses.
226-
MCSymbol *Symbol = Asm.getContext().getOrCreateSymbol("__tls_get_addr");
227-
Asm.registerSymbol(*Symbol);
228-
auto ELFSymbol = cast<MCSymbolELF>(Symbol);
229-
if (!ELFSymbol->isBindingSet())
230-
ELFSymbol->setBinding(ELF::STB_GLOBAL);
231-
[[fallthrough]];
232-
}
233-
case VK_Sparc_TLS_GD_HI22:
234-
case VK_Sparc_TLS_GD_LO10:
235-
case VK_Sparc_TLS_GD_ADD:
236-
case VK_Sparc_TLS_LDM_HI22:
237-
case VK_Sparc_TLS_LDM_LO10:
238-
case VK_Sparc_TLS_LDM_ADD:
239-
case VK_Sparc_TLS_LDO_HIX22:
240-
case VK_Sparc_TLS_LDO_LOX10:
241-
case VK_Sparc_TLS_LDO_ADD:
242-
case VK_Sparc_TLS_IE_HI22:
243-
case VK_Sparc_TLS_IE_LO10:
244-
case VK_Sparc_TLS_IE_LD:
245-
case VK_Sparc_TLS_IE_LDX:
246-
case VK_Sparc_TLS_IE_ADD:
247-
case VK_Sparc_TLS_LE_HIX22:
248-
case VK_Sparc_TLS_LE_LOX10: break;
249-
}
250-
fixELFSymbolsInTLSFixupsImpl(getSubExpr(), Asm);
187+
if (!getSubExpr()->evaluateAsRelocatable(Res, Asm, Fixup))
188+
return false;
189+
Res =
190+
MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind());
191+
return true;
251192
}
252193

253194
void SparcMCExpr::visitUsedExpr(MCStreamer &Streamer) const {

llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,6 @@ class SparcMCExpr : public MCTargetExpr {
101101
return getSubExpr()->findAssociatedFragment();
102102
}
103103

104-
void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
105-
106104
static bool classof(const MCExpr *E) {
107105
return E->getKind() == MCExpr::Target;
108106
}

0 commit comments

Comments
 (0)