Skip to content

Commit 0a0f691

Browse files
committed
[Hexagon] Move STT_TLS setting from fixELFSymbolsInTLSFixups to getRelocType
The legacy generic code uses `ELFObjectWriter::fixSymbolsInTLSFixups` to set `STT_TLS` (and use an unnecessary expression walk). The better way is to do this in `getRelocType`, which I have done for AArch64, PowerPC, RISC-V, and X86.
1 parent 8ec96cc commit 0a0f691

File tree

3 files changed

+14
-43
lines changed

3 files changed

+14
-43
lines changed

llvm/lib/Target/Hexagon/MCTargetDesc/HexagonELFObjectWriter.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,20 @@ unsigned HexagonELFObjectWriter::getRelocType(MCContext &Ctx,
4343
MCFixup const &Fixup,
4444
bool IsPCRel) const {
4545
auto Variant = HexagonMCExpr::VariantKind(Target.getAccessVariant());
46+
switch (Variant) {
47+
case HexagonMCExpr::VK_GD_GOT:
48+
case HexagonMCExpr::VK_LD_GOT:
49+
case HexagonMCExpr::VK_GD_PLT:
50+
case HexagonMCExpr::VK_LD_PLT:
51+
case HexagonMCExpr::VK_IE:
52+
case HexagonMCExpr::VK_IE_GOT:
53+
case HexagonMCExpr::VK_TPREL:
54+
if (auto *S = Target.getSymA())
55+
cast<MCSymbolELF>(S->getSymbol()).setType(ELF::STT_TLS);
56+
break;
57+
default:
58+
break;
59+
}
4660
switch (Fixup.getTargetKind()) {
4761
default:
4862
report_fatal_error("Unrecognized relocation type");

llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.cpp

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -37,48 +37,6 @@ MCFragment *llvm::HexagonMCExpr::findAssociatedFragment() const {
3737
return Expr->findAssociatedFragment();
3838
}
3939

40-
static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
41-
switch (Expr->getKind()) {
42-
case MCExpr::Target:
43-
llvm_unreachable("Cannot handle nested target MCExpr");
44-
break;
45-
case MCExpr::Constant:
46-
break;
47-
48-
case MCExpr::Binary: {
49-
const MCBinaryExpr *be = cast<MCBinaryExpr>(Expr);
50-
fixELFSymbolsInTLSFixupsImpl(be->getLHS(), Asm);
51-
fixELFSymbolsInTLSFixupsImpl(be->getRHS(), Asm);
52-
break;
53-
}
54-
case MCExpr::SymbolRef: {
55-
const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(Expr);
56-
switch (getVariantKind(&symRef)) {
57-
default:
58-
return;
59-
case HexagonMCExpr::VK_GD_GOT:
60-
case HexagonMCExpr::VK_LD_GOT:
61-
case HexagonMCExpr::VK_GD_PLT:
62-
case HexagonMCExpr::VK_LD_PLT:
63-
case HexagonMCExpr::VK_IE:
64-
case HexagonMCExpr::VK_IE_GOT:
65-
case HexagonMCExpr::VK_TPREL:
66-
break;
67-
}
68-
cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS);
69-
break;
70-
}
71-
case MCExpr::Unary:
72-
fixELFSymbolsInTLSFixupsImpl(cast<MCUnaryExpr>(Expr)->getSubExpr(), Asm);
73-
break;
74-
}
75-
}
76-
77-
void HexagonMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
78-
auto expr = getExpr();
79-
fixELFSymbolsInTLSFixupsImpl(expr, Asm);
80-
}
81-
8240
MCExpr const *HexagonMCExpr::getExpr() const { return Expr; }
8341

8442
void HexagonMCExpr::setMustExtend(bool Val) {

llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ class HexagonMCExpr : public MCTargetExpr {
4141
const MCAssembler *Asm) const override;
4242
void visitUsedExpr(MCStreamer &Streamer) const override;
4343
MCFragment *findAssociatedFragment() const override;
44-
void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
4544
MCExpr const *getExpr() const;
4645
void setMustExtend(bool Val = true);
4746
bool mustExtend() const;

0 commit comments

Comments
 (0)