Skip to content

Commit eea7d32

Browse files
committed
[MC] Move fixSymbolsInTLSFixups to ELFObjectWriter
so that we only need to do it once during recordRelocation. In the future, we should change fixSymbolsInTLSFixups to apply to MCValue instead of MCExpr, similar to GNU assembler.
1 parent e4a0fd5 commit eea7d32

File tree

4 files changed

+92
-100
lines changed

4 files changed

+92
-100
lines changed

llvm/include/llvm/MC/MCELFObjectWriter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ class ELFObjectWriter final : public MCObjectWriter {
189189
bool checkRelocation(MCContext &Ctx, SMLoc Loc, const MCSectionELF *From,
190190
const MCSectionELF *To);
191191

192+
void fixSymbolsInTLSFixups(MCAssembler &Asm, const MCExpr *Expr);
193+
192194
unsigned getELFHeaderEFlags() const { return ELFHeaderEFlags; }
193195
void setELFHeaderEFlags(unsigned Flags) { ELFHeaderEFlags = Flags; }
194196

llvm/include/llvm/MC/MCELFStreamer.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,8 @@ class MCELFStreamer : public MCObjectStreamer {
159159

160160
private:
161161
bool isBundleLocked() const;
162-
void emitInstToFragment(const MCInst &Inst, const MCSubtargetInfo &) override;
163162
void emitInstToData(const MCInst &Inst, const MCSubtargetInfo &) override;
164163

165-
void fixSymbolsInTLSFixups(const MCExpr *expr);
166164
void finalizeCGProfileEntry(const MCSymbolRefExpr *&S, uint64_t Offset);
167165
void finalizeCGProfile();
168166

llvm/lib/MC/ELFObjectWriter.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1468,6 +1468,9 @@ void ELFObjectWriter::recordRelocation(MCAssembler &Asm,
14681468
return;
14691469
}
14701470

1471+
if (Fixup.getValue())
1472+
fixSymbolsInTLSFixups(Asm, Fixup.getValue());
1473+
14711474
const MCSymbolELF *RenamedSymA = SymA;
14721475
if (SymA) {
14731476
if (const MCSymbolELF *R = Renames.lookup(SymA))
@@ -1502,6 +1505,92 @@ bool ELFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
15021505
return &SymA.getSection() == FB.getParent();
15031506
}
15041507

1508+
void ELFObjectWriter::fixSymbolsInTLSFixups(MCAssembler &Asm,
1509+
const MCExpr *expr) {
1510+
switch (expr->getKind()) {
1511+
case MCExpr::Target:
1512+
cast<MCTargetExpr>(expr)->fixELFSymbolsInTLSFixups(Asm);
1513+
break;
1514+
case MCExpr::Constant:
1515+
break;
1516+
1517+
case MCExpr::Binary: {
1518+
const MCBinaryExpr *be = cast<MCBinaryExpr>(expr);
1519+
fixSymbolsInTLSFixups(Asm, be->getLHS());
1520+
fixSymbolsInTLSFixups(Asm, be->getRHS());
1521+
break;
1522+
}
1523+
1524+
case MCExpr::SymbolRef: {
1525+
const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr);
1526+
switch (symRef.getKind()) {
1527+
default:
1528+
return;
1529+
case MCSymbolRefExpr::VK_GOTTPOFF:
1530+
case MCSymbolRefExpr::VK_INDNTPOFF:
1531+
case MCSymbolRefExpr::VK_NTPOFF:
1532+
case MCSymbolRefExpr::VK_GOTNTPOFF:
1533+
case MCSymbolRefExpr::VK_TLSCALL:
1534+
case MCSymbolRefExpr::VK_TLSDESC:
1535+
case MCSymbolRefExpr::VK_TLSGD:
1536+
case MCSymbolRefExpr::VK_TLSLD:
1537+
case MCSymbolRefExpr::VK_TLSLDM:
1538+
case MCSymbolRefExpr::VK_TPOFF:
1539+
case MCSymbolRefExpr::VK_TPREL:
1540+
case MCSymbolRefExpr::VK_DTPOFF:
1541+
case MCSymbolRefExpr::VK_DTPREL:
1542+
case MCSymbolRefExpr::VK_PPC_DTPMOD:
1543+
case MCSymbolRefExpr::VK_PPC_TPREL_LO:
1544+
case MCSymbolRefExpr::VK_PPC_TPREL_HI:
1545+
case MCSymbolRefExpr::VK_PPC_TPREL_HA:
1546+
case MCSymbolRefExpr::VK_PPC_TPREL_HIGH:
1547+
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHA:
1548+
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER:
1549+
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA:
1550+
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST:
1551+
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA:
1552+
case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
1553+
case MCSymbolRefExpr::VK_PPC_DTPREL_HI:
1554+
case MCSymbolRefExpr::VK_PPC_DTPREL_HA:
1555+
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGH:
1556+
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHA:
1557+
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER:
1558+
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA:
1559+
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST:
1560+
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA:
1561+
case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
1562+
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
1563+
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI:
1564+
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA:
1565+
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_PCREL:
1566+
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
1567+
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
1568+
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI:
1569+
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA:
1570+
case MCSymbolRefExpr::VK_PPC_TLS:
1571+
case MCSymbolRefExpr::VK_PPC_TLS_PCREL:
1572+
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD:
1573+
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO:
1574+
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI:
1575+
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA:
1576+
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_PCREL:
1577+
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD:
1578+
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO:
1579+
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI:
1580+
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA:
1581+
break;
1582+
}
1583+
Asm.registerSymbol(symRef.getSymbol());
1584+
cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS);
1585+
break;
1586+
}
1587+
1588+
case MCExpr::Unary:
1589+
fixSymbolsInTLSFixups(Asm, cast<MCUnaryExpr>(expr)->getSubExpr());
1590+
break;
1591+
}
1592+
}
1593+
15051594
uint64_t ELFObjectWriter::writeObject(MCAssembler &Asm) {
15061595
uint64_t Size =
15071596
ELFWriter(*this, OS, IsLittleEndian,

llvm/lib/MC/MCELFStreamer.cpp

Lines changed: 1 addition & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,6 @@ void MCELFStreamer::emitValueImpl(const MCExpr *Value, unsigned Size,
318318
SMLoc Loc) {
319319
if (isBundleLocked())
320320
report_fatal_error("Emitting values inside a locked bundle is forbidden");
321-
fixSymbolsInTLSFixups(Value);
322321
MCObjectStreamer::emitValueImpl(Value, Size, Loc);
323322
}
324323

@@ -351,91 +350,6 @@ void MCELFStreamer::emitIdent(StringRef IdentString) {
351350
popSection();
352351
}
353352

354-
void MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
355-
switch (expr->getKind()) {
356-
case MCExpr::Target:
357-
cast<MCTargetExpr>(expr)->fixELFSymbolsInTLSFixups(getAssembler());
358-
break;
359-
case MCExpr::Constant:
360-
break;
361-
362-
case MCExpr::Binary: {
363-
const MCBinaryExpr *be = cast<MCBinaryExpr>(expr);
364-
fixSymbolsInTLSFixups(be->getLHS());
365-
fixSymbolsInTLSFixups(be->getRHS());
366-
break;
367-
}
368-
369-
case MCExpr::SymbolRef: {
370-
const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr);
371-
switch (symRef.getKind()) {
372-
default:
373-
return;
374-
case MCSymbolRefExpr::VK_GOTTPOFF:
375-
case MCSymbolRefExpr::VK_INDNTPOFF:
376-
case MCSymbolRefExpr::VK_NTPOFF:
377-
case MCSymbolRefExpr::VK_GOTNTPOFF:
378-
case MCSymbolRefExpr::VK_TLSCALL:
379-
case MCSymbolRefExpr::VK_TLSDESC:
380-
case MCSymbolRefExpr::VK_TLSGD:
381-
case MCSymbolRefExpr::VK_TLSLD:
382-
case MCSymbolRefExpr::VK_TLSLDM:
383-
case MCSymbolRefExpr::VK_TPOFF:
384-
case MCSymbolRefExpr::VK_TPREL:
385-
case MCSymbolRefExpr::VK_DTPOFF:
386-
case MCSymbolRefExpr::VK_DTPREL:
387-
case MCSymbolRefExpr::VK_PPC_DTPMOD:
388-
case MCSymbolRefExpr::VK_PPC_TPREL_LO:
389-
case MCSymbolRefExpr::VK_PPC_TPREL_HI:
390-
case MCSymbolRefExpr::VK_PPC_TPREL_HA:
391-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGH:
392-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHA:
393-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER:
394-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA:
395-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST:
396-
case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA:
397-
case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
398-
case MCSymbolRefExpr::VK_PPC_DTPREL_HI:
399-
case MCSymbolRefExpr::VK_PPC_DTPREL_HA:
400-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGH:
401-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHA:
402-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER:
403-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA:
404-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST:
405-
case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA:
406-
case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
407-
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
408-
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI:
409-
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA:
410-
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_PCREL:
411-
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
412-
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
413-
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI:
414-
case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA:
415-
case MCSymbolRefExpr::VK_PPC_TLS:
416-
case MCSymbolRefExpr::VK_PPC_TLS_PCREL:
417-
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD:
418-
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO:
419-
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI:
420-
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA:
421-
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_PCREL:
422-
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD:
423-
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO:
424-
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI:
425-
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA:
426-
break;
427-
}
428-
getAssembler().registerSymbol(symRef.getSymbol());
429-
cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS);
430-
break;
431-
}
432-
433-
case MCExpr::Unary:
434-
fixSymbolsInTLSFixups(cast<MCUnaryExpr>(expr)->getSubExpr());
435-
break;
436-
}
437-
}
438-
439353
void MCELFStreamer::finalizeCGProfileEntry(const MCSymbolRefExpr *&SRE,
440354
uint64_t Offset) {
441355
const MCSymbol *S = &SRE->getSymbol();
@@ -478,15 +392,6 @@ void MCELFStreamer::finalizeCGProfile() {
478392
popSection();
479393
}
480394

481-
void MCELFStreamer::emitInstToFragment(const MCInst &Inst,
482-
const MCSubtargetInfo &STI) {
483-
this->MCObjectStreamer::emitInstToFragment(Inst, STI);
484-
MCRelaxableFragment &F = *cast<MCRelaxableFragment>(getCurrentFragment());
485-
486-
for (auto &Fixup : F.getFixups())
487-
fixSymbolsInTLSFixups(Fixup.getValue());
488-
}
489-
490395
// A fragment can only have one Subtarget, and when bundling is enabled we
491396
// sometimes need to use the same fragment. We give an error if there
492397
// are conflicting Subtargets.
@@ -548,10 +453,8 @@ void MCELFStreamer::emitInstToData(const MCInst &Inst,
548453
DF->getFixups(), STI);
549454

550455
auto Fixups = MutableArrayRef(DF->getFixups()).slice(FixupStartIndex);
551-
for (auto &Fixup : Fixups) {
456+
for (auto &Fixup : Fixups)
552457
Fixup.setOffset(Fixup.getOffset() + CodeOffset);
553-
fixSymbolsInTLSFixups(Fixup.getValue());
554-
}
555458

556459
DF->setHasInstructions(STI);
557460
if (!Fixups.empty() && Fixups.back().getTargetKind() ==

0 commit comments

Comments
 (0)