@@ -292,7 +292,7 @@ static void saveThinArchiveToRepro(ArchiveFile const *file) {
292292struct DeferredFile {
293293 StringRef path;
294294 bool isLazy;
295- std::optional< MemoryBufferRef> buffer;
295+ MemoryBufferRef buffer;
296296};
297297using DeferredFiles = std::vector<DeferredFile>;
298298
@@ -346,10 +346,8 @@ void multiThreadedPageInBackground(DeferredFiles &deferred) {
346346 std::atomic_int numDeferedFilesAdvised = 0 ;
347347 auto t0 = high_resolution_clock::now ();
348348
349- auto preloadDeferredFile = [&](DeferredFile &deferredFile) {
350- if (!deferredFile.buffer .has_value ())
351- deferredFile.buffer = *readFile (deferredFile.path );
352- const StringRef &buff = (*deferredFile.buffer ).getBuffer ();
349+ auto preloadDeferredFile = [&](const DeferredFile &deferredFile) {
350+ const StringRef &buff = deferredFile.buffer .getBuffer ();
353351 if (buff.size () > largeArchive)
354352 return ;
355353
@@ -396,9 +394,12 @@ void multiThreadedPageInBackground(DeferredFiles &deferred) {
396394 << duration_cast<milliseconds>(dt).count () / 1000 . << " \n " ;
397395}
398396
399- static void multiThreadedPageIn (DeferredFiles &deferred) {
397+ static void multiThreadedPageIn (const DeferredFiles &deferred) {
400398 static SerialBackgroundQueue pageInQueue;
401- pageInQueue.queueWork ([&]() { multiThreadedPageInBackground (deferred); });
399+ pageInQueue.queueWork ([=]() {
400+ DeferredFiles files = deferred;
401+ multiThreadedPageInBackground (files);
402+ });
402403}
403404
404405static InputFile *processFile (std::optional<MemoryBufferRef> buffer,
@@ -573,12 +574,13 @@ static InputFile *addFile(StringRef path, LoadType loadType,
573574}
574575
575576static void deferFile (StringRef path, bool isLazy, DeferredFiles &deferred) {
576- if (config->readWorkers )
577- return deferred.push_back ({path, isLazy, std::nullopt });
578577 std::optional<MemoryBufferRef> buffer = readFile (path);
579578 if (!buffer)
580579 return ;
581- processFile (buffer, nullptr , path, LoadType::CommandLine, isLazy);
580+ if (config->readWorkers )
581+ deferred.push_back ({path, isLazy, *buffer});
582+ else
583+ processFile (buffer, nullptr , path, LoadType::CommandLine, isLazy);
582584}
583585
584586static std::vector<StringRef> missingAutolinkWarnings;
@@ -1363,8 +1365,7 @@ static void createFiles(const InputArgList &args) {
13631365 bool isLazy = false ;
13641366 // If we've processed an opening --start-lib, without a matching --end-lib
13651367 bool inLib = false ;
1366- static DeferredFiles deferredFiles;
1367- deferredFiles.clear ();
1368+ DeferredFiles deferredFiles;
13681369
13691370 for (const Arg *arg : args) {
13701371 const Option &opt = arg->getOption ();
@@ -1443,13 +1444,9 @@ static void createFiles(const InputArgList &args) {
14431444 if (config->readWorkers ) {
14441445 multiThreadedPageIn (deferredFiles);
14451446
1446- static DeferredFiles archiveContents;
1447+ DeferredFiles archiveContents;
14471448 std::vector<ArchiveFile *> archives;
1448- archiveContents.clear ();
1449-
14501449 for (auto &file : deferredFiles) {
1451- if (!file.buffer .has_value ())
1452- file.buffer = readFile (file.path );
14531450 auto inputFile = processFile (file.buffer , &archiveContents, file.path ,
14541451 LoadType::CommandLine, file.isLazy );
14551452 if (ArchiveFile *archive = dyn_cast<ArchiveFile>(inputFile))
0 commit comments