@@ -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,11 +396,10 @@ 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);
401
+ pageInQueue.queueWork ([&]() {
402
+ multiThreadedPageInBackground (deferred);
402
403
});
403
404
}
404
405
@@ -574,13 +575,12 @@ static InputFile *addFile(StringRef path, LoadType loadType,
574
575
}
575
576
576
577
static void deferFile (StringRef path, bool isLazy, DeferredFiles &deferred) {
578
+ if (config->readWorkers )
579
+ return deferred.push_back ({path, isLazy, std::nullopt });
577
580
std::optional<MemoryBufferRef> buffer = readFile (path);
578
581
if (!buffer)
579
582
return ;
580
- if (config->readWorkers )
581
- deferred.push_back ({path, isLazy, *buffer});
582
- else
583
- processFile (buffer, nullptr , path, LoadType::CommandLine, isLazy);
583
+ processFile (buffer, nullptr , path, LoadType::CommandLine, isLazy);
584
584
}
585
585
586
586
static std::vector<StringRef> missingAutolinkWarnings;
@@ -1365,7 +1365,8 @@ static void createFiles(const InputArgList &args) {
1365
1365
bool isLazy = false ;
1366
1366
// If we've processed an opening --start-lib, without a matching --end-lib
1367
1367
bool inLib = false ;
1368
- DeferredFiles deferredFiles;
1368
+ static DeferredFiles deferredFiles;
1369
+ deferredFiles.clear ();
1369
1370
1370
1371
for (const Arg *arg : args) {
1371
1372
const Option &opt = arg->getOption ();
@@ -1444,9 +1445,13 @@ static void createFiles(const InputArgList &args) {
1444
1445
if (config->readWorkers ) {
1445
1446
multiThreadedPageIn (deferredFiles);
1446
1447
1447
- DeferredFiles archiveContents;
1448
+ static DeferredFiles archiveContents;
1448
1449
std::vector<ArchiveFile *> archives;
1450
+ archiveContents.clear ();
1451
+
1449
1452
for (auto &file : deferredFiles) {
1453
+ if (!file.buffer .has_value ())
1454
+ file.buffer = readFile (file.path );
1450
1455
auto inputFile = processFile (file.buffer , &archiveContents, file.path ,
1451
1456
LoadType::CommandLine, file.isLazy );
1452
1457
if (ArchiveFile *archive = dyn_cast<ArchiveFile>(inputFile))
0 commit comments