re PR pch/14940 (PCH largefile test fails on various platforms)
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Mon, 12 Jul 2010 11:57:16 +0000 (11:57 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Mon, 12 Jul 2010 11:57:16 +0000 (11:57 +0000)
PR pch/14940
* config/host-solaris.c (mmap_fixed): New function.
(sol_gt_pch_get_address): Use it.
(sol_gt_pch_use_address): Likewise.

From-SVN: r162074

gcc/ChangeLog
gcc/config/host-solaris.c

index 571551ac232b82559c4922500f1dc064248eb5f1..47a87affe3f14868acd4e1fcc6dcbe587a35c32b 100644 (file)
@@ -1,3 +1,10 @@
+2010-07-12  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       PR pch/14940
+       * config/host-solaris.c (mmap_fixed): New function.
+       (sol_gt_pch_get_address): Use it.
+       (sol_gt_pch_use_address): Likewise.
+
 2010-07-12  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * config.gcc (i[34567]86-*-solaris2*): Default with_arch_32 to
index 1d51a8d21278073c96d6162294530f67353e6534..835832b9c21f33be7e0df1c566c74b8bfacf82b2 100644 (file)
 #undef HOST_HOOKS_GT_PCH_USE_ADDRESS
 #define HOST_HOOKS_GT_PCH_USE_ADDRESS sol_gt_pch_use_address
 
+/* Before Solaris 11, the mmap ADDR parameter is mostly ignored without
+   MAP_FIXED set.  Before we give up, search the desired address space with
+   mincore to see if the space is really free.  */
+
+static void *
+mmap_fixed (void *addr, size_t len, int prot, int flags, int fd, off_t off)
+{
+  void *base;
+
+  base = mmap ((caddr_t) addr, len, prot, flags, fd, off);
+  
+  if (base != addr)
+    {
+      size_t page_size = getpagesize();
+      char one_byte;
+      size_t i;
+
+      if (base != (void *) MAP_FAILED)
+       munmap ((caddr_t) base, len);
+
+      errno = 0;
+      for (i = 0; i < len; i += page_size)
+       if (mincore ((char *)addr + i, page_size, (char *) &one_byte) == -1
+           && errno == ENOMEM)
+         continue; /* The page is not mapped.  */
+       else
+         break;
+
+      if (i >= len)
+       base = mmap ((caddr_t) addr, len, prot, flags | MAP_FIXED, fd, off);
+    }
+
+  return base;
+}
+
 /* For various ports, try to guess a fixed spot in the vm space
    that's probably free.  Based on McDougall, Mauro, Solaris Internals, 2nd
    ed., p.460-461, fig. 9-3, 9-4, 9-5.  */
@@ -55,8 +90,8 @@ sol_gt_pch_get_address (size_t size, int fd)
 {
   void *addr;
 
-  addr = mmap ((caddr_t) TRY_EMPTY_VM_SPACE, size, PROT_READ | PROT_WRITE,
-              MAP_PRIVATE, fd, 0);
+  addr = mmap_fixed ((caddr_t) TRY_EMPTY_VM_SPACE, size,
+                    PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
 
   /* If we failed the map, that means there's *no* free space.  */
   if (addr == (void *) MAP_FAILED)
@@ -81,34 +116,8 @@ sol_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
   if (size == 0)
     return -1;
 
-  addr = mmap ((caddr_t) base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE,
-              fd, offset);
-
-  /* Solaris isn't good about honoring the mmap START parameter
-     without MAP_FIXED set.  Before we give up, search the desired
-     address space with mincore to see if the space is really free.  */
-  if (addr != base)
-    {
-      size_t page_size = getpagesize();
-      char one_byte;
-      size_t i;
-
-      if (addr != (void *) MAP_FAILED)
-       munmap ((caddr_t) addr, size);
-
-      errno = 0;
-      for (i = 0; i < size; i += page_size)
-       if (mincore ((char *)base + i, page_size, (char *) &one_byte) == -1
-           && errno == ENOMEM)
-         continue; /* The page is not mapped.  */
-       else
-         break;
-
-      if (i >= size)
-       addr = mmap ((caddr_t) base, size, 
-                    PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED,
-                    fd, offset);
-    }
+  addr = mmap_fixed ((caddr_t) base, size,
+                    PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset);
 
   return addr == base ? 1 : -1;
 }