summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2021-12-14 09:52:43 -0800
committerFangrui Song <i@maskray.me>2021-12-14 09:52:43 -0800
commitb79686c6dcc8dbc478399acaf9cc673531181b65 (patch)
tree224b115e5f71b8b693db234e4875f61c3d3eaa6c
parentdf44aaa50e3632f3528850278bdec1c4a45890b1 (diff)
downloadllvm-b79686c6dcc8dbc478399acaf9cc673531181b65.tar.gz
[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
-rw-r--r--lld/ELF/Arch/AArch64.cpp4
-rw-r--r--lld/ELF/MapFile.cpp2
-rw-r--r--lld/ELF/Relocations.cpp2
-rw-r--r--lld/ELF/Symbols.cpp2
-rw-r--r--lld/ELF/Symbols.h13
-rw-r--r--lld/ELF/SyntheticSections.cpp7
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<Defined *> getSymbols() {
for (Symbol *b : file->getSymbols())
if (auto *dr = dyn_cast<Defined>(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<Defined>(sym).value = in.plt->headerSize;
@@ -1633,7 +1634,6 @@ void elf::postScanRelocations() {
cast<PPC32GlinkSection>(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<Defined>(sym) || sym->needsPltAddr)
+ assert(!(sym->needsCopy && sym->isObject()));
+ if (!isa<Defined>(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 <class ELFT> void SymbolTableSection<ELFT>::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 <class ELFT> void SymbolTableSection<ELFT>::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;