[lld] bab5d5b - [ELF] Pass Ctx & to ICF and SymbolTable
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 29 14:45:05 PDT 2024
Author: Fangrui Song
Date: 2024-09-29T14:45:00-07:00
New Revision: bab5d5b6b092aca94f5d96976d97c390dff0d172
URL: https://github.com/llvm/llvm-project/commit/bab5d5b6b092aca94f5d96976d97c390dff0d172
DIFF: https://github.com/llvm/llvm-project/commit/bab5d5b6b092aca94f5d96976d97c390dff0d172.diff
LOG: [ELF] Pass Ctx & to ICF and SymbolTable
Added:
Modified:
lld/ELF/Driver.cpp
lld/ELF/ICF.cpp
lld/ELF/ICF.h
lld/ELF/LTO.cpp
lld/ELF/SymbolTable.cpp
lld/ELF/SymbolTable.h
Removed:
################################################################################
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 64f4489987b007..81f79266254d47 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -109,7 +109,7 @@ void Ctx::reset() {
in.reset();
sym = ElfSym{};
- symtab = std::make_unique<SymbolTable>();
+ symtab = std::make_unique<SymbolTable>(*this);
memoryBuffers.clear();
objectFiles.clear();
@@ -167,7 +167,7 @@ bool link(ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS,
LinkerScript script(ctx);
ctx.script = &script;
ctx.symAux.emplace_back();
- ctx.symtab = std::make_unique<SymbolTable>();
+ ctx.symtab = std::make_unique<SymbolTable>(ctx);
ctx.partitions.clear();
ctx.partitions.emplace_back();
@@ -3201,7 +3201,7 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
// ICF runs after processSectionCommands() so that we know the output sections.
if (ctx.arg.icf != ICFLevel::None) {
findKeepUniqueSections<ELFT>(ctx, args);
- doIcf<ELFT>();
+ doIcf<ELFT>(ctx);
}
// Read the callgraph now that we know what was gced or icfed
diff --git a/lld/ELF/ICF.cpp b/lld/ELF/ICF.cpp
index 3f4f479785fd92..09582b8af8248f 100644
--- a/lld/ELF/ICF.cpp
+++ b/lld/ELF/ICF.cpp
@@ -97,6 +97,7 @@ using namespace lld::elf;
namespace {
template <class ELFT> class ICF {
public:
+ ICF(Ctx &ctx) : ctx(ctx) {}
void run();
private:
@@ -120,6 +121,7 @@ template <class ELFT> class ICF {
void forEachClass(llvm::function_ref<void(size_t, size_t)> fn);
+ Ctx &ctx;
SmallVector<InputSection *, 0> sections;
// We repeat the main loop while `Repeat` is true.
@@ -457,7 +459,7 @@ static void combineRelocHashes(unsigned cnt, InputSection *isec,
isec->eqClass[(cnt + 1) % 2] = hash | (1U << 31);
}
-static void print(const Twine &s) {
+static void print(Ctx &ctx, const Twine &s) {
if (ctx.arg.printIcfSections)
message(s);
}
@@ -546,9 +548,9 @@ template <class ELFT> void ICF<ELFT>::run() {
forEachClassRange(0, sections.size(), [&](size_t begin, size_t end) {
if (end - begin == 1)
return;
- print("selected section " + toString(sections[begin]));
+ print(ctx, "selected section " + toString(sections[begin]));
for (size_t i = begin + 1; i < end; ++i) {
- print(" removing identical section " + toString(sections[i]));
+ print(ctx, " removing identical section " + toString(sections[i]));
sections[begin]->replace(sections[i]);
// At this point we know sections merged are fully identical and hence
@@ -586,12 +588,12 @@ template <class ELFT> void ICF<ELFT>::run() {
}
// ICF entry point function.
-template <class ELFT> void elf::doIcf() {
+template <class ELFT> void elf::doIcf(Ctx &ctx) {
llvm::TimeTraceScope timeScope("ICF");
- ICF<ELFT>().run();
+ ICF<ELFT>(ctx).run();
}
-template void elf::doIcf<ELF32LE>();
-template void elf::doIcf<ELF32BE>();
-template void elf::doIcf<ELF64LE>();
-template void elf::doIcf<ELF64BE>();
+template void elf::doIcf<ELF32LE>(Ctx &);
+template void elf::doIcf<ELF32BE>(Ctx &);
+template void elf::doIcf<ELF64LE>(Ctx &);
+template void elf::doIcf<ELF64BE>(Ctx &);
diff --git a/lld/ELF/ICF.h b/lld/ELF/ICF.h
index 3246cc33f43c91..b126c889ea8636 100644
--- a/lld/ELF/ICF.h
+++ b/lld/ELF/ICF.h
@@ -10,9 +10,9 @@
#define LLD_ELF_ICF_H
namespace lld::elf {
+struct Ctx;
-template <class ELFT> void doIcf();
-
+template <class ELFT> void doIcf(Ctx &);
}
#endif
diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp
index d5d9576c79eb5c..6b4b0716b9ccb9 100644
--- a/lld/ELF/LTO.cpp
+++ b/lld/ELF/LTO.cpp
@@ -281,7 +281,7 @@ void BitcodeCompiler::add(BitcodeFile &f) {
// If LazyObjFile has not been added to link, emit empty index files.
// This is needed because this is what GNU gold plugin does and we have a
// distributed build system that depends on that behavior.
-static void thinLTOCreateEmptyIndexFiles() {
+static void thinLTOCreateEmptyIndexFiles(Ctx &ctx) {
DenseSet<StringRef> linkedBitCodeFiles;
for (BitcodeFile *f : ctx.bitcodeFiles)
linkedBitCodeFiles.insert(f->getName());
@@ -345,7 +345,7 @@ std::vector<InputFile *> BitcodeCompiler::compile() {
}
if (ctx.arg.thinLTOEmitIndexFiles)
- thinLTOCreateEmptyIndexFiles();
+ thinLTOCreateEmptyIndexFiles(ctx);
if (ctx.arg.thinLTOIndexOnly) {
if (!ctx.arg.ltoObjPath.empty())
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 74fa66e6d1182c..db8ee8f4d7b3bb 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -215,7 +215,7 @@ bool SymbolTable::assignExactVersion(SymbolVersion ver, uint16_t versionId,
// Get a list of symbols which we need to assign the version to.
SmallVector<Symbol *, 0> syms = findByVersion(ver);
- auto getName = [](uint16_t ver) -> std::string {
+ auto getName = [&ctx = ctx](uint16_t ver) -> std::string {
if (ver == VER_NDX_LOCAL)
return "VER_NDX_LOCAL";
if (ver == VER_NDX_GLOBAL)
diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h
index c0bc73502bbe60..de00a016615514 100644
--- a/lld/ELF/SymbolTable.h
+++ b/lld/ELF/SymbolTable.h
@@ -15,7 +15,7 @@
#include "llvm/Support/Compiler.h"
namespace lld::elf {
-
+struct Ctx;
class InputFile;
class SharedFile;
@@ -38,6 +38,7 @@ struct ArmCmseEntryFunction {
// is one add* function per symbol type.
class SymbolTable {
public:
+ SymbolTable(Ctx &ctx) : ctx(ctx) {}
ArrayRef<Symbol *> getSymbols() const { return symVector; }
void wrap(Symbol *sym, Symbol *real, Symbol *wrap);
@@ -91,6 +92,8 @@ class SymbolTable {
void assignWildcardVersion(SymbolVersion ver, uint16_t versionId,
bool includeNonDefault);
+ Ctx &ctx;
+
// Global symbols and a map from symbol name to the index. The order is not
// defined. We can use an arbitrary order, but it has to be deterministic even
// when cross linking.
More information about the llvm-commits
mailing list