OSDN Git Service

* c-cppbuiltin.c (cb_register_builtins): Define LP64 builtins for
[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, 2003
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 /* CPP_SPEC parts common to all NetBSD targets.  */
33 #define NETBSD_CPP_SPEC                         \
34   "%{posix:-D_POSIX_SOURCE} \
35    %{pthread:-D_REENTRANT -D_PTHREADS}"
36
37 /* NETBSD_NATIVE is defined when gcc is integrated into the NetBSD
38    source tree so it can be configured appropriately without using
39    the GNU configure/build mechanism.  */
40
41 #ifdef NETBSD_NATIVE
42
43 /* Look for the include files in the system-defined places.  */
44
45 #undef GPLUSPLUS_INCLUDE_DIR
46 #define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++"
47
48 #undef GCC_INCLUDE_DIR
49 #define GCC_INCLUDE_DIR "/usr/include"
50
51 #undef INCLUDE_DEFAULTS
52 #define INCLUDE_DEFAULTS                        \
53   {                                             \
54     { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },     \
55     { GCC_INCLUDE_DIR, "GCC", 0, 0 },           \
56     { 0, 0, 0, 0 }                              \
57   }
58
59 /* Under NetBSD, the normal location of the compiler back ends is the
60    /usr/libexec directory.  */
61
62 #undef STANDARD_EXEC_PREFIX
63 #define STANDARD_EXEC_PREFIX            "/usr/libexec/"
64
65 /* Under NetBSD, the normal location of the various *crt*.o files is the
66    /usr/lib directory.  */
67
68 #undef STANDARD_STARTFILE_PREFIX
69 #define STANDARD_STARTFILE_PREFIX       "/usr/lib/"
70
71 #endif /* NETBSD_NATIVE */
72
73
74 /* Provide a LIB_SPEC appropriate for NetBSD.  Here we:
75
76    1. Select the appropriate set of libs, depending on whether we're
77       profiling.
78
79    2. Include the pthread library if -pthread is specified (only
80       if threads are enabled).
81
82    3. Include the posix library if -posix is specified.
83
84    FIXME: Could eliminate the duplication here if we were allowed to
85    use string concatenation.  */
86
87 #ifdef NETBSD_ENABLE_PTHREADS
88 #define NETBSD_LIB_SPEC         \
89   "%{pthread:                   \
90      %{!p:                      \
91        %{!pg:-lpthread}}        \
92      %{p:-lpthread_p}           \
93      %{pg:-lpthread_p}}         \
94    %{posix:                     \
95      %{!p:                      \
96        %{!pg:-lposix}}          \
97      %{p:-lposix_p}             \
98      %{pg:-lposix_p}}           \
99    %{!shared:                   \
100      %{!symbolic:               \
101        %{!p:                    \
102          %{!pg:-lc}}            \
103        %{p:-lc_p}               \
104        %{pg:-lc_p}}}"
105 #else
106 #define NETBSD_LIB_SPEC         \
107   "%{posix:                     \
108      %{!p:                      \
109        %{!pg:-lposix}}          \
110      %{p:-lposix_p}             \
111      %{pg:-lposix_p}}           \
112    %{!shared:                   \
113      %{!symbolic:               \
114        %{!p:                    \
115          %{!pg:-lc}}            \
116        %{p:-lc_p}               \
117        %{pg:-lc_p}}}"
118 #endif
119
120 #undef LIB_SPEC
121 #define LIB_SPEC NETBSD_LIB_SPEC
122
123 /* Provide a LIBGCC_SPEC appropriate for NetBSD.  We also want to exclude
124    libgcc with -symbolic.  */
125
126 #ifdef NETBSD_NATIVE
127 #define NETBSD_LIBGCC_SPEC      \
128   "%{!symbolic:                 \
129      %{!shared:                 \
130        %{!p:                    \
131          %{!pg: -lgcc}}}        \
132      %{shared: -lgcc_pic}       \
133      %{p: -lgcc_p}              \
134      %{pg: -lgcc_p}}"
135 #else
136 #define NETBSD_LIBGCC_SPEC "%{!shared:%{!symbolic: -lgcc}}"
137 #endif
138
139 #undef LIBGCC_SPEC
140 #define LIBGCC_SPEC NETBSD_LIBGCC_SPEC
141
142 /* When building shared libraries, the initialization and finalization 
143    functions for the library are .init and .fini respectively.  */
144
145 #define COLLECT_SHARED_INIT_FUNC(STREAM,FUNC)                           \
146   do {                                                                  \
147     fprintf ((STREAM), "void __init() __asm__ (\".init\");");           \
148     fprintf ((STREAM), "void __init() {\n\t%s();\n}\n", (FUNC));        \
149   } while (0)
150
151 #define COLLECT_SHARED_FINI_FUNC(STREAM,FUNC)                           \
152   do {                                                                  \
153     fprintf ((STREAM), "void __fini() __asm__ (\".fini\");");           \
154     fprintf ((STREAM), "void __fini() {\n\t%s();\n}\n", (FUNC));        \
155   } while (0)
156
157 #undef TARGET_HAS_F_SETLKW
158 #define TARGET_HAS_F_SETLKW
159
160 /* Implicit library calls should use memcpy, not bcopy, etc.  */
161
162 #undef TARGET_MEM_FUNCTIONS
163 #define TARGET_MEM_FUNCTIONS 1
164
165 /* Handle #pragma weak and #pragma pack.  */
166
167 #define HANDLE_SYSV_PRAGMA 1
168
169
170 /* Define some types that are the same on all NetBSD platforms,
171    making them agree with <machine/ansi.h>.  */
172
173 #undef WCHAR_TYPE
174 #define WCHAR_TYPE "int"
175
176 #undef WCHAR_TYPE_SIZE
177 #define WCHAR_TYPE_SIZE 32
178
179 #undef WINT_TYPE
180 #define WINT_TYPE "int"
181 \f
182
183 /* Attempt to turn on execute permission for the stack.  This may be
184    used by TRANSFER_FROM_TRAMPOLINE of the target needs it (that is,
185    if the target machine can change execute permissions on a page).
186
187    There is no way to query the execute permission of the stack, so
188    we always issue the mprotect() call.
189
190    Note that we go out of our way to use namespace-non-invasive calls
191    here.  Unfortunately, there is no libc-internal name for mprotect().
192
193    Also note that no errors should be emitted by this code; it is considered
194    dangerous for library calls to send messages to stdout/stderr.  */
195
196 #define NETBSD_ENABLE_EXECUTE_STACK                                     \
197 extern void __enable_execute_stack (void *);                            \
198 void                                                                    \
199 __enable_execute_stack (addr)                                           \
200      void *addr;                                                        \
201 {                                                                       \
202   extern int mprotect (void *, size_t, int);                            \
203   extern int __sysctl (int *, unsigned int, void *, size_t *,           \
204                        void *, size_t);                                 \
205                                                                         \
206   static int size;                                                      \
207   static long mask;                                                     \
208                                                                         \
209   char *page, *end;                                                     \
210                                                                         \
211   if (size == 0)                                                        \
212     {                                                                   \
213       int mib[2];                                                       \
214       size_t len;                                                       \
215                                                                         \
216       mib[0] = 6; /* CTL_HW */                                          \
217       mib[1] = 7; /* HW_PAGESIZE */                                     \
218       len = sizeof (size);                                              \
219       (void) __sysctl (mib, 2, &size, &len, NULL, 0);                   \
220       mask = ~((long) size - 1);                                        \
221     }                                                                   \
222                                                                         \
223   page = (char *) (((long) addr) & mask);                               \
224   end  = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size);  \
225                                                                         \
226   /* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */                         \
227   (void) mprotect (page, end - page, 7);                                \
228 }