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