summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Driver.cpp2
-rw-r--r--lld/ELF/InputSection.cpp4
-rw-r--r--lld/ELF/MarkLive.cpp4
-rw-r--r--lld/ELF/SyntheticSections.cpp13
-rw-r--r--lld/ELF/SyntheticSections.h2
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,
OpenPOWER on IntegriCloud