@@ -292,7 +292,7 @@ static void saveThinArchiveToRepro(ArchiveFile const *file) {
292292struct DeferredFile {
293293 StringRef path;
294294 bool isLazy;
295- MemoryBufferRef buffer;
295+ std::optional< MemoryBufferRef> buffer;
296296};
297297using DeferredFiles = std::vector<DeferredFile>;
298298
@@ -346,8 +346,10 @@ void multiThreadedPageInBackground(DeferredFiles &deferred) {
346346 std::atomic_int numDeferedFilesAdvised = 0 ;
347347 auto t0 = high_resolution_clock::now ();
348348
349- auto preloadDeferredFile = [&](const DeferredFile &deferredFile) {
350- const StringRef &buff = deferredFile.buffer .getBuffer ();
349+ auto preloadDeferredFile = [&](DeferredFile &deferredFile) {
350+ if (!deferredFile.buffer .has_value ())
351+ deferredFile.buffer = *readFile (deferredFile.path );
352+ const StringRef &buff = (*deferredFile.buffer ).getBuffer ();
351353 if (buff.size () > largeArchive)
352354 return ;
353355
@@ -394,12 +396,9 @@ void multiThreadedPageInBackground(DeferredFiles &deferred) {
394396 << duration_cast<milliseconds>(dt).count () / 1000 . << " \n " ;
395397}
396398
397- static void multiThreadedPageIn (const DeferredFiles &deferred) {
399+ static void multiThreadedPageIn (DeferredFiles &deferred) {
398400 static SerialBackgroundQueue pageInQueue;
399- pageInQueue.queueWork ([=]() {
400- DeferredFiles files = deferred;
401- multiThreadedPageInBackground (files);
402- });
401+ pageInQueue.queueWork ([&]() { multiThreadedPageInBackground (deferred); });
403402}
404403
405404static InputFile *processFile (std::optional<MemoryBufferRef> buffer,
@@ -574,13 +573,12 @@ static InputFile *addFile(StringRef path, LoadType loadType,
574573}
575574
576575static void deferFile (StringRef path, bool isLazy, DeferredFiles &deferred) {
576+ if (config->readWorkers )
577+ return deferred.push_back ({path, isLazy, std::nullopt });
577578 std::optional<MemoryBufferRef> buffer = readFile (path);
578579 if (!buffer)
579580 return ;
580- if (config->readWorkers )
581- deferred.push_back ({path, isLazy, *buffer});
582- else
583- processFile (buffer, nullptr , path, LoadType::CommandLine, isLazy);
581+ processFile (buffer, nullptr , path, LoadType::CommandLine, isLazy);
584582}
585583
586584static std::vector<StringRef> missingAutolinkWarnings;
@@ -1365,7 +1363,8 @@ static void createFiles(const InputArgList &args) {
13651363 bool isLazy = false ;
13661364 // If we've processed an opening --start-lib, without a matching --end-lib
13671365 bool inLib = false ;
1368- DeferredFiles deferredFiles;
1366+ static DeferredFiles deferredFiles;
1367+ deferredFiles.clear ();
13691368
13701369 for (const Arg *arg : args) {
13711370 const Option &opt = arg->getOption ();
@@ -1444,9 +1443,13 @@ static void createFiles(const InputArgList &args) {
14441443 if (config->readWorkers ) {
14451444 multiThreadedPageIn (deferredFiles);
14461445
1447- DeferredFiles archiveContents;
1446+ static DeferredFiles archiveContents;
14481447 std::vector<ArchiveFile *> archives;
1448+ archiveContents.clear ();
1449+
14491450 for (auto &file : deferredFiles) {
1451+ if (!file.buffer .has_value ())
1452+ file.buffer = readFile (file.path );
14501453 auto inputFile = processFile (file.buffer , &archiveContents, file.path ,
14511454 LoadType::CommandLine, file.isLazy );
14521455 if (ArchiveFile *archive = dyn_cast<ArchiveFile>(inputFile))
0 commit comments