00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "config.h"
00022 #include "system.h"
00023 #include "coretypes.h"
00024 #include <sys/mman.h>
00025 #include "toplev.h"
00026 #include "config/host-darwin.h"
00027
00028
00029 static char pch_address_space[1024*1024*1024] __attribute__((aligned (4096)));
00030
00031
00032
00033 void *
00034 darwin_gt_pch_get_address (size_t sz, int fd ATTRIBUTE_UNUSED)
00035 {
00036 if (sz <= sizeof (pch_address_space))
00037 return pch_address_space;
00038 else
00039 return NULL;
00040 }
00041
00042
00043
00044
00045 int
00046 darwin_gt_pch_use_address (void *addr, size_t sz, int fd, size_t off)
00047 {
00048 const size_t pagesize = getpagesize();
00049 void *mmap_result;
00050 int ret;
00051
00052 gcc_assert ((size_t)pch_address_space % pagesize == 0
00053 && sizeof (pch_address_space) % pagesize == 0);
00054
00055 ret = (addr == pch_address_space && sz <= sizeof (pch_address_space));
00056 if (! ret)
00057 sz = 0;
00058
00059
00060 sz = (sz + pagesize - 1) / pagesize * pagesize;
00061
00062 if (munmap (pch_address_space + sz, sizeof (pch_address_space) - sz) != 0)
00063 fatal_error ("couldn't unmap pch_address_space: %m");
00064
00065 if (ret)
00066 {
00067 mmap_result = mmap (addr, sz,
00068 PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED,
00069 fd, off);
00070
00071
00072 ret = mmap_result != (void *) MAP_FAILED;
00073
00074
00075 gcc_assert (!ret || mmap_result == addr);
00076 }
00077
00078 return ret;
00079 }