[lld] 682925e - [ELF] Pass Ctx & to Partition
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 15 22:58:13 PDT 2024
Author: Fangrui Song
Date: 2024-10-15T22:58:07-07:00
New Revision: 682925ef43902282173dd9e27cc4a5cc7b794821
URL: https://github.com/llvm/llvm-project/commit/682925ef43902282173dd9e27cc4a5cc7b794821
DIFF: https://github.com/llvm/llvm-project/commit/682925ef43902282173dd9e27cc4a5cc7b794821.diff
LOG: [ELF] Pass Ctx & to Partition
Added:
Modified:
lld/ELF/Driver.cpp
lld/ELF/InputSection.h
lld/ELF/Relocations.cpp
lld/ELF/SyntheticSections.cpp
lld/ELF/SyntheticSections.h
lld/ELF/Writer.cpp
Removed:
################################################################################
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index afacbbfe9099cc..fb77e67e9fc5ca 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -2471,7 +2471,7 @@ static void readSymbolPartitionSection(Ctx &ctx, InputSectionBase *s) {
StringRef partName = reinterpret_cast<const char *>(s->content().data());
for (Partition &part : ctx.partitions) {
if (part.name == partName) {
- sym->partition = part.getNumber();
+ sym->partition = part.getNumber(ctx);
return;
}
}
@@ -2500,7 +2500,7 @@ static void readSymbolPartitionSection(Ctx &ctx, InputSectionBase *s) {
ctx.partitions.emplace_back(ctx);
Partition &newPart = ctx.partitions.back();
newPart.name = partName;
- sym->partition = newPart.getNumber();
+ sym->partition = newPart.getNumber(ctx);
}
static void markBuffersAsDontNeed(Ctx &ctx, bool skipLinkedOutput) {
diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h
index 1a5bc629d8b093..dfcc7c8bc852a9 100644
--- a/lld/ELF/InputSection.h
+++ b/lld/ELF/InputSection.h
@@ -89,7 +89,7 @@ class SectionBase {
// The 1-indexed partition that this section is assigned to by the garbage
// collector, or 0 if this section is dead. Normally there is only one
// partition, so this will either be 0 or 1.
- elf::Partition &getPartition() const;
+ elf::Partition &getPartition(Ctx &) const;
// These corresponds to the fields in Elf_Shdr.
uint64_t flags;
diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp
index 73c19c8385a824..0188d658f9210e 100644
--- a/lld/ELF/Relocations.cpp
+++ b/lld/ELF/Relocations.cpp
@@ -878,7 +878,7 @@ template <bool shard = false>
static void addRelativeReloc(Ctx &ctx, InputSectionBase &isec,
uint64_t offsetInSec, Symbol &sym, int64_t addend,
RelExpr expr, RelType type) {
- Partition &part = isec.getPartition();
+ Partition &part = isec.getPartition(ctx);
if (sym.isTagged()) {
std::lock_guard<std::mutex> lock(relocMutex);
@@ -1159,7 +1159,7 @@ void RelocationScanner::processAux(RelExpr expr, RelType type, uint64_t offset,
if (ctx.arg.emachine == EM_MIPS && rel == ctx.target->symbolicRel)
rel = ctx.target->relativeRel;
std::lock_guard<std::mutex> lock(relocMutex);
- Partition &part = sec->getPartition();
+ Partition &part = sec->getPartition(ctx);
if (ctx.arg.emachine == EM_AARCH64 && type == R_AARCH64_AUTH_ABS64) {
// For a preemptible symbol, we can't use a relative relocation. For an
// undefined symbol, we can't compute offset at link-time and use a
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index d99aeac50ca5ce..e18e7a32df86c7 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -563,7 +563,7 @@ SmallVector<EhFrameSection::FdeData, 0> EhFrameSection::getFdeData() const {
uint8_t *buf = ctx.bufferStart + getParent()->offset + outSecOff;
SmallVector<FdeData, 0> ret;
- uint64_t va = getPartition().ehFrameHdr->getVA();
+ uint64_t va = getPartition(ctx).ehFrameHdr->getVA();
for (CieRecord *rec : cieRecords) {
uint8_t enc = getFdeEncoding(rec->cie);
for (EhSectionPiece *fde : rec->fdes) {
@@ -650,8 +650,8 @@ void EhFrameSection::writeTo(uint8_t *buf) {
for (EhInputSection *s : sections)
ctx.target->relocateAlloc(*s, buf);
- if (getPartition().ehFrameHdr && getPartition().ehFrameHdr->getParent())
- getPartition().ehFrameHdr->write();
+ if (getPartition(ctx).ehFrameHdr && getPartition(ctx).ehFrameHdr->getParent())
+ getPartition(ctx).ehFrameHdr->write();
}
GotSection::GotSection(Ctx &ctx)
@@ -1325,7 +1325,7 @@ static uint64_t addPltRelSz(Ctx &ctx) { return ctx.in.relaPlt->getSize(); }
template <class ELFT>
std::vector<std::pair<int32_t, uint64_t>>
DynamicSection<ELFT>::computeContents() {
- elf::Partition &part = getPartition();
+ elf::Partition &part = getPartition(ctx);
bool isMain = part.name.empty();
std::vector<std::pair<int32_t, uint64_t>> entries;
@@ -1586,7 +1586,7 @@ DynamicSection<ELFT>::computeContents() {
}
template <class ELFT> void DynamicSection<ELFT>::finalizeContents() {
- if (OutputSection *sec = getPartition().dynStrTab->getParent())
+ if (OutputSection *sec = getPartition(ctx).dynStrTab->getParent())
getParent()->link = sec->sectionIndex;
this->size = computeContents().size() * this->entsize;
}
@@ -1688,7 +1688,7 @@ void RelocationBaseSection::partitionRels() {
}
void RelocationBaseSection::finalizeContents() {
- SymbolTableBaseSection *symTab = getPartition().dynSymTab.get();
+ SymbolTableBaseSection *symTab = getPartition(ctx).dynSymTab.get();
// When linking glibc statically, .rel{,a}.plt contains R_*_IRELATIVE
// relocations due to IFUNC (e.g. strcpy). sh_link will be set to 0 in that
@@ -1712,7 +1712,7 @@ void DynamicReloc::computeRaw(Ctx &ctx, SymbolTableBaseSection *symt) {
}
void RelocationBaseSection::computeRels() {
- SymbolTableBaseSection *symTab = getPartition().dynSymTab.get();
+ SymbolTableBaseSection *symTab = getPartition(ctx).dynSymTab.get();
parallelForEach(relocs, [&ctx = ctx, symTab](DynamicReloc &rel) {
rel.computeRaw(ctx, symTab);
});
@@ -1852,7 +1852,7 @@ bool AndroidPackedRelocationSection<ELFT>::updateAllocSize(Ctx &ctx) {
for (const DynamicReloc &rel : relocs) {
Elf_Rela r;
r.r_offset = rel.getOffset();
- r.setSymbolAndType(rel.getSymIndex(getPartition().dynSymTab.get()),
+ r.setSymbolAndType(rel.getSymIndex(getPartition(ctx).dynSymTab.get()),
rel.type, false);
r.r_addend = ctx.arg.isRela ? rel.computeAddend(ctx) : 0;
@@ -2162,9 +2162,9 @@ void SymbolTableBaseSection::finalizeContents() {
// Because the first symbol entry is a null entry, 1 is the first.
getParent()->info = 1;
- if (getPartition().gnuHashTab) {
+ if (getPartition(ctx).gnuHashTab) {
// NB: It also sorts Symbols to meet the GNU hash table requirements.
- getPartition().gnuHashTab->addSymbols(symbols);
+ getPartition(ctx).gnuHashTab->addSymbols(symbols);
} else if (ctx.arg.emachine == EM_MIPS) {
sortMipsSymbols(ctx, symbols);
}
@@ -2416,7 +2416,7 @@ GnuHashTableSection::GnuHashTableSection(Ctx &ctx)
".gnu.hash") {}
void GnuHashTableSection::finalizeContents() {
- if (OutputSection *sec = getPartition().dynSymTab->getParent())
+ if (OutputSection *sec = getPartition(ctx).dynSymTab->getParent())
getParent()->link = sec->sectionIndex;
// Computes bloom filter size in word size. We want to allocate 12
@@ -2438,7 +2438,7 @@ void GnuHashTableSection::writeTo(uint8_t *buf) {
// Write a header.
write32(ctx, buf, nBuckets);
write32(ctx, buf + 4,
- getPartition().dynSymTab->getNumSymbols() - symbols.size());
+ getPartition(ctx).dynSymTab->getNumSymbols() - symbols.size());
write32(ctx, buf + 8, maskWords);
write32(ctx, buf + 12, Shift2);
buf += 16;
@@ -2474,7 +2474,7 @@ void GnuHashTableSection::writeTo(uint8_t *buf) {
// Write a hash bucket. Hash buckets contain indices in the following hash
// value table.
write32(ctx, buckets + i->bucketIdx,
- getPartition().dynSymTab->getSymbolIndex(*i->sym));
+ getPartition(ctx).dynSymTab->getSymbolIndex(*i->sym));
oldBucket = i->bucketIdx;
}
}
@@ -2527,7 +2527,7 @@ HashTableSection::HashTableSection(Ctx &ctx)
}
void HashTableSection::finalizeContents() {
- SymbolTableBaseSection *symTab = getPartition().dynSymTab.get();
+ SymbolTableBaseSection *symTab = getPartition(ctx).dynSymTab.get();
if (OutputSection *sec = symTab->getParent())
getParent()->link = sec->sectionIndex;
@@ -2541,7 +2541,7 @@ void HashTableSection::finalizeContents() {
}
void HashTableSection::writeTo(uint8_t *buf) {
- SymbolTableBaseSection *symTab = getPartition().dynSymTab.get();
+ SymbolTableBaseSection *symTab = getPartition(ctx).dynSymTab.get();
unsigned numSymbols = symTab->getNumSymbols();
uint32_t *p = reinterpret_cast<uint32_t *>(buf);
@@ -3667,14 +3667,14 @@ void EhFrameHeader::writeTo(uint8_t *buf) {
void EhFrameHeader::write() {
uint8_t *buf = ctx.bufferStart + getParent()->offset + outSecOff;
using FdeData = EhFrameSection::FdeData;
- SmallVector<FdeData, 0> fdes = getPartition().ehFrame->getFdeData();
+ SmallVector<FdeData, 0> fdes = getPartition(ctx).ehFrame->getFdeData();
buf[0] = 1;
buf[1] = DW_EH_PE_pcrel | DW_EH_PE_sdata4;
buf[2] = DW_EH_PE_udata4;
buf[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4;
write32(ctx, buf + 4,
- getPartition().ehFrame->getParent()->addr - this->getVA() - 4);
+ getPartition(ctx).ehFrame->getParent()->addr - this->getVA() - 4);
write32(ctx, buf + 8, fdes.size());
buf += 12;
@@ -3687,11 +3687,11 @@ void EhFrameHeader::write() {
size_t EhFrameHeader::getSize() const {
// .eh_frame_hdr has a 12 bytes header followed by an array of FDEs.
- return 12 + getPartition().ehFrame->numFdes * 8;
+ return 12 + getPartition(ctx).ehFrame->numFdes * 8;
}
bool EhFrameHeader::isNeeded() const {
- return isLive() && getPartition().ehFrame->isNeeded();
+ return isLive() && getPartition(ctx).ehFrame->isNeeded();
}
VersionDefinitionSection::VersionDefinitionSection(Ctx &ctx)
@@ -3699,19 +3699,19 @@ VersionDefinitionSection::VersionDefinitionSection(Ctx &ctx)
".gnu.version_d") {}
StringRef VersionDefinitionSection::getFileDefName() {
- if (!getPartition().name.empty())
- return getPartition().name;
+ if (!getPartition(ctx).name.empty())
+ return getPartition(ctx).name;
if (!ctx.arg.soName.empty())
return ctx.arg.soName;
return ctx.arg.outputFile;
}
void VersionDefinitionSection::finalizeContents() {
- fileDefNameOff = getPartition().dynStrTab->addString(getFileDefName());
+ fileDefNameOff = getPartition(ctx).dynStrTab->addString(getFileDefName());
for (const VersionDefinition &v : namedVersionDefs(ctx))
- verDefNameOffs.push_back(getPartition().dynStrTab->addString(v.name));
+ verDefNameOffs.push_back(getPartition(ctx).dynStrTab->addString(v.name));
- if (OutputSection *sec = getPartition().dynStrTab->getParent())
+ if (OutputSection *sec = getPartition(ctx).dynStrTab->getParent())
getParent()->link = sec->sectionIndex;
// sh_info should be set to the number of definitions. This fact is missed in
@@ -3765,16 +3765,16 @@ VersionTableSection::VersionTableSection(Ctx &ctx)
void VersionTableSection::finalizeContents() {
// At the moment of june 2016 GNU docs does not mention that sh_link field
// should be set, but Sun docs do. Also readelf relies on this field.
- getParent()->link = getPartition().dynSymTab->getParent()->sectionIndex;
+ getParent()->link = getPartition(ctx).dynSymTab->getParent()->sectionIndex;
}
size_t VersionTableSection::getSize() const {
- return (getPartition().dynSymTab->getSymbols().size() + 1) * 2;
+ return (getPartition(ctx).dynSymTab->getSymbols().size() + 1) * 2;
}
void VersionTableSection::writeTo(uint8_t *buf) {
buf += 2;
- for (const SymbolTableEntry &s : getPartition().dynSymTab->getSymbols()) {
+ for (const SymbolTableEntry &s : getPartition(ctx).dynSymTab->getSymbols()) {
// For an unextracted lazy symbol (undefined weak), it must have been
// converted to Undefined and have VER_NDX_GLOBAL version here.
assert(!s.sym->isLazy());
@@ -3785,7 +3785,7 @@ void VersionTableSection::writeTo(uint8_t *buf) {
bool VersionTableSection::isNeeded() const {
return isLive() &&
- (getPartition().verDef || getPartition().verNeed->isNeeded());
+ (getPartition(ctx).verDef || getPartition(ctx).verNeed->isNeeded());
}
void elf::addVerneed(Ctx &ctx, Symbol &ss) {
@@ -3817,7 +3817,7 @@ template <class ELFT> void VersionNeedSection<ELFT>::finalizeContents() {
continue;
verneeds.emplace_back();
Verneed &vn = verneeds.back();
- vn.nameStrTab = getPartition().dynStrTab->addString(f->soName);
+ vn.nameStrTab = getPartition(ctx).dynStrTab->addString(f->soName);
bool isLibc = ctx.arg.relrGlibc && f->soName.starts_with("libc.so.");
bool isGlibc2 = false;
for (unsigned i = 0; i != f->vernauxs.size(); ++i) {
@@ -3829,17 +3829,17 @@ template <class ELFT> void VersionNeedSection<ELFT>::finalizeContents() {
if (isLibc && ver.starts_with("GLIBC_2."))
isGlibc2 = true;
vn.vernauxs.push_back({verdef->vd_hash, f->vernauxs[i],
- getPartition().dynStrTab->addString(ver)});
+ getPartition(ctx).dynStrTab->addString(ver)});
}
if (isGlibc2) {
const char *ver = "GLIBC_ABI_DT_RELR";
vn.vernauxs.push_back({hashSysV(ver),
++SharedFile::vernauxNum + getVerDefNum(ctx),
- getPartition().dynStrTab->addString(ver)});
+ getPartition(ctx).dynStrTab->addString(ver)});
}
}
- if (OutputSection *sec = getPartition().dynStrTab->getParent())
+ if (OutputSection *sec = getPartition(ctx).dynStrTab->getParent())
getParent()->link = sec->sectionIndex;
getParent()->info = verneeds.size();
}
@@ -3995,7 +3995,7 @@ template <class ELFT> void elf::splitSections(Ctx &ctx) {
void elf::combineEhSections(Ctx &ctx) {
llvm::TimeTraceScope timeScope("Combine EH sections");
for (EhInputSection *sec : ctx.ehInputSections) {
- EhFrameSection &eh = *sec->getPartition().ehFrame;
+ EhFrameSection &eh = *sec->getPartition(ctx).ehFrame;
sec->parent = &eh;
eh.addralign = std::max(eh.addralign, sec->addralign);
eh.sections.push_back(sec);
@@ -4004,12 +4004,12 @@ void elf::combineEhSections(Ctx &ctx) {
if (!ctx.mainPart->armExidx)
return;
- llvm::erase_if(ctx.inputSections, [](InputSectionBase *s) {
+ llvm::erase_if(ctx.inputSections, [&](InputSectionBase *s) {
// Ignore dead sections and the partition end marker (.part.end),
// whose partition number is out of bounds.
if (!s->isLive() || s->partition == 255)
return false;
- Partition &part = s->getPartition();
+ Partition &part = s->getPartition(ctx);
return s->kind() == SectionBase::Regular && part.armExidx &&
part.armExidx->addSection(cast<InputSection>(s));
});
@@ -4447,7 +4447,7 @@ size_t PartitionElfHeaderSection<ELFT>::getSize() const {
template <typename ELFT>
void PartitionElfHeaderSection<ELFT>::writeTo(uint8_t *buf) {
- writeEhdr<ELFT>(ctx, buf, getPartition());
+ writeEhdr<ELFT>(ctx, buf, getPartition(ctx));
// Loadable partitions are always ET_DYN.
auto *eHdr = reinterpret_cast<typename ELFT::Ehdr *>(buf);
@@ -4460,12 +4460,12 @@ PartitionProgramHeadersSection<ELFT>::PartitionProgramHeadersSection(Ctx &ctx)
template <typename ELFT>
size_t PartitionProgramHeadersSection<ELFT>::getSize() const {
- return sizeof(typename ELFT::Phdr) * getPartition().phdrs.size();
+ return sizeof(typename ELFT::Phdr) * getPartition(ctx).phdrs.size();
}
template <typename ELFT>
void PartitionProgramHeadersSection<ELFT>::writeTo(uint8_t *buf) {
- writePhdrs<ELFT>(buf, getPartition());
+ writePhdrs<ELFT>(buf, getPartition(ctx));
}
PartitionIndexSection::PartitionIndexSection(Ctx &ctx)
@@ -4747,7 +4747,7 @@ template <class ELFT> void elf::createSyntheticSections(Ctx &ctx) {
const unsigned threadCount = ctx.arg.threadCount;
for (Partition &part : ctx.partitions) {
auto add = [&](SyntheticSection &sec) {
- sec.partition = part.getNumber();
+ sec.partition = part.getNumber(ctx);
ctx.inputSections.push_back(&sec);
};
diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h
index 7ddbaff5573fdb..d64c4aad8c552b 100644
--- a/lld/ELF/SyntheticSections.h
+++ b/lld/ELF/SyntheticSections.h
@@ -1475,10 +1475,10 @@ struct Partition {
std::unique_ptr<VersionTableSection> verSym;
Partition(Ctx &ctx) : ctx(ctx) {}
- unsigned getNumber() const { return this - &ctx.partitions[0] + 1; }
+ unsigned getNumber(Ctx &ctx) const { return this - &ctx.partitions[0] + 1; }
};
-inline Partition &SectionBase::getPartition() const {
+inline Partition &SectionBase::getPartition(Ctx &ctx) const {
assert(isLive());
return ctx.partitions[partition - 1];
}
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 49b6ab4a48b55a..2cd4478d00cf5d 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -2191,7 +2191,7 @@ SmallVector<PhdrEntry *, 0> Writer<ELFT>::createPhdrs(Partition &part) {
return ret.back();
};
- unsigned partNo = part.getNumber();
+ unsigned partNo = part.getNumber(ctx);
bool isMain = partNo == 1;
// Add the first PT_LOAD segment for regular output sections.
@@ -2381,7 +2381,7 @@ SmallVector<PhdrEntry *, 0> Writer<ELFT>::createPhdrs(Partition &part) {
template <class ELFT>
void Writer<ELFT>::addPhdrForSection(Partition &part, unsigned shType,
unsigned pType, unsigned pFlags) {
- unsigned partNo = part.getNumber();
+ unsigned partNo = part.getNumber(ctx);
auto i = llvm::find_if(ctx.outputSections, [=](OutputSection *cmd) {
return cmd->partition == partNo && cmd->type == shType;
});
More information about the llvm-commits
mailing list