diff gcc/config/host-solaris.c @ 67:f6334be47118

update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
author nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
date Tue, 22 Mar 2011 17:18:12 +0900
parents b7f97abdc517
children 04ced10e8804
line wrap: on
line diff
--- a/gcc/config/host-solaris.c	Tue May 25 18:58:51 2010 +0900
+++ b/gcc/config/host-solaris.c	Tue Mar 22 17:18:12 2011 +0900
@@ -20,7 +20,6 @@
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
-#include <sys/mman.h>
 #include "hosthooks.h"
 #include "hosthooks-def.h"
 
@@ -30,6 +29,41 @@
 #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 +89,8 @@
 {
   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 +115,8 @@
   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;
 }