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