Skip to content

Commit 75f5a4f

Browse files
committed
[VE] 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 0a0f691 commit 75f5a4f

File tree

3 files changed

+12
-45
lines changed

3 files changed

+12
-45
lines changed

llvm/lib/Target/VE/MCTargetDesc/VEELFObjectWriter.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#include "MCTargetDesc/VEMCExpr.h"
910
#include "VEFixupKinds.h"
1011
#include "VEMCExpr.h"
1112
#include "VEMCTargetDesc.h"
@@ -39,6 +40,17 @@ class VEELFObjectWriter : public MCELFObjectTargetWriter {
3940
unsigned VEELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
4041
const MCFixup &Fixup,
4142
bool IsPCRel) const {
43+
switch (Target.getRefKind()) {
44+
case VEMCExpr::VK_TLS_GD_HI32:
45+
case VEMCExpr::VK_TLS_GD_LO32:
46+
case VEMCExpr::VK_TPOFF_HI32:
47+
case VEMCExpr::VK_TPOFF_LO32:
48+
if (auto *S = Target.getSymA())
49+
cast<MCSymbolELF>(S->getSymbol()).setType(ELF::STT_TLS);
50+
break;
51+
default:
52+
break;
53+
}
4254
if (const VEMCExpr *SExpr = dyn_cast<VEMCExpr>(Fixup.getValue())) {
4355
if (SExpr->getSpecifier() == VEMCExpr::VK_PC_LO32)
4456
return ELF::R_VE_PC_LO32;

llvm/lib/Target/VE/MCTargetDesc/VEMCExpr.cpp

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -86,49 +86,6 @@ bool VEMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
8686
return true;
8787
}
8888

89-
static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
90-
switch (Expr->getKind()) {
91-
case MCExpr::Target:
92-
llvm_unreachable("Can't handle nested target expr!");
93-
break;
94-
95-
case MCExpr::Constant:
96-
break;
97-
98-
case MCExpr::Binary: {
99-
const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr);
100-
fixELFSymbolsInTLSFixupsImpl(BE->getLHS(), Asm);
101-
fixELFSymbolsInTLSFixupsImpl(BE->getRHS(), Asm);
102-
break;
103-
}
104-
105-
case MCExpr::SymbolRef: {
106-
// We're known to be under a TLS fixup, so any symbol should be
107-
// modified. There should be only one.
108-
const MCSymbolRefExpr &SymRef = *cast<MCSymbolRefExpr>(Expr);
109-
cast<MCSymbolELF>(SymRef.getSymbol()).setType(ELF::STT_TLS);
110-
break;
111-
}
112-
113-
case MCExpr::Unary:
114-
fixELFSymbolsInTLSFixupsImpl(cast<MCUnaryExpr>(Expr)->getSubExpr(), Asm);
115-
break;
116-
}
117-
}
118-
11989
void VEMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
12090
Streamer.visitUsedExpr(*getSubExpr());
12191
}
122-
123-
void VEMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
124-
switch (getSpecifier()) {
125-
default:
126-
return;
127-
case VK_TLS_GD_HI32:
128-
case VK_TLS_GD_LO32:
129-
case VK_TPOFF_HI32:
130-
case VK_TPOFF_LO32:
131-
break;
132-
}
133-
fixELFSymbolsInTLSFixupsImpl(getSubExpr(), Asm);
134-
}

llvm/lib/Target/VE/MCTargetDesc/VEMCExpr.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,6 @@ class VEMCExpr : public MCTargetExpr {
7777
return getSubExpr()->findAssociatedFragment();
7878
}
7979

80-
void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
81-
8280
static bool classof(const MCExpr *E) {
8381
return E->getKind() == MCExpr::Target;
8482
}

0 commit comments

Comments
 (0)