OSDN Git Service

* config/h8300/h8300.h (N_REG_CLASSES): Parenthesize.
[pf3gnuchains/gcc-fork.git] / gcc / config / netbsd.h
1 /* Base configuration file for all NetBSD targets.
2    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
3    Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 /* TARGET_OS_CPP_BUILTINS() common to all NetBSD targets.  */
23 #define NETBSD_OS_CPP_BUILTINS_COMMON()         \
24   do                                            \
25     {                                           \
26       builtin_define ("__NetBSD__");            \
27       builtin_assert ("system=unix");           \
28       builtin_assert ("system=NetBSD");         \
29     }                                           \
30   while (0)
31
32 /* TARGET_OS_CPP_BUILTINS() common to all LP64 NetBSD targets.  */
33 #define NETBSD_OS_CPP_BUILTINS_LP64()           \
34   do                                            \
35     {                                           \
36       builtin_define ("_LP64");                 \
37     }                                           \
38   while (0)
39
40 /* CPP_SPEC parts common to all NetBSD targets.  */
41 #define NETBSD_CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
42
43 /* NETBSD_NATIVE is defined when gcc is integrated into the NetBSD
44    source tree so it can be configured appropriately without using
45    the GNU configure/build mechanism.  */
46
47 #ifdef NETBSD_NATIVE
48
49 /* Look for the include files in the system-defined places.  */
50
51 #undef GPLUSPLUS_INCLUDE_DIR
52 #define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++"
53
54 #undef GCC_INCLUDE_DIR
55 #define GCC_INCLUDE_DIR "/usr/include"
56
57 #undef INCLUDE_DEFAULTS
58 #define INCLUDE_DEFAULTS                        \
59   {                                             \
60     { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },     \
61     { GCC_INCLUDE_DIR, "GCC", 0, 0 },           \
62     { 0, 0, 0, 0 }                              \
63   }
64
65 /* Under NetBSD, the normal location of the compiler back ends is the
66    /usr/libexec directory.  */
67
68 #undef STANDARD_EXEC_PREFIX
69 #define STANDARD_EXEC_PREFIX            "/usr/libexec/"
70
71 /* Under NetBSD, the normal location of the various *crt*.o files is the
72    /usr/lib directory.  */
73
74 #undef STANDARD_STARTFILE_PREFIX
75 #define STANDARD_STARTFILE_PREFIX       "/usr/lib/"
76
77 #endif /* NETBSD_NATIVE */
78
79
80 /* Provide a LIB_SPEC appropriate for NetBSD.  Here we:
81
82    1. Select the appropriate set of libs, depending on whether we're
83       profiling.
84
85    2. Include the pthread library if -pthread is specified.
86
87    3. Include the posix library if -posix is specified.  */
88
89 #undef LIB_SPEC
90 #define LIB_SPEC                \
91   "%{pthread:                   \
92      %{!p:                      \
93        %{!pg:-lpthread}}        \
94      %{p:-lpthread_p}           \
95      %{pg:-lpthread_p}}         \
96    %{posix:                     \
97      %{!p:                      \
98        %{!pg:-lposix}}          \
99      %{p:-lposix_p}             \
100      %{pg:-lposix_p}}           \
101    %{!shared:                   \
102      %{!symbolic:               \
103        %{!p:                    \
104          %{!pg:-lc}}            \
105        %{p:-lc_p}               \
106        %{pg:-lc_p}}}"
107
108 /* Provide a LIBGCC_SPEC appropriate for NetBSD.  We also want to exclude
109    libgcc with -symbolic.  */
110
111 #undef LIBGCC_SPEC
112 #ifdef NETBSD_NATIVE
113 #define LIBGCC_SPEC             \
114   "%{!symbolic:                 \
115      %{!shared:                 \
116        %{!p:                    \
117          %{!pg: -lgcc}}}                \
118      %{shared: -lgcc_pic}       \
119      %{p: -lgcc_p}              \
120      %{pg: -lgcc_p}}"
121 #else
122 #define LIBGCC_SPEC "%{!shared:%{!symbolic: -lgcc}}"
123 #endif
124
125 /* When building shared libraries, the initialization and finalization 
126    functions for the library are .init and .fini respectively.  */
127
128 #define COLLECT_SHARED_INIT_FUNC(STREAM,FUNC)                           \
129   do {                                                                  \
130     fprintf ((STREAM), "void __init() __asm__ (\".init\");");           \
131     fprintf ((STREAM), "void __init() {\n\t%s();\n}\n", (FUNC));        \
132   } while (0)
133
134 #define COLLECT_SHARED_FINI_FUNC(STREAM,FUNC)                           \
135   do {                                                                  \
136     fprintf ((STREAM), "void __fini() __asm__ (\".fini\");");           \
137     fprintf ((STREAM), "void __fini() {\n\t%s();\n}\n", (FUNC));        \
138   } while (0)
139
140 #undef TARGET_HAS_F_SETLKW
141 #define TARGET_HAS_F_SETLKW
142
143 /* Implicit library calls should use memcpy, not bcopy, etc.  */
144
145 #undef TARGET_MEM_FUNCTIONS
146 #define TARGET_MEM_FUNCTIONS 1
147
148 /* Handle #pragma weak and #pragma pack.  */
149
150 #define HANDLE_SYSV_PRAGMA
151
152
153 /* Define some types that are the same on all NetBSD platforms,
154    making them agree with <machine/ansi.h>.  */
155
156 #undef WCHAR_TYPE
157 #define WCHAR_TYPE "int"
158
159 #undef WCHAR_TYPE_SIZE
160 #define WCHAR_TYPE_SIZE 32
161
162 #undef WINT_TYPE
163 #define WINT_TYPE "int"
164 \f
165
166 /* Attempt to turn on execute permission for the stack.  This may be
167    used by TRANSFER_FROM_TRAMPOLINE of the target needs it (that is,
168    if the target machine can change execute permissions on a page).
169
170    There is no way to query the execute permission of the stack, so
171    we always issue the mprotect() call.
172
173    Note that we go out of our way to use namespace-non-invasive calls
174    here.  Unfortunately, there is no libc-internal name for mprotect().
175
176    Also note that no errors should be emitted by this code; it is considered
177    dangerous for library calls to send messages to stdout/stderr.  */
178
179 #define NETBSD_ENABLE_EXECUTE_STACK                                     \
180 extern void __enable_execute_stack (void *);                            \
181 void                                                                    \
182 __enable_execute_stack (addr)                                           \
183      void *addr;                                                        \
184 {                                                                       \
185   extern int mprotect (void *, size_t, int);                            \
186   extern int __sysctl (int *, unsigned int, void *, size_t *,           \
187                        void *, size_t);                                 \
188                                                                         \
189   static int size;                                                      \
190   static long mask;                                                     \
191                                                                         \
192   char *page, *end;                                                     \
193                                                                         \
194   if (size == 0)                                                        \
195     {                                                                   \
196       int mib[2];                                                       \
197       size_t len;                                                       \
198                                                                         \
199       mib[0] = 6; /* CTL_HW */                                          \
200       mib[1] = 7; /* HW_PAGESIZE */                                     \
201       len = sizeof (size);                                              \
202       (void) __sysctl (mib, 2, &size, &len, NULL, 0);                   \
203       mask = ~((long) size - 1);                                        \
204     }                                                                   \
205                                                                         \
206   page = (char *) (((long) addr) & mask);                               \
207   end  = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size);  \
208                                                                         \
209   /* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */                         \
210   (void) mprotect (page, end - page, 7);                                \
211 }