53
53
#include " llvm/TextAPI/Architecture.h"
54
54
#include " llvm/TextAPI/PackedVersion.h"
55
55
56
+ #include < sys/mman.h>
57
+
56
58
using namespace llvm ;
57
59
using namespace llvm ::MachO;
58
60
using namespace llvm ::object;
@@ -334,11 +336,10 @@ class SerialBackgroundQueue {
334
336
// This code forces the page-ins on multiple threads so
335
337
// the process is not stalled waiting on disk buffer i/o.
336
338
void multiThreadedPageInBackground (DeferredFiles &deferred) {
337
- static const size_t pageSize = Process::getPageSizeEstimate ();
338
339
static const size_t largeArchive = 10 * 1024 * 1024 ;
339
340
#ifndef NDEBUG
340
341
using namespace std ::chrono;
341
- std::atomic_int numDeferedFilesTouched = 0 ;
342
+ std::atomic_int numDeferedFilesAdvised = 0 ;
342
343
static std::atomic_uint64_t totalBytes = 0 ;
343
344
auto t0 = high_resolution_clock::now ();
344
345
#endif
@@ -349,13 +350,19 @@ void multiThreadedPageInBackground(DeferredFiles &deferred) {
349
350
return ;
350
351
#ifndef NDEBUG
351
352
totalBytes += buff.size ();
352
- numDeferedFilesTouched += 1 ;
353
+ numDeferedFilesAdvised += 1 ;
353
354
#endif
354
355
356
+ #if _WIN32
357
+ static const size_t pageSize = Process::getPageSizeEstimate ();
355
358
// Reference all file's mmap'd pages to load them into memory.
356
359
for (const char *page = buff.data (), *end = page + buff.size (); page < end;
357
360
page += pageSize)
358
361
LLVM_ATTRIBUTE_UNUSED volatile char t = *page;
362
+ #else
363
+ // Advise that mmap'd files should be loaded into memory.
364
+ madvise ((void *)buff.data (), buff.size (), MADV_WILLNEED);
365
+ #endif
359
366
};
360
367
#if LLVM_ENABLE_THREADS
361
368
{ // Create scope for waiting for the taskGroup
@@ -376,7 +383,7 @@ void multiThreadedPageInBackground(DeferredFiles &deferred) {
376
383
auto dt = high_resolution_clock::now () - t0;
377
384
if (Process::GetEnv (" LLD_MULTI_THREAD_PAGE" ))
378
385
llvm::dbgs () << " multiThreadedPageIn " << totalBytes << " /"
379
- << numDeferedFilesTouched << " /" << deferred.size () << " /"
386
+ << numDeferedFilesAdvised << " /" << deferred.size () << " /"
380
387
<< duration_cast<milliseconds>(dt).count () / 1000 . << " \n " ;
381
388
#endif
382
389
}
0 commit comments