diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 470325f41618ccc80dbcc4a6d26c7c681ed34ef8..59258ce8edb396d9e0de3cf33c6a0b706edb8d85 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -942,14 +942,15 @@ template void LinkerDriver::link(opt::InputArgList &Args) { // MergeInputSection::splitIntoPieces needs to be called before // any call of MergeInputSection::getOffset. Do that. - forEach(InputSections.begin(), InputSections.end(), [](InputSectionBase *S) { - if (!S->Live) - return; - if (Decompressor::isCompressedELFSection(S->Flags, S->Name)) - S->uncompress(); - if (auto *MS = dyn_cast(S)) - MS->splitIntoPieces(); - }); + parallelForEach(InputSections.begin(), InputSections.end(), + [](InputSectionBase *S) { + if (!S->Live) + return; + if (Decompressor::isCompressedELFSection(S->Flags, S->Name)) + S->uncompress(); + if (auto *MS = dyn_cast(S)) + MS->splitIntoPieces(); + }); // Write the result to the file. writeResult(); diff --git a/lld/ELF/ICF.cpp b/lld/ELF/ICF.cpp index 233b866cdc14b5d3234e1e6ac3819d4fb984f6d0..a9de0fc71eb632f891e77166770759c6a489d202 100644 --- a/lld/ELF/ICF.cpp +++ b/lld/ELF/ICF.cpp @@ -325,8 +325,9 @@ void ICF::forEachClass(std::function Fn) { // Split sections into 256 shards and call Fn in parallel. size_t NumShards = 256; size_t Step = Sections.size() / NumShards; - forLoop(0, NumShards, - [&](size_t I) { forEachClassRange(I * Step, (I + 1) * Step, Fn); }); + parallelFor(0, NumShards, [&](size_t I) { + forEachClassRange(I * Step, (I + 1) * Step, Fn); + }); forEachClassRange(Step * NumShards, Sections.size(), Fn); ++Cnt; } diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index c159669fbab2df9d911005f9322cfaeb22e983e9..cda8a2b3f422dbce6439b8ac6d442d6ed1c55048 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -238,8 +238,8 @@ template void OutputSection::writeTo(uint8_t *Buf) { if (uint32_t Filler = Script->getFiller(this->Name)) fill(Buf, this->Size, Filler); - auto Fn = [=](InputSection *IS) { IS->writeTo(Buf); }; - forEach(Sections.begin(), Sections.end(), Fn); + parallelForEach(Sections.begin(), Sections.end(), + [=](InputSection *IS) { IS->writeTo(Buf); }); // Linker scripts may have BYTE()-family commands with which you // can write arbitrary bytes to the output. Process them if any. diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index c98f152e29fbb6cde66b5c410eeaf880c12b2eb8..22c7f2689957a9f58697c0d63066b3ee4ec82097 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -356,8 +356,9 @@ void BuildIdSection::computeHash( std::vector Hashes(Chunks.size() * HashSize); // Compute hash values. - forLoop(0, Chunks.size(), - [&](size_t I) { HashFn(Hashes.data() + I * HashSize, Chunks[I]); }); + parallelFor(0, Chunks.size(), [&](size_t I) { + HashFn(Hashes.data() + I * HashSize, Chunks[I]); + }); // Write to the final output buffer. HashFn(HashBuf, Hashes); diff --git a/lld/ELF/Threads.h b/lld/ELF/Threads.h index c03e15253e15b467e91eef545eb81621db6e9fc3..3df9636068a2e8126b652bda530ae98d119306ac 100644 --- a/lld/ELF/Threads.h +++ b/lld/ELF/Threads.h @@ -69,14 +69,15 @@ namespace lld { namespace elf { template -void forEach(IterTy Begin, IterTy End, FuncTy Fn) { +void parallelForEach(IterTy Begin, IterTy End, FuncTy Fn) { if (Config->Threads) parallel_for_each(Begin, End, Fn); else std::for_each(Begin, End, Fn); } -inline void forLoop(size_t Begin, size_t End, std::function Fn) { +inline void parallelFor(size_t Begin, size_t End, + std::function Fn) { if (Config->Threads) { parallel_for(Begin, End, Fn); } else {