[lld] dd326b1 - [ELF] Pass Ctx &
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 11 21:10:10 PDT 2024
Author: Fangrui Song
Date: 2024-10-11T21:10:05-07:00
New Revision: dd326b122506421aba2368053103767f4c56e2ba
URL: https://github.com/llvm/llvm-project/commit/dd326b122506421aba2368053103767f4c56e2ba
DIFF: https://github.com/llvm/llvm-project/commit/dd326b122506421aba2368053103767f4c56e2ba.diff
LOG: [ELF] Pass Ctx &
Added:
Modified:
lld/ELF/Driver.cpp
lld/ELF/DriverUtils.cpp
lld/ELF/InputFiles.cpp
lld/ELF/Symbols.cpp
lld/ELF/Symbols.h
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 e68cc7f0bb3f6a..496edb0d32369f 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -969,7 +969,7 @@ static void readCallGraph(Ctx &ctx, MemoryBufferRef mb) {
warn(mb.getBufferIdentifier() + ": no such symbol: " + name);
return nullptr;
}
- maybeWarnUnorderableSymbol(sym);
+ maybeWarnUnorderableSymbol(ctx, sym);
if (Defined *dr = dyn_cast_or_null<Defined>(sym))
return dyn_cast_or_null<InputSectionBase>(dr->section);
diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp
index 8b93068f2f9526..cd7688ee3f80c0 100644
--- a/lld/ELF/DriverUtils.cpp
+++ b/lld/ELF/DriverUtils.cpp
@@ -210,7 +210,7 @@ std::string elf::createResponseFile(const opt::InputArgList &args) {
// Find a file by concatenating given paths. If a resulting path
// starts with "=", the character is replaced with a --sysroot value.
-static std::optional<std::string> findFile(StringRef path1,
+static std::optional<std::string> findFile(Ctx &ctx, StringRef path1,
const Twine &path2) {
SmallString<128> s;
if (path1.starts_with("="))
@@ -225,7 +225,7 @@ static std::optional<std::string> findFile(StringRef path1,
std::optional<std::string> elf::findFromSearchPaths(Ctx &ctx, StringRef path) {
for (StringRef dir : ctx.arg.searchPaths)
- if (std::optional<std::string> s = findFile(dir, path))
+ if (std::optional<std::string> s = findFile(ctx, dir, path))
return s;
return std::nullopt;
}
@@ -236,9 +236,10 @@ std::optional<std::string> elf::searchLibraryBaseName(Ctx &ctx,
StringRef name) {
for (StringRef dir : ctx.arg.searchPaths) {
if (!ctx.arg.isStatic)
- if (std::optional<std::string> s = findFile(dir, "lib" + name + ".so"))
+ if (std::optional<std::string> s =
+ findFile(ctx, dir, "lib" + name + ".so"))
return s;
- if (std::optional<std::string> s = findFile(dir, "lib" + name + ".a"))
+ if (std::optional<std::string> s = findFile(ctx, dir, "lib" + name + ".a"))
return s;
}
return std::nullopt;
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 0ac354b086d795..08668101ad58f4 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -1339,7 +1339,7 @@ static bool isNonCommonDef(Ctx &ctx, ELFKind ekind, MemoryBufferRef mb,
return false;
}
-static bool isNonCommonDef(MemoryBufferRef mb, StringRef symName,
+static bool isNonCommonDef(Ctx &ctx, MemoryBufferRef mb, StringRef symName,
StringRef archiveName) {
switch (getELFKind(mb, archiveName)) {
case ELF32LEKind:
@@ -1916,7 +1916,7 @@ bool InputFile::shouldExtractForCommon(StringRef name) const {
if (isa<BitcodeFile>(this))
return isBitcodeNonCommonDef(mb, name, archiveName);
- return isNonCommonDef(mb, name, archiveName);
+ return isNonCommonDef(ctx, mb, name, archiveName);
}
std::string elf::replaceThinLTOSuffix(Ctx &ctx, StringRef path) {
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 0842c15974d130..172b8e360adddd 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -298,7 +298,7 @@ static void recordWhyExtract(const InputFile *reference,
ctx.whyExtractRecords.emplace_back(toString(reference), &extracted, sym);
}
-void elf::maybeWarnUnorderableSymbol(const Symbol *sym) {
+void elf::maybeWarnUnorderableSymbol(Ctx &ctx, const Symbol *sym) {
if (!ctx.arg.warnSymbolOrdering)
return;
diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h
index 424305233ec862..d96eba107591d0 100644
--- a/lld/ELF/Symbols.h
+++ b/lld/ELF/Symbols.h
@@ -527,7 +527,7 @@ template <typename... T> Defined *makeDefined(T &&...args) {
void reportDuplicate(Ctx &, const Symbol &sym, const InputFile *newFile,
InputSectionBase *errSec, uint64_t errOffset);
-void maybeWarnUnorderableSymbol(const Symbol *sym);
+void maybeWarnUnorderableSymbol(Ctx &, const Symbol *sym);
bool computeIsPreemptible(Ctx &, const Symbol &sym);
} // namespace elf
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 8a2325f9686ff8..774b37d0a32ef3 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -1630,8 +1630,9 @@ uint32_t DynamicReloc::getSymIndex(SymbolTableBaseSection *symTab) const {
size_t index = symTab->getSymbolIndex(*sym);
assert((index != 0 ||
- (type != ctx.target->gotRel && type != ctx.target->pltRel) ||
- !ctx.mainPart->dynSymTab->getParent()) &&
+ (type != symTab->ctx.target->gotRel &&
+ type != symTab->ctx.target->pltRel) ||
+ !symTab->ctx.mainPart->dynSymTab->getParent()) &&
"GOT or PLT relocation must refer to symbol in dynamic symbol table");
return index;
}
@@ -2241,8 +2242,8 @@ SymbolTableSection<ELFT>::SymbolTableSection(Ctx &ctx,
this->entsize = sizeof(Elf_Sym);
}
-static BssSection *getCommonSec(Symbol *sym) {
- if (ctx.arg.relocatable)
+static BssSection *getCommonSec(bool relocatable, Symbol *sym) {
+ if (relocatable)
if (auto *d = dyn_cast<Defined>(sym))
return dyn_cast_or_null<BssSection>(d->section);
return nullptr;
@@ -2264,7 +2265,7 @@ template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *buf) {
buf += sizeof(Elf_Sym);
auto *eSym = reinterpret_cast<Elf_Sym *>(buf);
-
+ bool relocatable = ctx.arg.relocatable;
for (SymbolTableEntry &ent : symbols) {
Symbol *sym = ent.sym;
bool isDefinedHere = type == SHT_SYMTAB || sym->partition == partition;
@@ -2274,7 +2275,7 @@ template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *buf) {
eSym->setBindingAndType(sym->binding, sym->type);
eSym->st_other = sym->stOther;
- if (BssSection *commonSec = getCommonSec(sym)) {
+ if (BssSection *commonSec = getCommonSec(relocatable, sym)) {
// When -r is specified, a COMMON symbol is not allocated. Its st_shndx
// holds SHN_COMMON and st_value holds the alignment.
eSym->st_shndx = SHN_COMMON;
@@ -2347,8 +2348,10 @@ void SymtabShndxSection::writeTo(uint8_t *buf) {
// SHN_XINDEX, we need to write actual index, otherwise, we must write
// SHN_UNDEF(0).
buf += 4; // Ignore .symtab[0] entry.
+ bool relocatable = ctx.arg.relocatable;
for (const SymbolTableEntry &entry : ctx.in.symTab->getSymbols()) {
- if (!getCommonSec(entry.sym) && getSymSectionIndex(entry.sym) == SHN_XINDEX)
+ if (!getCommonSec(relocatable, entry.sym) &&
+ getSymSectionIndex(entry.sym) == SHN_XINDEX)
write32(buf, entry.sym->getOutputSection()->sectionIndex);
buf += 4;
}
@@ -4384,7 +4387,8 @@ static uint8_t getAbiVersion(Ctx &ctx) {
return 0;
}
-template <typename ELFT> void elf::writeEhdr(uint8_t *buf, Partition &part) {
+template <typename ELFT>
+void elf::writeEhdr(Ctx &ctx, uint8_t *buf, Partition &part) {
memcpy(buf, "\177ELF", 4);
auto *eHdr = reinterpret_cast<typename ELFT::Ehdr *>(buf);
@@ -4434,7 +4438,7 @@ size_t PartitionElfHeaderSection<ELFT>::getSize() const {
template <typename ELFT>
void PartitionElfHeaderSection<ELFT>::writeTo(uint8_t *buf) {
- writeEhdr<ELFT>(buf, getPartition());
+ writeEhdr<ELFT>(ctx, buf, getPartition());
// Loadable partitions are always ET_DYN.
auto *eHdr = reinterpret_cast<typename ELFT::Ehdr *>(buf);
@@ -4970,10 +4974,10 @@ template class elf::SymbolTableSection<ELF32BE>;
template class elf::SymbolTableSection<ELF64LE>;
template class elf::SymbolTableSection<ELF64BE>;
-template void elf::writeEhdr<ELF32LE>(uint8_t *Buf, Partition &Part);
-template void elf::writeEhdr<ELF32BE>(uint8_t *Buf, Partition &Part);
-template void elf::writeEhdr<ELF64LE>(uint8_t *Buf, Partition &Part);
-template void elf::writeEhdr<ELF64BE>(uint8_t *Buf, Partition &Part);
+template void elf::writeEhdr<ELF32LE>(Ctx &, uint8_t *Buf, Partition &Part);
+template void elf::writeEhdr<ELF32BE>(Ctx &, uint8_t *Buf, Partition &Part);
+template void elf::writeEhdr<ELF64LE>(Ctx &, uint8_t *Buf, Partition &Part);
+template void elf::writeEhdr<ELF64BE>(Ctx &, uint8_t *Buf, Partition &Part);
template void elf::writePhdrs<ELF32LE>(uint8_t *Buf, Partition &Part);
template void elf::writePhdrs<ELF32BE>(uint8_t *Buf, Partition &Part);
diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h
index 34a1a716be6694..3ef3e04b5d1570 100644
--- a/lld/ELF/SyntheticSections.h
+++ b/lld/ELF/SyntheticSections.h
@@ -1436,7 +1436,7 @@ void combineEhSections(Ctx &);
bool hasMemtag(Ctx &);
bool canHaveMemtagGlobals(Ctx &);
-template <typename ELFT> void writeEhdr(uint8_t *buf, Partition &part);
+template <typename ELFT> void writeEhdr(Ctx &, uint8_t *buf, Partition &part);
template <typename ELFT> void writePhdrs(uint8_t *buf, Partition &part);
Defined *addSyntheticLocal(Ctx &ctx, StringRef name, uint8_t type,
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index bd34c5fa97269b..969820be36fbad 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -777,7 +777,7 @@ unsigned elf::getSectionRank(Ctx &ctx, OutputSection &osec) {
return rank;
}
-static bool compareSections(const SectionCommand *aCmd,
+static bool compareSections(Ctx &ctx, const SectionCommand *aCmd,
const SectionCommand *bCmd) {
const OutputSection *a = &cast<OutputDesc>(aCmd)->osec;
const OutputSection *b = &cast<OutputDesc>(bCmd)->osec;
@@ -1098,7 +1098,7 @@ static DenseMap<const InputSectionBase *, int> buildSectionOrder(Ctx &ctx) {
SymbolOrderEntry &ent = it->second;
ent.present = true;
- maybeWarnUnorderableSymbol(&sym);
+ maybeWarnUnorderableSymbol(ctx, &sym);
if (auto *d = dyn_cast<Defined>(&sym)) {
if (auto *sec = dyn_cast_or_null<InputSectionBase>(d->section)) {
@@ -1273,7 +1273,9 @@ template <class ELFT> void Writer<ELFT>::sortSections() {
auto mid = std::stable_partition(
ctx.script->sectionCommands.begin(), ctx.script->sectionCommands.end(),
[](SectionCommand *cmd) { return isa<OutputDesc>(cmd); });
- std::stable_sort(ctx.script->sectionCommands.begin(), mid, compareSections);
+ std::stable_sort(
+ ctx.script->sectionCommands.begin(), mid,
+ [&ctx = ctx](auto *l, auto *r) { return compareSections(ctx, l, r); });
}
// Process INSERT commands and update output section attributes. From this
@@ -1336,7 +1338,9 @@ template <class ELFT> void Writer<ELFT>::sortOrphanSections() {
});
// Sort the orphan sections.
- std::stable_sort(nonScriptI, e, compareSections);
+ std::stable_sort(nonScriptI, e, [&ctx = ctx](auto *l, auto *r) {
+ return compareSections(ctx, l, r);
+ });
// As a horrible special case, skip the first . assignment if it is before any
// section. We do this because it is common to set a load address by starting
@@ -2730,7 +2734,7 @@ static uint16_t getELFType(Ctx &ctx) {
}
template <class ELFT> void Writer<ELFT>::writeHeader() {
- writeEhdr<ELFT>(ctx.bufferStart, *ctx.mainPart);
+ writeEhdr<ELFT>(ctx, ctx.bufferStart, *ctx.mainPart);
writePhdrs<ELFT>(ctx.bufferStart + sizeof(Elf_Ehdr), *ctx.mainPart);
auto *eHdr = reinterpret_cast<Elf_Ehdr *>(ctx.bufferStart);
More information about the llvm-commits
mailing list