diff options
-rw-r--r-- | lld/ELF/Driver.cpp | 2 | ||||
-rw-r--r-- | lld/ELF/InputSection.cpp | 4 | ||||
-rw-r--r-- | lld/ELF/MarkLive.cpp | 4 | ||||
-rw-r--r-- | lld/ELF/SyntheticSections.cpp | 13 | ||||
-rw-r--r-- | lld/ELF/SyntheticSections.h | 2 |
5 files changed, 10 insertions, 15 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 2c29c518b4f..bcf4eebb4b1 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -1304,7 +1304,7 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) { // Do size optimizations: garbage collection, merging of SHF_MERGE sections // and identical code folding. decompressSections(); - splitSections(); + splitSections<ELFT>(); markLive<ELFT>(); demoteSymbols<ELFT>(); mergeSections(); diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 7b64621a146..9612c29cebf 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -836,10 +836,6 @@ static unsigned getReloc(IntTy Begin, IntTy Size, const ArrayRef<RelTy> &Rels, // .eh_frame is a sequence of CIE or FDE records. // This function splits an input section into records and returns them. template <class ELFT> void EhInputSection::split() { - // Early exit if already split. - if (!Pieces.empty()) - return; - if (AreRelocsRela) split<ELFT>(relas<ELFT>()); else diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp index d7cc74e48c1..afdb69ea456 100644 --- a/lld/ELF/MarkLive.cpp +++ b/lld/ELF/MarkLive.cpp @@ -159,10 +159,6 @@ scanEhFrameSection(EhInputSection &EH, if (!EH.NumRelocations) return; - // Unfortunately we need to split .eh_frame early since some relocations in - // .eh_frame keep other section alive and some don't. - EH.split<ELFT>(); - if (EH.AreRelocsRela) scanEhFrameSection<ELFT>(EH, EH.template relas<ELFT>(), Fn); else diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 306bee478ac..6f91a644997 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -460,10 +460,6 @@ template <class ELFT> void EhFrameSection::addSection(InputSectionBase *C) { for (auto *DS : Sec->DependentSections) DependentSections.push_back(DS); - // .eh_frame is a sequence of CIE or FDE records. This function - // splits it into pieces so that we can call - // SplitInputSection::getSectionPiece on the section. - Sec->split<ELFT>(); if (Sec->Pieces.empty()) return; @@ -2540,12 +2536,14 @@ void elf::decompressSections() { [](InputSectionBase *Sec) { Sec->maybeDecompress(); }); } -void elf::splitSections() { +template <class ELFT> void elf::splitSections() { // splitIntoPieces needs to be called on each MergeInputSection // before calling finalizeContents(). parallelForEach(InputSections, [](InputSectionBase *Sec) { if (auto *S = dyn_cast<MergeInputSection>(Sec)) S->splitIntoPieces(); + else if (auto *Eh = dyn_cast<EhInputSection>(Sec)) + Eh->split<ELFT>(); }); } @@ -2702,6 +2700,11 @@ template GdbIndexSection *elf::createGdbIndex<ELF32BE>(); template GdbIndexSection *elf::createGdbIndex<ELF64LE>(); template GdbIndexSection *elf::createGdbIndex<ELF64BE>(); +template void elf::splitSections<ELF32LE>(); +template void elf::splitSections<ELF32BE>(); +template void elf::splitSections<ELF64LE>(); +template void elf::splitSections<ELF64BE>(); + template void EhFrameSection::addSection<ELF32LE>(InputSectionBase *); template void EhFrameSection::addSection<ELF32BE>(InputSectionBase *); template void EhFrameSection::addSection<ELF64LE>(InputSectionBase *); diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h index bd442a58262..f27b91b4d6b 100644 --- a/lld/ELF/SyntheticSections.h +++ b/lld/ELF/SyntheticSections.h @@ -834,7 +834,7 @@ private: InputSection *createInterpSection(); MergeInputSection *createCommentSection(); void decompressSections(); -void splitSections(); +template <class ELFT> void splitSections(); void mergeSections(); Defined *addSyntheticLocal(StringRef Name, uint8_t Type, uint64_t Value, |