OSDN Git Service

* config/vxworks.h: Replace "GNU compiler" with "GCC".
[pf3gnuchains/gcc-fork.git] / gcc / config / netbsd.h
index b57d412..602f831 100644 (file)
@@ -1,5 +1,5 @@
 /* Base configuration file for all NetBSD targets.
-   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
+   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
 This file is part of GNU CC.
@@ -29,20 +29,14 @@ Boston, MA 02111-1307, USA.  */
     }                                          \
   while (0)
 
-/* TARGET_OS_CPP_BUILTINS() common to all LP64 NetBSD targets.  */
-#define NETBSD_OS_CPP_BUILTINS_LP64()          \
-  do                                           \
-    {                                          \
-      builtin_define ("_LP64");                        \
-    }                                          \
-  while (0)
-
 /* CPP_SPEC parts common to all NetBSD targets.  */
-#define NETBSD_CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
+#define NETBSD_CPP_SPEC                                \
+  "%{posix:-D_POSIX_SOURCE} \
+   %{pthread:-D_REENTRANT -D_PTHREADS}"
 
 /* NETBSD_NATIVE is defined when gcc is integrated into the NetBSD
    source tree so it can be configured appropriately without using
-   the GNU configure/build mechanism. */
+   the GNU configure/build mechanism.  */
 
 #ifdef NETBSD_NATIVE
 
@@ -82,12 +76,16 @@ Boston, MA 02111-1307, USA.  */
    1. Select the appropriate set of libs, depending on whether we're
       profiling.
 
-   2. Include the pthread library if -pthread is specified.
+   2. Include the pthread library if -pthread is specified (only
+      if threads are enabled).
 
-   3. Include the posix library if -posix is specified.  */
+   3. Include the posix library if -posix is specified.
 
-#undef LIB_SPEC
-#define LIB_SPEC               \
+   FIXME: Could eliminate the duplication here if we were allowed to
+   use string concatenation.  */
+
+#ifdef NETBSD_ENABLE_PTHREADS
+#define NETBSD_LIB_SPEC                \
   "%{pthread:                  \
      %{!p:                     \
        %{!pg:-lpthread}}       \
@@ -104,24 +102,43 @@ Boston, MA 02111-1307, USA.  */
         %{!pg:-lc}}            \
        %{p:-lc_p}              \
        %{pg:-lc_p}}}"
+#else
+#define NETBSD_LIB_SPEC                \
+  "%{posix:                    \
+     %{!p:                     \
+       %{!pg:-lposix}}         \
+     %{p:-lposix_p}            \
+     %{pg:-lposix_p}}          \
+   %{!shared:                  \
+     %{!symbolic:              \
+       %{!p:                   \
+        %{!pg:-lc}}            \
+       %{p:-lc_p}              \
+       %{pg:-lc_p}}}"
+#endif
+
+#undef LIB_SPEC
+#define LIB_SPEC NETBSD_LIB_SPEC
 
 /* Provide a LIBGCC_SPEC appropriate for NetBSD.  We also want to exclude
    libgcc with -symbolic.  */
 
-#undef LIBGCC_SPEC
 #ifdef NETBSD_NATIVE
-#define LIBGCC_SPEC            \
+#define NETBSD_LIBGCC_SPEC     \
   "%{!symbolic:                        \
      %{!shared:                        \
        %{!p:                   \
-        %{!pg: -lgcc}}}                \
+        %{!pg: -lgcc}}}        \
      %{shared: -lgcc_pic}      \
      %{p: -lgcc_p}             \
      %{pg: -lgcc_p}}"
 #else
-#define LIBGCC_SPEC "%{!shared:%{!symbolic: -lgcc}}"
+#define NETBSD_LIBGCC_SPEC "%{!shared:%{!symbolic: -lgcc}}"
 #endif
 
+#undef LIBGCC_SPEC
+#define LIBGCC_SPEC NETBSD_LIBGCC_SPEC
+
 /* When building shared libraries, the initialization and finalization 
    functions for the library are .init and .fini respectively.  */
 
@@ -147,7 +164,7 @@ Boston, MA 02111-1307, USA.  */
 
 /* Handle #pragma weak and #pragma pack.  */
 
-#define HANDLE_SYSV_PRAGMA
+#define HANDLE_SYSV_PRAGMA 1
 
 
 /* Define some types that are the same on all NetBSD platforms,
@@ -161,3 +178,51 @@ Boston, MA 02111-1307, USA.  */
 
 #undef WINT_TYPE
 #define WINT_TYPE "int"
+\f
+
+/* Attempt to turn on execute permission for the stack.  This may be
+   used by TRANSFER_FROM_TRAMPOLINE of the target needs it (that is,
+   if the target machine can change execute permissions on a page).
+
+   There is no way to query the execute permission of the stack, so
+   we always issue the mprotect() call.
+
+   Note that we go out of our way to use namespace-non-invasive calls
+   here.  Unfortunately, there is no libc-internal name for mprotect().
+
+   Also note that no errors should be emitted by this code; it is considered
+   dangerous for library calls to send messages to stdout/stderr.  */
+
+#define NETBSD_ENABLE_EXECUTE_STACK                                    \
+extern void __enable_execute_stack (void *);                           \
+void                                                                   \
+__enable_execute_stack (addr)                                          \
+     void *addr;                                                       \
+{                                                                      \
+  extern int mprotect (void *, size_t, int);                           \
+  extern int __sysctl (int *, unsigned int, void *, size_t *,          \
+                      void *, size_t);                                 \
+                                                                       \
+  static int size;                                                     \
+  static long mask;                                                    \
+                                                                       \
+  char *page, *end;                                                    \
+                                                                       \
+  if (size == 0)                                                       \
+    {                                                                  \
+      int mib[2];                                                      \
+      size_t len;                                                      \
+                                                                       \
+      mib[0] = 6; /* CTL_HW */                                         \
+      mib[1] = 7; /* HW_PAGESIZE */                                    \
+      len = sizeof (size);                                             \
+      (void) __sysctl (mib, 2, &size, &len, NULL, 0);                  \
+      mask = ~((long) size - 1);                                       \
+    }                                                                  \
+                                                                       \
+  page = (char *) (((long) addr) & mask);                              \
+  end  = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \
+                                                                       \
+  /* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */                                \
+  (void) mprotect (page, end - page, 7);                               \
+}