Loading...
--- dyld/dyld-1162/common/Algorithm.h
+++ dyld/dyld-1335/common/Algorithm.h
@@ -24,8 +24,6 @@
#ifndef Algorithm_h
#define Algorithm_h
-#if BUILDING_MACHO_WRITER
-
#include <atomic>
#include <algorithm>
#include <optional>
@@ -69,8 +67,19 @@
// call map(elements range) on each MAP object for a subrange of elements
const size_t chunkCount = (elements.size() + (elementsPerChunk - 1)) / elementsPerChunk;
const size_t lastChunkIndex = chunkCount - 1;
- ChunkTy chunksStorage[chunkCount];
- ChunkTy* chunks = chunksStorage; // work around clang bug
+
+ // rdar://130080127 (Inputs with lots of potential duplicate functions may exhaust available stack space)
+ std::unique_ptr<ChunkTy[]> chunksHeapStorage;
+ ChunkTy* chunks = nullptr;
+ constexpr size_t MaxStackAllocaSize = 1 << 17; // limit at 128kb
+ if ( (sizeof(ChunkTy) * chunkCount) <= MaxStackAllocaSize ) {
+ void* space = alloca(sizeof(ChunkTy) * chunkCount);
+ chunks = new (space) ChunkTy[chunkCount];
+ } else {
+ chunksHeapStorage = std::make_unique<ChunkTy[]>(chunkCount);
+ chunks = chunksHeapStorage.get();
+ }
+
dispatchApply(std::span(chunks, chunkCount), ^(size_t i, ChunkTy& chunk) {
if ( i == lastChunkIndex )
map(i, chunk, elements.subspan(i * elementsPerChunk)); // Run the last chunk with whatever is left over
@@ -222,6 +231,24 @@
outVec.reserve(outVec.size() + totalSize);
for ( auto& chunk : chunks ) {
+ if ( !chunk.empty() )
+ outVec.insert(outVec.end(), chunk.begin(), chunk.end());
+ }
+}
+
+template<typename ValTy>
+inline void mergeVectorChunks(std::vector<ValTy>& outVec, std::vector<ValTy>* chunks, size_t numChunks, size_t stride)
+{
+ size_t totalSize = 0;
+ for ( size_t i = 0; i < numChunks; ++i ) {
+ std::vector<ValTy>* chunk = (std::vector<ValTy>*)((uint8_t*)chunks + i * stride);
+ totalSize += chunk->size();
+ }
+ if ( totalSize == 0 ) return;
+
+ outVec.reserve(outVec.size() + totalSize);
+ for ( size_t i = 0; i < numChunks; ++i ) {
+ std::vector<ValTy>& chunk = *(std::vector<ValTy>*)((uint8_t*)chunks + i * stride);
if ( !chunk.empty() )
outVec.insert(outVec.end(), chunk.begin(), chunk.end());
}
@@ -389,6 +416,4 @@
parallelSort(c, std::less<std::remove_reference_t<decltype(*c.begin())>>{});
}
-#endif
-
#endif /* Algorithm_h */