From b79686c6dcc8dbc478399acaf9cc673531181b65 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Tue, 14 Dec 2021 09:52:43 -0800 Subject: [ELF] Remove needsPltAddr in favor of needsCopy needsPltAddr is equivalent to `needsCopy && isFunc`. In many places, it is equivalent to `needsCopy` because the non-STT_FUNC cases are ruled out. Reviewed By: ikudrin, peter.smith Differential Revision: https://reviews.llvm.org/D115603 --- lld/ELF/Arch/AArch64.cpp | 4 ++-- lld/ELF/MapFile.cpp | 2 +- lld/ELF/Relocations.cpp | 2 +- lld/ELF/Symbols.cpp | 2 +- lld/ELF/Symbols.h | 13 ++++--------- lld/ELF/SyntheticSections.cpp | 7 ++++--- 6 files changed, 13 insertions(+), 17 deletions(-) diff --git a/lld/ELF/Arch/AArch64.cpp b/lld/ELF/Arch/AArch64.cpp index b57fd61b65cc..ca3a6aa58dc5 100644 --- a/lld/ELF/Arch/AArch64.cpp +++ b/lld/ELF/Arch/AArch64.cpp @@ -690,11 +690,11 @@ void AArch64BtiPac::writePlt(uint8_t *buf, const Symbol &sym, }; const uint8_t nopData[] = { 0x1f, 0x20, 0x03, 0xd5 }; // nop - // needsPltAddr indicates a non-ifunc canonical PLT entry whose address may + // needsCopy indicates a non-ifunc canonical PLT entry whose address may // escape to shared objects. isInIplt indicates a non-preemptible ifunc. Its // address may escape if referenced by a direct relocation. The condition is // conservative. - bool hasBti = btiHeader && (sym.needsPltAddr || sym.isInIplt); + bool hasBti = btiHeader && (sym.needsCopy || sym.isInIplt); if (hasBti) { memcpy(buf, btiData, sizeof(btiData)); buf += sizeof(btiData); diff --git a/lld/ELF/MapFile.cpp b/lld/ELF/MapFile.cpp index 06735802f7f1..cefe8a235b48 100644 --- a/lld/ELF/MapFile.cpp +++ b/lld/ELF/MapFile.cpp @@ -58,7 +58,7 @@ static std::vector getSymbols() { for (Symbol *b : file->getSymbols()) if (auto *dr = dyn_cast(b)) if (!dr->isSection() && dr->section && dr->section->isLive() && - (dr->file == file || dr->needsPltAddr || dr->section->bss)) + (dr->file == file || dr->needsCopy || dr->section->bss)) v.push_back(dr); return v; } diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index 097ece9092a6..fe1e7bfdc350 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -1626,6 +1626,7 @@ void elf::postScanRelocations() { replaceWithDefined( sym, in.plt, target->pltHeaderSize + target->pltEntrySize * sym.pltIndex, 0); + sym.needsCopy = true; if (config->emachine == EM_PPC) { // PPC32 canonical PLT entries are at the beginning of .glink cast(sym).value = in.plt->headerSize; @@ -1633,7 +1634,6 @@ void elf::postScanRelocations() { cast(in.plt)->canonical_plts.push_back(&sym); } } - sym.needsPltAddr = true; } } }; diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index c1bfb6653c88..01a3598f8d60 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -120,7 +120,7 @@ static uint64_t getSymVA(const Symbol &sym, int64_t addend) { // field etc) do the same trick as compiler uses to mark microMIPS // for CPU - set the less-significant bit. if (config->emachine == EM_MIPS && isMicroMips() && - ((sym.stOther & STO_MIPS_MICROMIPS) || sym.needsPltAddr)) + ((sym.stOther & STO_MIPS_MICROMIPS) || sym.needsCopy)) va |= 1; if (d.isTls() && !config->relocatable) { diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index c2fb1d895e01..e7b4ca0a2be7 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -245,17 +245,12 @@ protected: type(type), stOther(stOther), symbolKind(k), visibility(stOther & 3), isUsedInRegularObj(!file || file->kind() == InputFile::ObjKind), exportDynamic(isExportDynamic(k, visibility)), inDynamicList(false), - canInline(false), referenced(false), traced(false), needsPltAddr(false), - isInIplt(false), gotInIgot(false), isPreemptible(false), - used(!config->gcSections), needsTocRestore(false), scriptDefined(false), - needsCopy(false), needsGot(false), needsPlt(false), - hasDirectReloc(false) {} + canInline(false), referenced(false), traced(false), isInIplt(false), + gotInIgot(false), isPreemptible(false), used(!config->gcSections), + needsTocRestore(false), scriptDefined(false), needsCopy(false), + needsGot(false), needsPlt(false), hasDirectReloc(false) {} public: - // True the symbol should point to its PLT entry. - // For SharedSymbol only. - uint8_t needsPltAddr : 1; - // True if this symbol is in the Iplt sub-section of the Plt and the Igot // sub-section of the .got.plt or .got. uint8_t isInIplt : 1; diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index bcb521a47a4a..5982f9054425 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -2175,7 +2175,8 @@ static BssSection *getCommonSec(Symbol *sym) { static uint32_t getSymSectionIndex(Symbol *sym) { if (getCommonSec(sym)) return SHN_COMMON; - if (!isa(sym) || sym->needsPltAddr) + assert(!(sym->needsCopy && sym->isObject())); + if (!isa(sym) || sym->needsCopy) return SHN_UNDEF; if (const OutputSection *os = sym->getOutputSection()) return os->sectionIndex >= SHN_LORESERVE ? (uint32_t)SHN_XINDEX @@ -2250,7 +2251,7 @@ template void SymbolTableSection::writeTo(uint8_t *buf) { for (SymbolTableEntry &ent : symbols) { Symbol *sym = ent.sym; - if (sym->isInPlt() && sym->needsPltAddr) + if (sym->isInPlt() && sym->needsCopy) eSym->st_other |= STO_MIPS_PLT; if (isMicroMips()) { // We already set the less-significant bit for symbols @@ -2261,7 +2262,7 @@ template void SymbolTableSection::writeTo(uint8_t *buf) { // like `objdump` will be able to deal with a correct // symbol position. if (sym->isDefined() && - ((sym->stOther & STO_MIPS_MICROMIPS) || sym->needsPltAddr)) { + ((sym->stOther & STO_MIPS_MICROMIPS) || sym->needsCopy)) { if (!strTabSec.isDynamic()) eSym->st_value &= ~1; eSym->st_other |= STO_MIPS_MICROMIPS; -- cgit v1.2.1