diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 42b34e379e53..5fc7e35ecacb 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -167,7 +167,6 @@ public: } void flushSymbols(); void flushSection(); - void finalize(); private: OutputSectionFactory &Factory; @@ -236,16 +235,6 @@ template void OutputSectionBuilder::flushSection() { Current = nullptr; } -template void OutputSectionBuilder::finalize() { - // Assign offsets to all sections which don't contain symbols - for (OutputSectionBase *S : *OutputSections) - if (llvm::find_if(OwningSections, - [&](std::unique_ptr> &L) { - return L->OutSec == S; - }) == OwningSections.end()) - S->assignOffsets(); -} - template static bool compareName(InputSectionBase *A, InputSectionBase *B) { return A->getSectionName() < B->getSectionName(); @@ -325,7 +314,6 @@ void LinkerScript::createSections( // Remove from the output all the sections which did not meet // the optional constraints. filter(); - Builder.finalize(); } template @@ -357,11 +345,11 @@ template void LinkerScript::filter() { } template void assignOffsets(OutputSectionBase *Sec) { - // Non-zero size means we have assigned offsets earlier in - // OutputSectionBuilder::finalize auto *OutSec = dyn_cast>(Sec); - if (Sec->getSize() || !OutSec) + if (!OutSec) { + Sec->assignOffsets(); return; + } typedef typename ELFT::uint uintX_t; uintX_t Off = 0; @@ -448,6 +436,7 @@ template void LinkerScript::assignAddresses() { Dot += Sec->getSize(); continue; } + Sec->assignOffsets(); } }