blob: d466894badf9fdc0b796bcbfdbb96f12d6c8ef3b [file] [log] [blame]
//===- MMAPSupport.h - mmap portability wrappers ----------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file allows clients to use some functionality of mmap efficiently and
// portably. This is used for the pool allocator runtime implementations.
//
//===----------------------------------------------------------------------===//
#include "llvm/Config/config.h"
#include <cstdlib>
#include <cassert>
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
#define MAP_ANONYMOUS MAP_ANON
#endif /* defined(MAP_ANON) && !defined(MAP_ANONYMOUS) */
static inline void *
AllocateSpaceWithMMAP(size_t Size, bool UseNoReserve = false) {
// NOTE: this assumes Size is a multiple of the page size.
int FD = -1;
#ifdef NEED_DEV_ZERO_FOR_MMAP
static int DevZeroFD = open("/dev/zero", O_RDWR);
if (DevZeroFD == -1) {
perror("Can't open /dev/zero device");
abort();
}
FD = zero_fd;
#endif
int Flags = MAP_PRIVATE | MAP_ANONYMOUS;
#ifdef MAP_NORESERVE
if (UseNoReserve)
Flags |= MAP_NORESERVE;
#endif
void *Mem = ::mmap(0, Size, PROT_READ|PROT_WRITE, Flags, FD, 0);
assert(Mem != MAP_FAILED && "couldn't get space!");
return Mem;
}