Skip to content

Commit 5ae8f25

Browse files
committed
[RISCV] 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.
1 parent a1a29c3 commit 5ae8f25

File tree

3 files changed

+11
-45
lines changed

3 files changed

+11
-45
lines changed

llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,17 @@ unsigned RISCVELFObjectWriter::getRelocType(MCContext &Ctx,
5555
unsigned Kind = Fixup.getTargetKind();
5656
if (Kind >= FirstLiteralRelocationKind)
5757
return Kind - FirstLiteralRelocationKind;
58+
59+
switch (Target.getRefKind()) {
60+
case RISCVMCExpr::VK_RISCV_TPREL_HI:
61+
case RISCVMCExpr::VK_RISCV_TLS_GOT_HI:
62+
case RISCVMCExpr::VK_RISCV_TLS_GD_HI:
63+
case RISCVMCExpr::VK_RISCV_TLSDESC_HI:
64+
if (auto *S = Target.getSymA())
65+
cast<MCSymbolELF>(S->getSymbol()).setType(ELF::STT_TLS);
66+
break;
67+
}
68+
5869
if (IsPCRel) {
5970
switch (Kind) {
6071
default:

llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -169,49 +169,6 @@ StringRef RISCVMCExpr::getVariantKindName(VariantKind Kind) {
169169
llvm_unreachable("Invalid ELF symbol kind");
170170
}
171171

172-
static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
173-
switch (Expr->getKind()) {
174-
case MCExpr::Target:
175-
llvm_unreachable("Can't handle nested target expression");
176-
break;
177-
case MCExpr::Constant:
178-
break;
179-
180-
case MCExpr::Binary: {
181-
const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr);
182-
fixELFSymbolsInTLSFixupsImpl(BE->getLHS(), Asm);
183-
fixELFSymbolsInTLSFixupsImpl(BE->getRHS(), Asm);
184-
break;
185-
}
186-
187-
case MCExpr::SymbolRef: {
188-
// We're known to be under a TLS fixup, so any symbol should be
189-
// modified. There should be only one.
190-
const MCSymbolRefExpr &SymRef = *cast<MCSymbolRefExpr>(Expr);
191-
cast<MCSymbolELF>(SymRef.getSymbol()).setType(ELF::STT_TLS);
192-
break;
193-
}
194-
195-
case MCExpr::Unary:
196-
fixELFSymbolsInTLSFixupsImpl(cast<MCUnaryExpr>(Expr)->getSubExpr(), Asm);
197-
break;
198-
}
199-
}
200-
201-
void RISCVMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
202-
switch (getKind()) {
203-
default:
204-
return;
205-
case VK_RISCV_TPREL_HI:
206-
case VK_RISCV_TLS_GOT_HI:
207-
case VK_RISCV_TLS_GD_HI:
208-
case VK_RISCV_TLSDESC_HI:
209-
break;
210-
}
211-
212-
fixELFSymbolsInTLSFixupsImpl(getSubExpr(), Asm);
213-
}
214-
215172
bool RISCVMCExpr::evaluateAsConstant(int64_t &Res) const {
216173
MCValue Value;
217174
if (Kind != VK_RISCV_LO && Kind != VK_RISCV_HI)

llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.h

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

79-
void fixELFSymbolsInTLSFixups(MCAssembler &Asm) const override;
80-
8179
bool evaluateAsConstant(int64_t &Res) const;
8280

8381
static bool classof(const MCExpr *E) {

0 commit comments

Comments
 (0)