blob: 35efaa6fcb973fc1162be897dc8869330f718f5e [file] [log] [blame]
Chris Lattnerbdbd2d72008-04-01 03:10:22 +00001//===- Unix/MappedFile.inc - Unix MappedFile Implementation -----*- C++ -*-===//
Reid Spencer97374922004-10-04 11:08:32 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer97374922004-10-04 11:08:32 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file provides the generic Unix implementation of the MappedFile concept.
11//
12//===----------------------------------------------------------------------===//
13
Reid Spencer97374922004-10-04 11:08:32 +000014#include "Unix.h"
Reid Spencercdf54d02004-12-27 06:16:52 +000015#include "llvm/System/Process.h"
16
17#ifdef HAVE_FCNTL_H
Tanya Lattnerc5a0bbf2004-10-05 00:51:26 +000018#include <fcntl.h>
Reid Spencercdf54d02004-12-27 06:16:52 +000019#endif
20
21#ifdef HAVE_SYS_MMAN_H
Reid Spencer97374922004-10-04 11:08:32 +000022#include <sys/mman.h>
Reid Spencercdf54d02004-12-27 06:16:52 +000023#endif
24
25#ifdef HAVE_SYS_STAT_H
26#include <sys/stat.h>
27#endif
Reid Spencer97374922004-10-04 11:08:32 +000028
Chris Lattner540630f2008-04-01 00:53:25 +000029using namespace llvm;
Reid Spencer97374922004-10-04 11:08:32 +000030using namespace sys;
31
Chris Lattner540630f2008-04-01 00:53:25 +000032namespace llvm {
33 namespace sys {
34 struct MappedFileInfo {
35 int FD;
36 off_t Size;
37 };
38 }
39}
Reid Spencer97374922004-10-04 11:08:32 +000040
Reid Spencer6d045fc2006-08-22 16:04:22 +000041bool MappedFile::initialize(std::string* ErrMsg) {
Chris Lattnerbdbd2d72008-04-01 03:10:22 +000042 int FD = ::open(Path.c_str(), O_RDONLY);
Reid Spencer6d045fc2006-08-22 16:04:22 +000043 if (FD < 0) {
Chris Lattner540630f2008-04-01 00:53:25 +000044 MakeErrMsg(ErrMsg, "can't open file '" + Path.toString() + "'");
Reid Spencer6d045fc2006-08-22 16:04:22 +000045 return true;
46 }
Chris Lattner540630f2008-04-01 00:53:25 +000047 const FileStatus *Status = Path.getFileStatus(false, ErrMsg);
Reid Spencer1ea733d2007-03-29 19:11:22 +000048 if (!Status) {
Chris Lattnercca68fa2006-07-18 06:57:51 +000049 ::close(FD);
Reid Spencer6d045fc2006-08-22 16:04:22 +000050 return true;
Reid Spencer97374922004-10-04 11:08:32 +000051 }
Chris Lattner540630f2008-04-01 00:53:25 +000052 MapInfo = new MappedFileInfo();
53 MapInfo->FD = FD;
54 MapInfo->Size = Status->getSize();
Reid Spencer6d045fc2006-08-22 16:04:22 +000055 return false;
Reid Spencer97374922004-10-04 11:08:32 +000056}
57
58void MappedFile::terminate() {
Chris Lattner23ffec82008-04-01 03:49:38 +000059 unmap();
Chris Lattner540630f2008-04-01 00:53:25 +000060 assert(MapInfo && "MappedFile not initialized");
61 ::close(MapInfo->FD);
62 delete MapInfo;
63 MapInfo = 0;
Reid Spencer97374922004-10-04 11:08:32 +000064}
65
66void MappedFile::unmap() {
Chris Lattner540630f2008-04-01 00:53:25 +000067 assert(MapInfo && "MappedFile not initialized");
68 if (!isMapped()) return;
69
Chris Lattner540630f2008-04-01 00:53:25 +000070 ::munmap(BasePtr, MapInfo->Size);
71 BasePtr = 0; // Mark this as non-mapped.
Reid Spencer97374922004-10-04 11:08:32 +000072}
73
Chris Lattner23ffec82008-04-01 03:49:38 +000074const void* MappedFile::map(std::string* ErrMsg) {
Chris Lattner540630f2008-04-01 00:53:25 +000075 assert(MapInfo && "MappedFile not initialized");
76 if (isMapped()) return BasePtr;
77
Chris Lattnerbdbd2d72008-04-01 03:10:22 +000078 int prot = PROT_READ;
79 int flags = MAP_PRIVATE;
Chris Lattner341e1da2004-10-05 00:46:21 +000080#ifdef MAP_FILE
Chris Lattner540630f2008-04-01 00:53:25 +000081 flags |= MAP_FILE;
Chris Lattner341e1da2004-10-05 00:46:21 +000082#endif
Chris Lattnerbdbd2d72008-04-01 03:10:22 +000083 size_t PageSize = Process::GetPageSize();
84 size_t map_size = ((MapInfo->Size / PageSize)+1) * PageSize;
Chris Lattner540630f2008-04-01 00:53:25 +000085
86 BasePtr = ::mmap(0, map_size, prot, flags, MapInfo->FD, 0);
87 if (BasePtr == MAP_FAILED) {
88 MakeErrMsg(ErrMsg, "Can't map file:" + Path.toString());
89 return 0;
90 }
91 return BasePtr;
Reid Spencer97374922004-10-04 11:08:32 +000092}
93
Reid Spencer56c3ed82004-12-13 02:58:51 +000094size_t MappedFile::size() const {
Chris Lattner540630f2008-04-01 00:53:25 +000095 assert(MapInfo && "MappedFile not initialized");
96 return MapInfo->Size;
Reid Spencer97374922004-10-04 11:08:32 +000097}
98