diff --git a/lld/MachO/Writer.cpp b/lld/MachO/Writer.cpp --- a/lld/MachO/Writer.cpp +++ b/lld/MachO/Writer.cpp @@ -29,6 +29,7 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/Parallel.h" #include "llvm/Support/Path.h" +#include "llvm/Support/ThreadPool.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/Support/xxhash.h" @@ -64,6 +65,7 @@ template void run(); + ThreadPool threadPool; std::unique_ptr &buffer; uint64_t addr = 0; uint64_t fileOff = 0; @@ -1035,10 +1037,14 @@ dataInCodeSection, functionStartsSection, }; - parallelForEach(linkEditSections, [](LinkEditSection *osec) { + SmallVector> threadFutures; + threadFutures.reserve(linkEditSections.size()); + for (LinkEditSection *osec : linkEditSections) if (osec) - osec->finalizeContents(); - }); + threadFutures.emplace_back(threadPool.async( + [](LinkEditSection *osec) { osec->finalizeContents(); }, osec)); + for (std::shared_future &future : threadFutures) + future.wait(); // Now that __LINKEDIT is filled out, do a proper calculation of its // addresses and offsets. @@ -1091,14 +1097,21 @@ // values. void Writer::writeUuid() { TimeTraceScope timeScope("Computing UUID"); + ArrayRef data{buffer->getBufferStart(), buffer->getBufferEnd()}; unsigned chunkCount = parallel::strategy.compute_thread_count() * 10; // Round-up integer division size_t chunkSize = (data.size() + chunkCount - 1) / chunkCount; std::vector> chunks = split(data, chunkSize); std::vector hashes(chunks.size()); - parallelForEachN(0, chunks.size(), - [&](size_t i) { hashes[i] = xxHash64(chunks[i]); }); + SmallVector> threadFutures; + threadFutures.reserve(chunks.size()); + for (size_t i = 0; i < chunks.size(); ++i) + threadFutures.emplace_back(threadPool.async( + [&](size_t i) { hashes[i] = xxHash64(chunks[i]); }, i)); + for (std::shared_future &future : threadFutures) + future.wait(); + uint64_t digest = xxHash64({reinterpret_cast(hashes.data()), hashes.size() * sizeof(uint64_t)}); uuidCommand->writeUuid(digest); @@ -1147,8 +1160,8 @@ sortSegmentsAndSections(); createLoadCommands(); finalizeAddresses(); + threadPool.async(writeMapFile); finalizeLinkEditSegment(); - writeMapFile(); writeOutputFile(); }