From 53a1fb0cd73382498fe79f95521c350409fd40b9 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sat, 5 Oct 2024 09:37:27 -0700 Subject: [PATCH] [ELF] Pass Ctx & --- lld/ELF/AArch64ErrataFix.h | 4 ++- lld/ELF/InputSection.cpp | 4 +-- lld/ELF/Writer.cpp | 68 +++++++++++++++++++------------------- 3 files changed, 39 insertions(+), 37 deletions(-) diff --git a/lld/ELF/AArch64ErrataFix.h b/lld/ELF/AArch64ErrataFix.h index fa34beb5d7a8..cab0b0433698 100644 --- a/lld/ELF/AArch64ErrataFix.h +++ b/lld/ELF/AArch64ErrataFix.h @@ -14,7 +14,7 @@ #include namespace lld::elf { - +struct Ctx; class Defined; class InputSection; class InputSectionDescription; @@ -22,6 +22,7 @@ class Patch843419Section; class AArch64Err843419Patcher { public: + AArch64Err843419Patcher(Ctx &ctx) : ctx(ctx) {} // return true if Patches have been added to the OutputSections. bool createFixes(); @@ -34,6 +35,7 @@ private: void init(); + Ctx &ctx; // A cache of the mapping symbols defined by the InputSection sorted in order // of ascending value with redundant symbols removed. These describe // the ranges of code and data in an executable InputSection. diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 7c8da8944e50..eb6de90a02f6 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -77,7 +77,7 @@ InputSectionBase::InputSectionBase(InputFile *file, uint64_t flags, // SHF_INFO_LINK and SHF_GROUP are normally resolved and not copied to the // output section. However, for relocatable linking without // --force-group-allocation, the SHF_GROUP flag and section groups are retained. -static uint64_t getFlags(uint64_t flags) { +static uint64_t getFlags(Ctx &ctx, uint64_t flags) { flags &= ~(uint64_t)SHF_INFO_LINK; if (ctx.arg.resolveGroups) flags &= ~(uint64_t)SHF_GROUP; @@ -88,7 +88,7 @@ template InputSectionBase::InputSectionBase(ObjFile &file, const typename ELFT::Shdr &hdr, StringRef name, Kind sectionKind) - : InputSectionBase(&file, getFlags(hdr.sh_flags), hdr.sh_type, + : InputSectionBase(&file, getFlags(ctx, hdr.sh_flags), hdr.sh_type, hdr.sh_entsize, hdr.sh_link, hdr.sh_info, hdr.sh_addralign, getSectionContents(file, hdr), name, sectionKind) { diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index c413ebd349e6..c922d0366ae6 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -1424,7 +1424,7 @@ template void Writer::resolveShfLinkOrder() { } } -static void finalizeSynthetic(SyntheticSection *sec) { +static void finalizeSynthetic(Ctx &ctx, SyntheticSection *sec) { if (sec && sec->isNeeded() && sec->getParent()) { llvm::TimeTraceScope timeScope("Finalize synthetic sections", sec->name); sec->finalizeContents(ctx); @@ -1438,7 +1438,7 @@ static void finalizeSynthetic(SyntheticSection *sec) { template void Writer::finalizeAddressDependentContent() { llvm::TimeTraceScope timeScope("Finalize address dependent content"); ThunkCreator tc(ctx); - AArch64Err843419Patcher a64p; + AArch64Err843419Patcher a64p(ctx); ARMErr657417Patcher a32p; ctx.script->assignAddresses(); @@ -1449,7 +1449,7 @@ template void Writer::finalizeAddressDependentContent() { // section order. const auto finalizeOrderDependentContent = [this] { for (Partition &part : ctx.partitions) - finalizeSynthetic(part.armExidx.get()); + finalizeSynthetic(ctx, part.armExidx.get()); resolveShfLinkOrder(); }; finalizeOrderDependentContent(); @@ -1486,7 +1486,7 @@ template void Writer::finalizeAddressDependentContent() { changed |= a32p.createFixes(); } - finalizeSynthetic(ctx.in.got.get()); + finalizeSynthetic(ctx, ctx.in.got.get()); if (ctx.in.mipsGot) ctx.in.mipsGot->updateAllocSize(); @@ -1783,7 +1783,7 @@ template void Writer::finalizeSections() { { llvm::TimeTraceScope timeScope("Finalize .eh_frame"); for (Partition &part : ctx.partitions) - finalizeSynthetic(part.ehFrame.get()); + finalizeSynthetic(ctx, part.ehFrame.get()); } } @@ -1983,20 +1983,20 @@ template void Writer::finalizeSections() { { llvm::TimeTraceScope timeScope("Finalize synthetic sections"); - finalizeSynthetic(ctx.in.bss.get()); - finalizeSynthetic(ctx.in.bssRelRo.get()); - finalizeSynthetic(ctx.in.symTabShndx.get()); - finalizeSynthetic(ctx.in.shStrTab.get()); - finalizeSynthetic(ctx.in.strTab.get()); - finalizeSynthetic(ctx.in.got.get()); - finalizeSynthetic(ctx.in.mipsGot.get()); - finalizeSynthetic(ctx.in.igotPlt.get()); - finalizeSynthetic(ctx.in.gotPlt.get()); - finalizeSynthetic(ctx.in.relaPlt.get()); - finalizeSynthetic(ctx.in.plt.get()); - finalizeSynthetic(ctx.in.iplt.get()); - finalizeSynthetic(ctx.in.ppc32Got2.get()); - finalizeSynthetic(ctx.in.partIndex.get()); + finalizeSynthetic(ctx, ctx.in.bss.get()); + finalizeSynthetic(ctx, ctx.in.bssRelRo.get()); + finalizeSynthetic(ctx, ctx.in.symTabShndx.get()); + finalizeSynthetic(ctx, ctx.in.shStrTab.get()); + finalizeSynthetic(ctx, ctx.in.strTab.get()); + finalizeSynthetic(ctx, ctx.in.got.get()); + finalizeSynthetic(ctx, ctx.in.mipsGot.get()); + finalizeSynthetic(ctx, ctx.in.igotPlt.get()); + finalizeSynthetic(ctx, ctx.in.gotPlt.get()); + finalizeSynthetic(ctx, ctx.in.relaPlt.get()); + finalizeSynthetic(ctx, ctx.in.plt.get()); + finalizeSynthetic(ctx, ctx.in.iplt.get()); + finalizeSynthetic(ctx, ctx.in.ppc32Got2.get()); + finalizeSynthetic(ctx, ctx.in.partIndex.get()); // Dynamic section must be the last one in this list and dynamic // symbol table section (dynSymTab) must be the first one. @@ -2005,25 +2005,25 @@ template void Writer::finalizeSections() { part.relaDyn->mergeRels(); // Compute DT_RELACOUNT to be used by part.dynamic. part.relaDyn->partitionRels(); - finalizeSynthetic(part.relaDyn.get()); + finalizeSynthetic(ctx, part.relaDyn.get()); } if (part.relrDyn) { part.relrDyn->mergeRels(); - finalizeSynthetic(part.relrDyn.get()); + finalizeSynthetic(ctx, part.relrDyn.get()); } if (part.relrAuthDyn) { part.relrAuthDyn->mergeRels(); - finalizeSynthetic(part.relrAuthDyn.get()); + finalizeSynthetic(ctx, part.relrAuthDyn.get()); } - finalizeSynthetic(part.dynSymTab.get()); - finalizeSynthetic(part.gnuHashTab.get()); - finalizeSynthetic(part.hashTab.get()); - finalizeSynthetic(part.verDef.get()); - finalizeSynthetic(part.ehFrameHdr.get()); - finalizeSynthetic(part.verSym.get()); - finalizeSynthetic(part.verNeed.get()); - finalizeSynthetic(part.dynamic.get()); + finalizeSynthetic(ctx, part.dynSymTab.get()); + finalizeSynthetic(ctx, part.gnuHashTab.get()); + finalizeSynthetic(ctx, part.hashTab.get()); + finalizeSynthetic(ctx, part.verDef.get()); + finalizeSynthetic(ctx, part.ehFrameHdr.get()); + finalizeSynthetic(ctx, part.verSym.get()); + finalizeSynthetic(ctx, part.verNeed.get()); + finalizeSynthetic(ctx, part.dynamic.get()); } } @@ -2061,10 +2061,10 @@ template void Writer::finalizeSections() { llvm::TimeTraceScope timeScope("Finalize synthetic sections"); // finalizeAddressDependentContent may have added local symbols to the // static symbol table. - finalizeSynthetic(ctx.in.symTab.get()); - finalizeSynthetic(ctx.in.debugNames.get()); - finalizeSynthetic(ctx.in.ppc64LongBranchTarget.get()); - finalizeSynthetic(ctx.in.armCmseSGSection.get()); + finalizeSynthetic(ctx, ctx.in.symTab.get()); + finalizeSynthetic(ctx, ctx.in.debugNames.get()); + finalizeSynthetic(ctx, ctx.in.ppc64LongBranchTarget.get()); + finalizeSynthetic(ctx, ctx.in.armCmseSGSection.get()); } // Relaxation to delete inter-basic block jumps created by basic block