@@ -292,7 +292,7 @@ static void saveThinArchiveToRepro(ArchiveFile const *file) {
292
292
struct DeferredFile {
293
293
StringRef path;
294
294
bool isLazy;
295
- std::optional< MemoryBufferRef> buffer;
295
+ MemoryBufferRef buffer;
296
296
};
297
297
using DeferredFiles = std::vector<DeferredFile>;
298
298
@@ -346,10 +346,8 @@ void multiThreadedPageInBackground(DeferredFiles &deferred) {
346
346
std::atomic_int numDeferedFilesAdvised = 0 ;
347
347
auto t0 = high_resolution_clock::now ();
348
348
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 ();
353
351
if (buff.size () > largeArchive)
354
352
return ;
355
353
@@ -396,9 +394,12 @@ void multiThreadedPageInBackground(DeferredFiles &deferred) {
396
394
<< duration_cast<milliseconds>(dt).count () / 1000 . << " \n " ;
397
395
}
398
396
399
- static void multiThreadedPageIn (DeferredFiles &deferred) {
397
+ static void multiThreadedPageIn (const DeferredFiles &deferred) {
400
398
static SerialBackgroundQueue pageInQueue;
401
- pageInQueue.queueWork ([&]() { multiThreadedPageInBackground (deferred); });
399
+ pageInQueue.queueWork ([=]() {
400
+ DeferredFiles files = deferred;
401
+ multiThreadedPageInBackground (files);
402
+ });
402
403
}
403
404
404
405
static InputFile *processFile (std::optional<MemoryBufferRef> buffer,
@@ -573,12 +574,13 @@ static InputFile *addFile(StringRef path, LoadType loadType,
573
574
}
574
575
575
576
static void deferFile (StringRef path, bool isLazy, DeferredFiles &deferred) {
576
- if (config->readWorkers )
577
- return deferred.push_back ({path, isLazy, std::nullopt });
578
577
std::optional<MemoryBufferRef> buffer = readFile (path);
579
578
if (!buffer)
580
579
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);
582
584
}
583
585
584
586
static std::vector<StringRef> missingAutolinkWarnings;
@@ -1363,8 +1365,7 @@ static void createFiles(const InputArgList &args) {
1363
1365
bool isLazy = false ;
1364
1366
// If we've processed an opening --start-lib, without a matching --end-lib
1365
1367
bool inLib = false ;
1366
- static DeferredFiles deferredFiles;
1367
- deferredFiles.clear ();
1368
+ DeferredFiles deferredFiles;
1368
1369
1369
1370
for (const Arg *arg : args) {
1370
1371
const Option &opt = arg->getOption ();
@@ -1443,13 +1444,9 @@ static void createFiles(const InputArgList &args) {
1443
1444
if (config->readWorkers ) {
1444
1445
multiThreadedPageIn (deferredFiles);
1445
1446
1446
- static DeferredFiles archiveContents;
1447
+ DeferredFiles archiveContents;
1447
1448
std::vector<ArchiveFile *> archives;
1448
- archiveContents.clear ();
1449
-
1450
1449
for (auto &file : deferredFiles) {
1451
- if (!file.buffer .has_value ())
1452
- file.buffer = readFile (file.path );
1453
1450
auto inputFile = processFile (file.buffer , &archiveContents, file.path ,
1454
1451
LoadType::CommandLine, file.isLazy );
1455
1452
if (ArchiveFile *archive = dyn_cast<ArchiveFile>(inputFile))
0 commit comments