[lld] 079b832 - [ELF] Pass Ctx & to InputFiles and SyntheticSections
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 29 16:06:51 PDT 2024
Author: Fangrui Song
Date: 2024-09-29T16:06:47-07:00
New Revision: 079b8327ecbfd35d0cac0be2aee694c2c5d3a833
URL: https://github.com/llvm/llvm-project/commit/079b8327ecbfd35d0cac0be2aee694c2c5d3a833
DIFF: https://github.com/llvm/llvm-project/commit/079b8327ecbfd35d0cac0be2aee694c2c5d3a833.diff
LOG: [ELF] Pass Ctx & to InputFiles and SyntheticSections
Added:
Modified:
lld/ELF/Arch/ARM.cpp
lld/ELF/Arch/RISCV.cpp
lld/ELF/Config.h
lld/ELF/Driver.cpp
lld/ELF/InputFiles.cpp
lld/ELF/InputFiles.h
lld/ELF/Symbols.cpp
lld/ELF/SyntheticSections.cpp
lld/ELF/SyntheticSections.h
lld/ELF/Target.h
Removed:
################################################################################
diff --git a/lld/ELF/Arch/ARM.cpp b/lld/ELF/Arch/ARM.cpp
index 93eaf135dc058f..77bdd656dd8cd6 100644
--- a/lld/ELF/Arch/ARM.cpp
+++ b/lld/ELF/Arch/ARM.cpp
@@ -1261,7 +1261,7 @@ static std::string checkCmseSymAttributes(Symbol *acleSeSym, Symbol *sym) {
// name with __acle_se_.
// Both these symbols are Thumb function symbols with external linkage.
// <sym> may be redefined in .gnu.sgstubs.
-void elf::processArmCmseSymbols() {
+void elf::processArmCmseSymbols(Ctx &ctx) {
if (!ctx.arg.cmseImplib)
return;
// Only symbols with external linkage end up in ctx.symtab, so no need to do
diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 8a4ccc567e5fac..f776ac8ede1bd7 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -1305,7 +1305,7 @@ void RISCVAttributesSection::writeTo(uint8_t *buf) {
}
}
-void elf::mergeRISCVAttributesSections() {
+void elf::mergeRISCVAttributesSections(Ctx &) {
// Find the first input SHT_RISCV_ATTRIBUTES; return if not found.
size_t place =
llvm::find_if(ctx.inputSections,
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index 80a45bc4b63793..1d113375143a51 100644
--- a/lld/ELF/Config.h
+++ b/lld/ELF/Config.h
@@ -173,9 +173,9 @@ class LinkerDriver {
std::unique_ptr<BitcodeCompiler> lto;
std::vector<InputFile *> files;
- InputFile *armCmseImpLib = nullptr;
public:
+ InputFile *armCmseImpLib = nullptr;
SmallVector<std::pair<StringRef, unsigned>, 0> archiveFiles;
};
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index af9fc98e8e860b..94cd060b697d25 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -2875,7 +2875,7 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
for (StringRef name : ctx.arg.undefined)
ctx.symtab->addUnusedUndefined(name)->referenced = true;
- parseFiles(files, armCmseImpLib);
+ parseFiles(ctx, files);
// Create dynamic sections for dynamic linking and static PIE.
ctx.arg.hasDynSymTab = !ctx.sharedFiles.empty() || ctx.arg.isPic;
@@ -3052,7 +3052,7 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
excludeLibs(ctx, args);
// Record [__acle_se_<sym>, <sym>] pairs for later processing.
- processArmCmseSymbols();
+ processArmCmseSymbols(ctx);
// Apply symbol renames for --wrap and combine foo at v1 and foo@@v1.
redirectSymbols(ctx, wrapped);
@@ -3144,7 +3144,7 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
ctx.inputSections.push_back(createCommentSection());
// Split SHF_MERGE and .eh_frame sections into pieces in preparation for garbage collection.
- splitSections<ELFT>();
+ splitSections<ELFT>(ctx);
// Garbage collection and removal of shared symbols from unused shared objects.
markLive<ELFT>(ctx);
@@ -3160,17 +3160,17 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
// Create synthesized sections such as .got and .plt. This is called before
// processSectionCommands() so that they can be placed by SECTIONS commands.
- createSyntheticSections<ELFT>();
+ createSyntheticSections<ELFT>(ctx);
// Some input sections that are used for exception handling need to be moved
// into synthetic sections. Do that now so that they aren't assigned to
// output sections in the usual way.
if (!ctx.arg.relocatable)
- combineEhSections();
+ combineEhSections(ctx);
// Merge .riscv.attributes sections.
if (ctx.arg.emachine == EM_RISCV)
- mergeRISCVAttributesSections();
+ mergeRISCVAttributesSections(ctx);
{
llvm::TimeTraceScope timeScope("Assign sections");
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 8dc6811045b3cb..7265ed56e957f2 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -296,7 +296,7 @@ static bool isCompatible(InputFile *file) {
return false;
}
-template <class ELFT> static void doParseFile(InputFile *file) {
+template <class ELFT> static void doParseFile(Ctx &ctx, InputFile *file) {
if (!isCompatible(file))
return;
@@ -329,7 +329,9 @@ template <class ELFT> static void doParseFile(InputFile *file) {
}
// Add symbols in File to the symbol table.
-void elf::parseFile(InputFile *file) { invokeELFT(doParseFile, file); }
+void elf::parseFile(Ctx &ctx, InputFile *file) {
+ invokeELFT(doParseFile, ctx, file);
+}
// This function is explicitly instantiated in ARM.cpp. Mark it extern here,
// to avoid warnings when building with MSVC.
@@ -339,23 +341,21 @@ extern template void ObjFile<ELF64LE>::importCmseSymbols();
extern template void ObjFile<ELF64BE>::importCmseSymbols();
template <class ELFT>
-static void doParseFiles(const std::vector<InputFile *> &files,
- InputFile *armCmseImpLib) {
+static void doParseFiles(Ctx &ctx, const std::vector<InputFile *> &files) {
// Add all files to the symbol table. This will add almost all symbols that we
// need to the symbol table. This process might add files to the link due to
// addDependentLibrary.
for (size_t i = 0; i < files.size(); ++i) {
llvm::TimeTraceScope timeScope("Parse input files", files[i]->getName());
- doParseFile<ELFT>(files[i]);
+ doParseFile<ELFT>(ctx, files[i]);
}
- if (armCmseImpLib)
- cast<ObjFile<ELFT>>(*armCmseImpLib).importCmseSymbols();
+ if (ctx.driver.armCmseImpLib)
+ cast<ObjFile<ELFT>>(*ctx.driver.armCmseImpLib).importCmseSymbols();
}
-void elf::parseFiles(const std::vector<InputFile *> &files,
- InputFile *armCmseImpLib) {
+void elf::parseFiles(Ctx &ctx, const std::vector<InputFile *> &files) {
llvm::TimeTraceScope timeScope("Parse input files");
- invokeELFT(doParseFiles, files, armCmseImpLib);
+ invokeELFT(doParseFiles, ctx, files);
}
// Concatenates arguments to construct a string representing an error location.
diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h
index 4e777761e143b1..730a4d8855c6bd 100644
--- a/lld/ELF/InputFiles.h
+++ b/lld/ELF/InputFiles.h
@@ -43,9 +43,8 @@ class Symbol;
std::optional<MemoryBufferRef> readFile(StringRef path);
// Add symbols in File to the symbol table.
-void parseFile(InputFile *file);
-void parseFiles(const std::vector<InputFile *> &files,
- InputFile *armCmseImpLib);
+void parseFile(Ctx &, InputFile *file);
+void parseFiles(Ctx &, const std::vector<InputFile *> &files);
// The root class of input files.
class InputFile {
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 65283adf4e5052..efdaf07c97514b 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -250,7 +250,7 @@ void Symbol::parseSymbolVersion() {
void Symbol::extract() const {
if (file->lazy) {
file->lazy = false;
- parseFile(file);
+ parseFile(ctx, file);
}
}
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 4d83a722231e64..8298420b8b01dc 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -3946,7 +3946,7 @@ void MergeNoTailSection::finalizeContents() {
});
}
-template <class ELFT> void elf::splitSections() {
+template <class ELFT> void elf::splitSections(Ctx &ctx) {
llvm::TimeTraceScope timeScope("Split sections");
// splitIntoPieces needs to be called on each MergeInputSection
// before calling finalizeContents().
@@ -3962,7 +3962,7 @@ template <class ELFT> void elf::splitSections() {
});
}
-void elf::combineEhSections() {
+void elf::combineEhSections(Ctx &ctx) {
llvm::TimeTraceScope timeScope("Combine EH sections");
for (EhInputSection *sec : ctx.ehInputSections) {
EhFrameSection &eh = *sec->getPartition().ehFrame;
@@ -4495,7 +4495,7 @@ void InStruct::reset() {
symTabShndx.reset();
}
-static bool needsInterpSection() {
+static bool needsInterpSection(Ctx &ctx) {
return !ctx.arg.relocatable && !ctx.arg.shared &&
!ctx.arg.dynamicLinker.empty() && ctx.script->needsInterpSection();
}
@@ -4513,7 +4513,7 @@ bool elf::hasMemtag() {
// that ifuncs use in fully static executables.
bool elf::canHaveMemtagGlobals() {
return hasMemtag() &&
- (ctx.arg.relocatable || ctx.arg.shared || needsInterpSection());
+ (ctx.arg.relocatable || ctx.arg.shared || needsInterpSection(ctx));
}
constexpr char kMemtagAndroidNoteName[] = "Android";
@@ -4652,11 +4652,11 @@ static Defined *addOptionalRegular(StringRef name, SectionBase *sec,
return cast<Defined>(s);
}
-template <class ELFT> void elf::createSyntheticSections() {
+template <class ELFT> void elf::createSyntheticSections(Ctx &ctx) {
// Add the .interp section first because it is not a SyntheticSection.
// The removeUnusedSyntheticSections() function relies on the
// SyntheticSections coming last.
- if (needsInterpSection()) {
+ if (needsInterpSection(ctx)) {
for (size_t i = 1; i <= ctx.partitions.size(); ++i) {
InputSection *sec = createInterpSection();
sec->partition = i;
@@ -4664,7 +4664,7 @@ template <class ELFT> void elf::createSyntheticSections() {
}
}
- auto add = [](SyntheticSection &sec) { ctx.inputSections.push_back(&sec); };
+ auto add = [&](SyntheticSection &sec) { ctx.inputSections.push_back(&sec); };
if (ctx.arg.zSectionHeader)
ctx.in.shStrTab = std::make_unique<StringTableSection>(".shstrtab", false);
@@ -4927,10 +4927,10 @@ template <class ELFT> void elf::createSyntheticSections() {
add(*ctx.in.strTab);
}
-template void elf::splitSections<ELF32LE>();
-template void elf::splitSections<ELF32BE>();
-template void elf::splitSections<ELF64LE>();
-template void elf::splitSections<ELF64BE>();
+template void elf::splitSections<ELF32LE>(Ctx &);
+template void elf::splitSections<ELF32BE>(Ctx &);
+template void elf::splitSections<ELF64LE>(Ctx &);
+template void elf::splitSections<ELF64BE>(Ctx &);
template void EhFrameSection::iterateFDEWithLSDA<ELF32LE>(
function_ref<void(InputSection &)>);
@@ -4956,7 +4956,7 @@ template void elf::writePhdrs<ELF32BE>(uint8_t *Buf, Partition &Part);
template void elf::writePhdrs<ELF64LE>(uint8_t *Buf, Partition &Part);
template void elf::writePhdrs<ELF64BE>(uint8_t *Buf, Partition &Part);
-template void elf::createSyntheticSections<ELF32LE>();
-template void elf::createSyntheticSections<ELF32BE>();
-template void elf::createSyntheticSections<ELF64LE>();
-template void elf::createSyntheticSections<ELF64BE>();
+template void elf::createSyntheticSections<ELF32LE>(Ctx &);
+template void elf::createSyntheticSections<ELF32BE>(Ctx &);
+template void elf::createSyntheticSections<ELF64LE>(Ctx &);
+template void elf::createSyntheticSections<ELF64BE>(Ctx &);
diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h
index 34654a2c57846b..759a908b202a94 100644
--- a/lld/ELF/SyntheticSections.h
+++ b/lld/ELF/SyntheticSections.h
@@ -1426,11 +1426,11 @@ class MemtagGlobalDescriptors final : public SyntheticSection {
SmallVector<const Symbol *, 0> symbols;
};
-template <class ELFT> void createSyntheticSections();
+template <class ELFT> void createSyntheticSections(Ctx &);
InputSection *createInterpSection();
MergeInputSection *createCommentSection();
-template <class ELFT> void splitSections();
-void combineEhSections();
+template <class ELFT> void splitSections(Ctx &);
+void combineEhSections(Ctx &);
bool hasMemtag();
bool canHaveMemtagGlobals();
diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h
index 648d0c3fe9eb28..54e5c472830bbb 100644
--- a/lld/ELF/Target.h
+++ b/lld/ELF/Target.h
@@ -208,7 +208,7 @@ static inline std::string getErrorLocation(const uint8_t *loc) {
return getErrorPlace(ctx, loc).loc;
}
-void processArmCmseSymbols();
+void processArmCmseSymbols(Ctx &);
void writePPC32GlinkSection(uint8_t *buf, size_t numEntries);
@@ -235,7 +235,7 @@ uint64_t getAArch64Page(uint64_t expr);
template <typename ELFT> void writeARMCmseImportLib();
uint64_t getLoongArchPageDelta(uint64_t dest, uint64_t pc, RelType type);
void riscvFinalizeRelax(int passes);
-void mergeRISCVAttributesSections();
+void mergeRISCVAttributesSections(Ctx &);
void addArmInputSectionMappingSymbols();
void addArmSyntheticSectionMappingSymbol(Defined *);
void sortArmMappingSymbols();
More information about the llvm-commits
mailing list