]>
Commit | Line | Data |
---|---|---|
c5c76735 JL |
1 | /* Get common system includes and various definitions and declarations based |
2 | on autoconf macros. | |
a4de48bc | 3 | Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 |
d9221e01 | 4 | Free Software Foundation, Inc. |
aca69483 | 5 | |
1322177d | 6 | This file is part of GCC. |
1b0c6de6 | 7 | |
1322177d LB |
8 | GCC is free software; you can redistribute it and/or modify it under |
9 | the terms of the GNU General Public License as published by the Free | |
10 | Software Foundation; either version 2, or (at your option) any later | |
11 | version. | |
1b0c6de6 | 12 | |
1322177d LB |
13 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
14 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 | for more details. | |
1b0c6de6 JL |
17 | |
18 | You should have received a copy of the GNU General Public License | |
1322177d | 19 | along with GCC; see the file COPYING. If not, write to the Free |
366ccddb KC |
20 | Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA |
21 | 02110-1301, USA. */ | |
aca69483 | 22 | |
c5c76735 | 23 | |
88657302 RH |
24 | #ifndef GCC_SYSTEM_H |
25 | #define GCC_SYSTEM_H | |
aca69483 | 26 | |
2a0621b9 | 27 | /* We must include stdarg.h before stdio.h. */ |
789f983a | 28 | #include <stdarg.h> |
789f983a | 29 | |
6f81b1ad RH |
30 | #ifndef va_copy |
31 | # ifdef __va_copy | |
32 | # define va_copy(d,s) __va_copy((d),(s)) | |
33 | # else | |
34 | # define va_copy(d,s) ((d) = (s)) | |
35 | # endif | |
36 | #endif | |
37 | ||
d6edb99e ZW |
38 | #ifdef HAVE_STDDEF_H |
39 | # include <stddef.h> | |
40 | #endif | |
41 | ||
aca69483 | 42 | #include <stdio.h> |
51db713f KG |
43 | |
44 | /* Define a generic NULL if one hasn't already been defined. */ | |
45 | #ifndef NULL | |
46 | #define NULL 0 | |
47 | #endif | |
48 | ||
042630ad KG |
49 | /* Use the unlocked open routines from libiberty. */ |
50 | #define fopen(PATH,MODE) fopen_unlocked(PATH,MODE) | |
51 | #define fdopen(FILDES,MODE) fdopen_unlocked(FILDES,MODE) | |
52 | #define freopen(PATH,MODE,STREAM) freopen_unlocked(PATH,MODE,STREAM) | |
53 | ||
54953b66 | 54 | /* The compiler is not a multi-threaded application and therefore we |
3b681e9d ZW |
55 | do not have to use the locking functions. In fact, using the locking |
56 | functions can cause the compiler to be significantly slower under | |
57 | I/O bound conditions (such as -g -O0 on very large source files). | |
9c30c0e7 | 58 | |
3b681e9d | 59 | HAVE_DECL_PUTC_UNLOCKED actually indicates whether or not the stdio |
f31e826b KG |
60 | code is multi-thread safe by default. If it is set to 0, then do |
61 | not worry about using the _unlocked functions. | |
0d569849 | 62 | |
3b681e9d ZW |
63 | fputs_unlocked, fwrite_unlocked, and fprintf_unlocked are |
64 | extensions and need to be prototyped by hand (since we do not | |
65 | define _GNU_SOURCE). */ | |
9c30c0e7 | 66 | |
3b681e9d ZW |
67 | #if defined HAVE_DECL_PUTC_UNLOCKED && HAVE_DECL_PUTC_UNLOCKED |
68 | ||
69 | # ifdef HAVE_PUTC_UNLOCKED | |
70 | # undef putc | |
71 | # define putc(C, Stream) putc_unlocked (C, Stream) | |
72 | # endif | |
0d667716 KG |
73 | # ifdef HAVE_PUTCHAR_UNLOCKED |
74 | # undef putchar | |
75 | # define putchar(C) putchar_unlocked (C) | |
76 | # endif | |
77 | # ifdef HAVE_GETC_UNLOCKED | |
78 | # undef getc | |
79 | # define getc(Stream) getc_unlocked (Stream) | |
80 | # endif | |
81 | # ifdef HAVE_GETCHAR_UNLOCKED | |
82 | # undef getchar | |
83 | # define getchar() getchar_unlocked () | |
84 | # endif | |
3b681e9d ZW |
85 | # ifdef HAVE_FPUTC_UNLOCKED |
86 | # undef fputc | |
87 | # define fputc(C, Stream) fputc_unlocked (C, Stream) | |
88 | # endif | |
89 | ||
0d667716 KG |
90 | # ifdef HAVE_CLEARERR_UNLOCKED |
91 | # undef clearerr | |
92 | # define clearerr(Stream) clearerr_unlocked (Stream) | |
93 | # if defined (HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED | |
94 | extern void clearerr_unlocked (FILE *); | |
95 | # endif | |
96 | # endif | |
97 | # ifdef HAVE_FEOF_UNLOCKED | |
98 | # undef feof | |
99 | # define feof(Stream) feof_unlocked (Stream) | |
100 | # if defined (HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED | |
101 | extern int feof_unlocked (FILE *); | |
102 | # endif | |
103 | # endif | |
104 | # ifdef HAVE_FILENO_UNLOCKED | |
105 | # undef fileno | |
106 | # define fileno(Stream) fileno_unlocked (Stream) | |
107 | # if defined (HAVE_DECL_FILENO_UNLOCKED) && !HAVE_DECL_FILENO_UNLOCKED | |
108 | extern int fileno_unlocked (FILE *); | |
109 | # endif | |
110 | # endif | |
111 | # ifdef HAVE_FFLUSH_UNLOCKED | |
112 | # undef fflush | |
113 | # define fflush(Stream) fflush_unlocked (Stream) | |
114 | # if defined (HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED | |
115 | extern int fflush_unlocked (FILE *); | |
116 | # endif | |
117 | # endif | |
118 | # ifdef HAVE_FGETC_UNLOCKED | |
119 | # undef fgetc | |
120 | # define fgetc(Stream) fgetc_unlocked (Stream) | |
121 | # if defined (HAVE_DECL_FGETC_UNLOCKED) && !HAVE_DECL_FGETC_UNLOCKED | |
122 | extern int fgetc_unlocked (FILE *); | |
123 | # endif | |
124 | # endif | |
125 | # ifdef HAVE_FGETS_UNLOCKED | |
126 | # undef fgets | |
127 | # define fgets(S, n, Stream) fgets_unlocked (S, n, Stream) | |
128 | # if defined (HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED | |
129 | extern char *fgets_unlocked (char *, int, FILE *); | |
130 | # endif | |
131 | # endif | |
3b681e9d ZW |
132 | # ifdef HAVE_FPUTS_UNLOCKED |
133 | # undef fputs | |
134 | # define fputs(String, Stream) fputs_unlocked (String, Stream) | |
135 | # if defined (HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED | |
2a0621b9 | 136 | extern int fputs_unlocked (const char *, FILE *); |
3b681e9d ZW |
137 | # endif |
138 | # endif | |
0d667716 KG |
139 | # ifdef HAVE_FERROR_UNLOCKED |
140 | # undef ferror | |
141 | # define ferror(Stream) ferror_unlocked (Stream) | |
142 | # if defined (HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED | |
143 | extern int ferror_unlocked (FILE *); | |
144 | # endif | |
145 | # endif | |
146 | # ifdef HAVE_FREAD_UNLOCKED | |
147 | # undef fread | |
148 | # define fread(Ptr, Size, N, Stream) fread_unlocked (Ptr, Size, N, Stream) | |
149 | # if defined (HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED | |
150 | extern size_t fread_unlocked (void *, size_t, size_t, FILE *); | |
151 | # endif | |
152 | # endif | |
3b681e9d ZW |
153 | # ifdef HAVE_FWRITE_UNLOCKED |
154 | # undef fwrite | |
155 | # define fwrite(Ptr, Size, N, Stream) fwrite_unlocked (Ptr, Size, N, Stream) | |
156 | # if defined (HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED | |
0d667716 | 157 | extern size_t fwrite_unlocked (const void *, size_t, size_t, FILE *); |
3b681e9d | 158 | # endif |
9c30c0e7 | 159 | # endif |
3b681e9d ZW |
160 | # ifdef HAVE_FPRINTF_UNLOCKED |
161 | # undef fprintf | |
162 | /* We can't use a function-like macro here because we don't know if | |
163 | we have varargs macros. */ | |
164 | # define fprintf fprintf_unlocked | |
165 | # if defined (HAVE_DECL_FPRINTF_UNLOCKED) && !HAVE_DECL_FPRINTF_UNLOCKED | |
2a0621b9 | 166 | extern int fprintf_unlocked (FILE *, const char *, ...); |
3b681e9d ZW |
167 | # endif |
168 | # endif | |
169 | ||
54953b66 UD |
170 | #endif |
171 | ||
0d569849 | 172 | /* ??? Glibc's fwrite/fread_unlocked macros cause |
1c99d804 RH |
173 | "warning: signed and unsigned type in conditional expression". */ |
174 | #undef fread_unlocked | |
175 | #undef fwrite_unlocked | |
176 | ||
f6bbde28 ZW |
177 | /* There are an extraordinary number of issues with <ctype.h>. |
178 | The last straw is that it varies with the locale. Use libiberty's | |
179 | replacement instead. */ | |
180 | #include <safe-ctype.h> | |
aca69483 | 181 | |
aca69483 | 182 | #include <sys/types.h> |
c5c76735 | 183 | |
aca69483 KG |
184 | #include <errno.h> |
185 | ||
6c889b67 | 186 | #if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO |
aca69483 KG |
187 | extern int errno; |
188 | #endif | |
189 | ||
87608693 KG |
190 | /* Some of glibc's string inlines cause warnings. Plus we'd rather |
191 | rely on (and therefore test) GCC's string builtins. */ | |
192 | #define __NO_STRING_INLINES | |
193 | ||
ccc7d11a | 194 | #ifdef STRING_WITH_STRINGS |
aca69483 | 195 | # include <string.h> |
ccc7d11a | 196 | # include <strings.h> |
aca69483 | 197 | #else |
ccc7d11a KG |
198 | # ifdef HAVE_STRING_H |
199 | # include <string.h> | |
200 | # else | |
201 | # ifdef HAVE_STRINGS_H | |
202 | # include <strings.h> | |
203 | # endif | |
aca69483 KG |
204 | # endif |
205 | #endif | |
206 | ||
207 | #ifdef HAVE_STDLIB_H | |
208 | # include <stdlib.h> | |
209 | #endif | |
210 | ||
eaf4e618 ZW |
211 | /* If we don't have an overriding definition, set SUCCESS_EXIT_CODE and |
212 | FATAL_EXIT_CODE to EXIT_SUCCESS and EXIT_FAILURE respectively, | |
213 | or 0 and 1 if those macros are not defined. */ | |
214 | #ifndef SUCCESS_EXIT_CODE | |
215 | # ifdef EXIT_SUCCESS | |
216 | # define SUCCESS_EXIT_CODE EXIT_SUCCESS | |
217 | # else | |
218 | # define SUCCESS_EXIT_CODE 0 | |
219 | # endif | |
220 | #endif | |
221 | ||
222 | #ifndef FATAL_EXIT_CODE | |
223 | # ifdef EXIT_FAILURE | |
224 | # define FATAL_EXIT_CODE EXIT_FAILURE | |
225 | # else | |
226 | # define FATAL_EXIT_CODE 1 | |
227 | # endif | |
228 | #endif | |
229 | ||
aca69483 KG |
230 | #ifdef HAVE_UNISTD_H |
231 | # include <unistd.h> | |
232 | #endif | |
233 | ||
234 | #ifdef HAVE_SYS_PARAM_H | |
235 | # include <sys/param.h> | |
23d1aac4 | 236 | /* We use this identifier later and it appears in some vendor param.h's. */ |
655781b7 | 237 | # undef PREFETCH |
aca69483 KG |
238 | #endif |
239 | ||
240 | #if HAVE_LIMITS_H | |
241 | # include <limits.h> | |
242 | #endif | |
243 | ||
75e93faa ZW |
244 | /* Get definitions of HOST_WIDE_INT and HOST_WIDEST_INT. */ |
245 | #include "hwint.h" | |
f80d6fd7 | 246 | |
5297e085 KG |
247 | /* A macro to determine whether a VALUE lies inclusively within a |
248 | certain range without evaluating the VALUE more than once. This | |
249 | macro won't warn if the VALUE is unsigned and the LOWER bound is | |
250 | zero, as it would e.g. with "VALUE >= 0 && ...". Note the LOWER | |
251 | bound *is* evaluated twice, and LOWER must not be greater than | |
252 | UPPER. However the bounds themselves can be either positive or | |
253 | negative. */ | |
254 | #define IN_RANGE(VALUE, LOWER, UPPER) \ | |
93880203 | 255 | ((unsigned HOST_WIDE_INT)((VALUE) - (LOWER)) <= ((UPPER) - (LOWER))) |
5297e085 | 256 | |
f12bc141 ZW |
257 | /* Infrastructure for defining missing _MAX and _MIN macros. Note that |
258 | macros defined with these cannot be used in #if. */ | |
259 | ||
260 | /* The extra casts work around common compiler bugs. */ | |
261 | #define INTTYPE_SIGNED(t) (! ((t) 0 < (t) -1)) | |
262 | /* The outer cast is needed to work around a bug in Cray C 5.0.3.0. | |
263 | It is necessary at least when t == time_t. */ | |
264 | #define INTTYPE_MINIMUM(t) ((t) (INTTYPE_SIGNED (t) \ | |
265 | ? ~ (t) 0 << (sizeof(t) * CHAR_BIT - 1) : (t) 0)) | |
266 | #define INTTYPE_MAXIMUM(t) ((t) (~ (t) 0 - INTTYPE_MINIMUM (t))) | |
267 | ||
268 | /* Use that infrastructure to provide a few constants. */ | |
269 | #ifndef UCHAR_MAX | |
270 | # define UCHAR_MAX INTTYPE_MAXIMUM (unsigned char) | |
271 | #endif | |
272 | ||
aca69483 KG |
273 | #ifdef TIME_WITH_SYS_TIME |
274 | # include <sys/time.h> | |
275 | # include <time.h> | |
276 | #else | |
277 | # if HAVE_SYS_TIME_H | |
e572c0c6 | 278 | # include <sys/time.h> |
aca69483 | 279 | # else |
e572c0c6 KG |
280 | # ifdef HAVE_TIME_H |
281 | # include <time.h> | |
282 | # endif | |
283 | # endif | |
aca69483 KG |
284 | #endif |
285 | ||
286 | #ifdef HAVE_FCNTL_H | |
287 | # include <fcntl.h> | |
288 | #else | |
e572c0c6 KG |
289 | # ifdef HAVE_SYS_FILE_H |
290 | # include <sys/file.h> | |
291 | # endif | |
aca69483 KG |
292 | #endif |
293 | ||
294 | #ifndef SEEK_SET | |
295 | # define SEEK_SET 0 | |
296 | # define SEEK_CUR 1 | |
297 | # define SEEK_END 2 | |
298 | #endif | |
299 | #ifndef F_OK | |
300 | # define F_OK 0 | |
301 | # define X_OK 1 | |
302 | # define W_OK 2 | |
303 | # define R_OK 4 | |
304 | #endif | |
e572c0c6 KG |
305 | #ifndef O_RDONLY |
306 | # define O_RDONLY 0 | |
307 | #endif | |
308 | #ifndef O_WRONLY | |
309 | # define O_WRONLY 1 | |
310 | #endif | |
aca69483 | 311 | |
36b8337d KG |
312 | /* Some systems define these in, e.g., param.h. We undefine these names |
313 | here to avoid the warnings. We prefer to use our definitions since we | |
314 | know they are correct. */ | |
315 | ||
316 | #undef MIN | |
317 | #undef MAX | |
318 | #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) | |
319 | #define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) | |
320 | ||
13799af3 MM |
321 | /* Returns the least number N such that N * Y >= X. */ |
322 | #define CEIL(x,y) (((x) + (y) - 1) / (y)) | |
323 | ||
e9831ca0 KG |
324 | #ifdef HAVE_SYS_WAIT_H |
325 | #include <sys/wait.h> | |
326 | #endif | |
327 | ||
328 | #ifndef WIFSIGNALED | |
329 | #define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f) | |
330 | #endif | |
331 | #ifndef WTERMSIG | |
332 | #define WTERMSIG(S) ((S) & 0x7f) | |
333 | #endif | |
334 | #ifndef WIFEXITED | |
335 | #define WIFEXITED(S) (((S) & 0xff) == 0) | |
336 | #endif | |
337 | #ifndef WEXITSTATUS | |
338 | #define WEXITSTATUS(S) (((S) & 0xff00) >> 8) | |
339 | #endif | |
8fa213ac PDM |
340 | #ifndef WSTOPSIG |
341 | #define WSTOPSIG WEXITSTATUS | |
342 | #endif | |
15dda4d3 KG |
343 | #ifndef WCOREDUMP |
344 | #define WCOREDUMP(S) ((S) & WCOREFLG) | |
345 | #endif | |
346 | #ifndef WCOREFLG | |
347 | #define WCOREFLG 0200 | |
348 | #endif | |
e9831ca0 | 349 | |
f31e826b KG |
350 | /* The HAVE_DECL_* macros are three-state, undefined, 0 or 1. If they |
351 | are defined to 0 then we must provide the relevant declaration | |
352 | here. These checks will be in the undefined state while configure | |
353 | is running so be careful to test "defined (HAVE_DECL_*)". */ | |
aca69483 | 354 | |
f31e826b | 355 | #if defined (HAVE_DECL_ATOF) && !HAVE_DECL_ATOF |
2a0621b9 | 356 | extern double atof (const char *); |
8f81384f KG |
357 | #endif |
358 | ||
f31e826b | 359 | #if defined (HAVE_DECL_ATOL) && !HAVE_DECL_ATOL |
2a0621b9 | 360 | extern long atol (const char *); |
8f81384f KG |
361 | #endif |
362 | ||
f31e826b | 363 | #if defined (HAVE_DECL_FREE) && !HAVE_DECL_FREE |
2a0621b9 | 364 | extern void free (void *); |
aca69483 KG |
365 | #endif |
366 | ||
f31e826b | 367 | #if defined (HAVE_DECL_GETCWD) && !HAVE_DECL_GETCWD |
2a0621b9 | 368 | extern char *getcwd (char *, size_t); |
6cd5dccd KG |
369 | #endif |
370 | ||
f31e826b | 371 | #if defined (HAVE_DECL_GETENV) && !HAVE_DECL_GETENV |
2a0621b9 | 372 | extern char *getenv (const char *); |
79e11844 KG |
373 | #endif |
374 | ||
ebb13e7e | 375 | #if defined (HAVE_DECL_GETOPT) && !HAVE_DECL_GETOPT |
2a0621b9 | 376 | extern int getopt (int, char * const *, const char *); |
ebb13e7e RK |
377 | #endif |
378 | ||
f6260033 EB |
379 | #if defined (HAVE_DECL_GETPAGESIZE) && !HAVE_DECL_GETPAGESIZE |
380 | extern int getpagesize (void); | |
6a257778 AL |
381 | #endif |
382 | ||
f31e826b | 383 | #if defined (HAVE_DECL_GETWD) && !HAVE_DECL_GETWD |
2a0621b9 | 384 | extern char *getwd (char *); |
6cd5dccd KG |
385 | #endif |
386 | ||
f31e826b | 387 | #if defined (HAVE_DECL_SBRK) && !HAVE_DECL_SBRK |
2a0621b9 | 388 | extern void *sbrk (int); |
8f81384f KG |
389 | #endif |
390 | ||
f31e826b | 391 | #if defined (HAVE_DECL_STRSTR) && !HAVE_DECL_STRSTR |
2a0621b9 | 392 | extern char *strstr (const char *, const char *); |
d3d5cc97 JL |
393 | #endif |
394 | ||
c5c76735 JL |
395 | #ifdef HAVE_MALLOC_H |
396 | #include <malloc.h> | |
397 | #endif | |
398 | ||
f31e826b | 399 | #if defined (HAVE_DECL_MALLOC) && !HAVE_DECL_MALLOC |
2a0621b9 | 400 | extern void *malloc (size_t); |
c5c76735 JL |
401 | #endif |
402 | ||
f31e826b | 403 | #if defined (HAVE_DECL_CALLOC) && !HAVE_DECL_CALLOC |
2a0621b9 | 404 | extern void *calloc (size_t, size_t); |
c5c76735 JL |
405 | #endif |
406 | ||
f31e826b | 407 | #if defined (HAVE_DECL_REALLOC) && !HAVE_DECL_REALLOC |
2a0621b9 | 408 | extern void *realloc (void *, size_t); |
c5c76735 JL |
409 | #endif |
410 | ||
759af044 | 411 | /* If the system doesn't provide strsignal, we get it defined in |
2ba84f36 | 412 | libiberty but no declaration is supplied. */ |
0a18ddf9 AS |
413 | #if !defined (HAVE_STRSIGNAL) \ |
414 | || (defined (HAVE_DECL_STRSIGNAL) && !HAVE_DECL_STRSIGNAL) | |
759af044 | 415 | # ifndef strsignal |
2a0621b9 | 416 | extern const char *strsignal (int); |
007e8d2a | 417 | # endif |
759af044 | 418 | #endif |
007e8d2a | 419 | |
d2cabf16 | 420 | #ifdef HAVE_GETRLIMIT |
f31e826b | 421 | # if defined (HAVE_DECL_GETRLIMIT) && !HAVE_DECL_GETRLIMIT |
d2cabf16 | 422 | # ifndef getrlimit |
d4d4ae5f | 423 | struct rlimit; |
2a0621b9 | 424 | extern int getrlimit (int, struct rlimit *); |
d2cabf16 KG |
425 | # endif |
426 | # endif | |
427 | #endif | |
428 | ||
429 | #ifdef HAVE_SETRLIMIT | |
f31e826b | 430 | # if defined (HAVE_DECL_SETRLIMIT) && !HAVE_DECL_SETRLIMIT |
d2cabf16 | 431 | # ifndef setrlimit |
d4d4ae5f | 432 | struct rlimit; |
2a0621b9 | 433 | extern int setrlimit (int, const struct rlimit *); |
d2cabf16 KG |
434 | # endif |
435 | # endif | |
436 | #endif | |
437 | ||
f31e826b | 438 | #if defined (HAVE_DECL_ABORT) && !HAVE_DECL_ABORT |
2a0621b9 | 439 | extern void abort (void); |
2a611d21 | 440 | #endif |
d4ba0ead | 441 | |
236ce4b2 ZW |
442 | #if defined (HAVE_DECL_SNPRINTF) && !HAVE_DECL_SNPRINTF |
443 | extern int snprintf (char *, size_t, const char *, ...); | |
444 | #endif | |
445 | ||
367e8319 EB |
446 | #if defined (HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF |
447 | extern int vsnprintf(char *, size_t, const char *, va_list); | |
448 | #endif | |
449 | ||
61d0346d | 450 | /* 1 if we have C99 designated initializers. */ |
18922061 | 451 | #if !defined(HAVE_DESIGNATED_INITIALIZERS) |
61d0346d NB |
452 | #define HAVE_DESIGNATED_INITIALIZERS \ |
453 | ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) | |
18922061 | 454 | #endif |
61d0346d | 455 | |
a05e22b8 RH |
456 | #if HAVE_SYS_STAT_H |
457 | # include <sys/stat.h> | |
458 | #endif | |
9855b854 MN |
459 | |
460 | /* Test if something is a normal file. */ | |
461 | #ifndef S_ISREG | |
462 | #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) | |
463 | #endif | |
464 | ||
465 | /* Test if something is a directory. */ | |
466 | #ifndef S_ISDIR | |
467 | #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) | |
468 | #endif | |
469 | ||
6458033d ZW |
470 | /* Test if something is a character special file. */ |
471 | #ifndef S_ISCHR | |
472 | #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) | |
473 | #endif | |
474 | ||
be3dad6f PDM |
475 | /* Test if something is a block special file. */ |
476 | #ifndef S_ISBLK | |
477 | #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) | |
478 | #endif | |
479 | ||
6458033d ZW |
480 | /* Test if something is a socket. */ |
481 | #ifndef S_ISSOCK | |
482 | # ifdef S_IFSOCK | |
483 | # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) | |
484 | # else | |
485 | # define S_ISSOCK(m) 0 | |
486 | # endif | |
487 | #endif | |
488 | ||
489 | /* Test if something is a FIFO. */ | |
490 | #ifndef S_ISFIFO | |
491 | # ifdef S_IFIFO | |
492 | # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) | |
493 | # else | |
494 | # define S_ISFIFO(m) 0 | |
495 | # endif | |
496 | #endif | |
497 | ||
f3692274 ME |
498 | /* Define well known filenos if the system does not define them. */ |
499 | #ifndef STDIN_FILENO | |
500 | # define STDIN_FILENO 0 | |
501 | #endif | |
502 | #ifndef STDOUT_FILENO | |
503 | # define STDOUT_FILENO 1 | |
504 | #endif | |
924d8a7c | 505 | #ifndef STDERR_FILENO |
f3692274 ME |
506 | # define STDERR_FILENO 2 |
507 | #endif | |
508 | ||
2ba84f36 | 509 | /* Some systems have mkdir that takes a single argument. */ |
75923b2f MK |
510 | #ifdef MKDIR_TAKES_ONE_ARG |
511 | # define mkdir(a,b) mkdir(a) | |
512 | #endif | |
513 | ||
d5b6516d MK |
514 | /* By default, colon separates directories in a path. */ |
515 | #ifndef PATH_SEPARATOR | |
516 | #define PATH_SEPARATOR ':' | |
517 | #endif | |
518 | ||
3dce1408 ZW |
519 | /* Filename handling macros. */ |
520 | #include "filenames.h" | |
521 | ||
522 | /* These should be phased out in favor of IS_DIR_SEPARATOR, where possible. */ | |
d5b6516d | 523 | #ifndef DIR_SEPARATOR |
3dce1408 ZW |
524 | # define DIR_SEPARATOR '/' |
525 | # ifdef HAVE_DOS_BASED_FILE_SYSTEM | |
526 | # define DIR_SEPARATOR_2 '\\' | |
527 | # endif | |
c5c0b3d9 RK |
528 | #endif |
529 | ||
2ba84f36 | 530 | /* Get libiberty declarations. */ |
2778b98d KG |
531 | #include "libiberty.h" |
532 | ||
49009afd JL |
533 | /* Provide a default for the HOST_BIT_BUCKET. |
534 | This suffices for POSIX-like hosts. */ | |
535 | ||
536 | #ifndef HOST_BIT_BUCKET | |
537 | #define HOST_BIT_BUCKET "/dev/null" | |
538 | #endif | |
539 | ||
1c62e7b2 | 540 | /* Be conservative and only use enum bitfields with GCC. |
9612ab65 | 541 | FIXME: provide a complete autoconf test for buggy enum bitfields. */ |
c149cc37 | 542 | |
9612ab65 | 543 | #if (GCC_VERSION > 2000) |
a3bf324c | 544 | #define ENUM_BITFIELD(TYPE) __extension__ enum TYPE |
c149cc37 RL |
545 | #else |
546 | #define ENUM_BITFIELD(TYPE) unsigned int | |
1c62e7b2 KG |
547 | #endif |
548 | ||
e0125cf3 | 549 | #ifndef offsetof |
cf403648 | 550 | #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) |
e0125cf3 | 551 | #endif |
c149cc37 | 552 | |
fbfc1192 ZW |
553 | /* Various error reporting routines want to use __FUNCTION__. */ |
554 | #if (GCC_VERSION < 2007) | |
791ef777 | 555 | #ifndef __FUNCTION__ |
fbfc1192 | 556 | #define __FUNCTION__ "?" |
791ef777 | 557 | #endif /* ! __FUNCTION__ */ |
fbfc1192 ZW |
558 | #endif |
559 | ||
2c3fcba6 ZW |
560 | /* __builtin_expect(A, B) evaluates to A, but notifies the compiler that |
561 | the most likely value of A is B. This feature was added at some point | |
562 | between 2.95 and 3.0. Let's use 3.0 as the lower bound for now. */ | |
563 | #if (GCC_VERSION < 3000) | |
564 | #define __builtin_expect(a, b) (a) | |
565 | #endif | |
566 | ||
b3d1f5b4 NS |
567 | /* Redefine abort to report an internal error w/o coredump, and |
568 | reporting the location of the error in the source file. */ | |
569 | extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; | |
570 | #define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__) | |
571 | ||
06c37c96 NS |
572 | /* Use gcc_assert(EXPR) to test invariants. */ |
573 | #if ENABLE_ASSERT_CHECKING | |
574 | #define gcc_assert(EXPR) \ | |
2c46a62f | 575 | ((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0)) |
06c37c96 | 576 | #else |
2c46a62f NS |
577 | /* Include EXPR, so that unused variable warnings do not occur. */ |
578 | #define gcc_assert(EXPR) ((void)(0 && (EXPR))) | |
06c37c96 NS |
579 | #endif |
580 | ||
581 | /* Use gcc_unreachable() to mark unreachable locations (like an | |
582 | unreachable default case of a switch. Do not use gcc_assert(0). */ | |
583 | #define gcc_unreachable() (fancy_abort (__FILE__, __LINE__, __FUNCTION__)) | |
584 | ||
2fac9c01 ZW |
585 | /* Provide a fake boolean type. We make no attempt to use the |
586 | C99 _Bool, as it may not be available in the bootstrap compiler, | |
f676971a | 587 | and even if it is, it is liable to be buggy. |
2fac9c01 ZW |
588 | This must be after all inclusion of system headers, as some of |
589 | them will mess us up. */ | |
ca79179c | 590 | |
d6edb99e ZW |
591 | #undef TRUE |
592 | #undef FALSE | |
593 | ||
ca79179c BI |
594 | #ifdef __cplusplus |
595 | /* Obsolete. */ | |
596 | # define TRUE true | |
597 | # define FALSE false | |
598 | #else /* !__cplusplus */ | |
599 | # undef bool | |
600 | # undef true | |
601 | # undef false | |
602 | ||
603 | # define bool unsigned char | |
604 | # define true 1 | |
605 | # define false 0 | |
606 | ||
607 | /* Obsolete. */ | |
608 | # define TRUE true | |
609 | # define FALSE false | |
610 | #endif /* !__cplusplus */ | |
d6edb99e | 611 | |
d6edb99e | 612 | |
2fac9c01 ZW |
613 | /* Some compilers do not allow the use of unsigned char in bitfields. */ |
614 | #define BOOL_BITFIELD unsigned int | |
615 | ||
f4ce9d90 KG |
616 | /* As the last action in this file, we poison the identifiers that |
617 | shouldn't be used. Note, luckily gcc-3.0's token-based integrated | |
618 | preprocessor won't trip on poisoned identifiers that arrive from | |
619 | the expansion of macros. E.g. #define strrchr rindex, won't error | |
620 | if rindex is poisoned after this directive is issued and later on | |
621 | strrchr is called. | |
622 | ||
623 | Note: We define bypass macros for the few cases where we really | |
624 | want to use the libc memory allocation routines. Otherwise we | |
625 | insist you use the "x" versions from libiberty. */ | |
626 | ||
627 | #define really_call_malloc malloc | |
628 | #define really_call_calloc calloc | |
629 | #define really_call_realloc realloc | |
630 | ||
f92ed976 | 631 | #if defined(FLEX_SCANNER) || defined(YYBISON) || defined(YYBYACC) |
4977bab6 | 632 | /* Flex and bison use malloc and realloc. Yuk. Note that this means |
32dd366d | 633 | really_call_* cannot be used in a .l or .y file. */ |
4977bab6 ZW |
634 | #define malloc xmalloc |
635 | #define realloc xrealloc | |
636 | #endif | |
637 | ||
f4ce9d90 KG |
638 | #if (GCC_VERSION >= 3000) |
639 | ||
77b84559 KG |
640 | /* Note autoconf checks for prototype declarations and includes |
641 | system.h while doing so. Only poison these tokens if actually | |
642 | compiling gcc, so that the autoconf declaration tests for malloc | |
643 | etc don't spuriously fail. */ | |
644 | #ifdef IN_GCC | |
8a0e5115 KG |
645 | #undef calloc |
646 | #undef strdup | |
e2500fed GK |
647 | #pragma GCC poison calloc strdup |
648 | ||
4977bab6 | 649 | #if !defined(FLEX_SCANNER) && !defined(YYBISON) |
e2500fed GK |
650 | #undef malloc |
651 | #undef realloc | |
652 | #pragma GCC poison malloc realloc | |
653 | #endif | |
41441dc7 NB |
654 | |
655 | /* Old target macros that have moved to the target hooks structure. */ | |
656 | #pragma GCC poison ASM_OPEN_PAREN ASM_CLOSE_PAREN \ | |
657 | FUNCTION_PROLOGUE FUNCTION_EPILOGUE \ | |
658 | FUNCTION_END_PROLOGUE FUNCTION_BEGIN_EPILOGUE \ | |
659 | DECL_MACHINE_ATTRIBUTES COMP_TYPE_ATTRIBUTES INSERT_ATTRIBUTES \ | |
660 | VALID_MACHINE_DECL_ATTRIBUTE VALID_MACHINE_TYPE_ATTRIBUTE \ | |
661 | SET_DEFAULT_TYPE_ATTRIBUTES SET_DEFAULT_DECL_ATTRIBUTES \ | |
662 | MERGE_MACHINE_TYPE_ATTRIBUTES MERGE_MACHINE_DECL_ATTRIBUTES \ | |
aa6ad1a6 | 663 | MD_INIT_BUILTINS MD_EXPAND_BUILTIN ASM_OUTPUT_CONSTRUCTOR \ |
44a147ad | 664 | ASM_OUTPUT_DESTRUCTOR SIGNED_CHAR_SPEC MAX_CHAR_TYPE_SIZE \ |
fb49053f | 665 | WCHAR_UNSIGNED UNIQUE_SECTION SELECT_SECTION SELECT_RTX_SECTION \ |
3961e8fe | 666 | ENCODE_SECTION_INFO STRIP_NAME_ENCODING ASM_GLOBALIZE_LABEL \ |
dcefdf67 | 667 | ASM_OUTPUT_MI_THUNK CONST_COSTS RTX_COSTS DEFAULT_RTX_COSTS \ |
75c20980 | 668 | ADDRESS_COST MACHINE_DEPENDENT_REORG ASM_FILE_START ASM_FILE_END \ |
30ee56e1 ZW |
669 | ASM_SIMPLIFY_DWARF_ADDR INIT_TARGET_OPTABS INIT_SUBTARGET_OPTABS \ |
670 | INIT_GOFAST_OPTABS MULSI3_LIBCALL MULDI3_LIBCALL DIVSI3_LIBCALL \ | |
671 | DIVDI3_LIBCALL UDIVSI3_LIBCALL UDIVDI3_LIBCALL MODSI3_LIBCALL \ | |
4ac8340c | 672 | MODDI3_LIBCALL UMODSI3_LIBCALL UMODDI3_LIBCALL BUILD_VA_LIST_TYPE \ |
510d1e80 | 673 | PRETEND_OUTGOING_VARARGS_NAMED STRUCT_VALUE_INCOMING_REGNUM \ |
b602b7b6 | 674 | ASM_OUTPUT_SECTION_NAME PROMOTE_FUNCTION_ARGS \ |
fefcb65c KH |
675 | STRUCT_VALUE_INCOMING STRICT_ARGUMENT_NAMING \ |
676 | PROMOTE_FUNCTION_RETURN PROMOTE_PROTOTYPES STRUCT_VALUE_REGNUM \ | |
221ee7c9 | 677 | SETUP_INCOMING_VARARGS EXPAND_BUILTIN_SAVEREGS \ |
84b8b0e0 | 678 | DEFAULT_SHORT_ENUMS SPLIT_COMPLEX_ARGS MD_ASM_CLOBBERS \ |
fe984136 | 679 | HANDLE_PRAGMA_REDEFINE_EXTNAME HANDLE_PRAGMA_EXTERN_PREFIX \ |
f676971a | 680 | MUST_PASS_IN_STACK FUNCTION_ARG_PASS_BY_REFERENCE \ |
78a52f11 | 681 | VECTOR_MODE_SUPPORTED_P TARGET_SUPPORTS_HIDDEN \ |
b48f503c KK |
682 | FUNCTION_ARG_PARTIAL_NREGS ASM_OUTPUT_DWARF_DTPREL \ |
683 | ALLOCATE_INITIAL_VALUE | |
aa6ad1a6 | 684 | |
e2500fed | 685 | /* Other obsolete target macros, or macros that used to be in target |
006946e4 JM |
686 | headers and were not used, and may be obsolete or may never have |
687 | been used. */ | |
c08f71aa | 688 | #pragma GCC poison INT_ASM_OP ASM_OUTPUT_EH_REGION_BEG CPP_PREDEFINES \ |
6a6c0154 | 689 | ASM_OUTPUT_EH_REGION_END ASM_OUTPUT_LABELREF_AS_INT SMALL_STACK \ |
ed722f66 | 690 | DOESNT_NEED_UNWINDER EH_TABLE_LOOKUP OBJC_SELECTORS_WITHOUT_LABELS \ |
16c484c7 | 691 | OMIT_EH_TABLE EASY_DIV_EXPR IMPLICIT_FIX_EXPR \ |
006946e4 | 692 | LONGJMP_RESTORE_FROM_STACK MAX_INT_TYPE_SIZE ASM_IDENTIFY_GCC \ |
c99d986a | 693 | STDC_VALUE TRAMPOLINE_ALIGN ASM_IDENTIFY_GCC_AFTER_SOURCE \ |
f458d1d5 | 694 | SLOW_ZERO_EXTEND SUBREG_REGNO_OFFSET DWARF_LINE_MIN_INSTR_LENGTH \ |
a11eba95 | 695 | TRADITIONAL_RETURN_FLOAT NO_BUILTIN_SIZE_TYPE \ |
fc881338 RH |
696 | NO_BUILTIN_PTRDIFF_TYPE NO_BUILTIN_WCHAR_TYPE NO_BUILTIN_WINT_TYPE \ |
697 | BLOCK_PROFILER BLOCK_PROFILER_CODE FUNCTION_BLOCK_PROFILER \ | |
698 | FUNCTION_BLOCK_PROFILER_EXIT MACHINE_STATE_SAVE \ | |
68d5a1cd KC |
699 | MACHINE_STATE_RESTORE SCCS_DIRECTIVE SECTION_ASM_OP BYTEORDER \ |
700 | ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL HOST_WORDS_BIG_ENDIAN \ | |
80eaf415 | 701 | OBJC_PROLOGUE ALLOCATE_TRAMPOLINE HANDLE_PRAGMA ROUND_TYPE_SIZE \ |
f691dc3b AJ |
702 | ROUND_TYPE_SIZE_UNIT CONST_SECTION_ASM_OP CRT_GET_RFIB_TEXT \ |
703 | DBX_LBRAC_FIRST DBX_OUTPUT_ENUM DBX_OUTPUT_SOURCE_FILENAME \ | |
704 | DBX_WORKING_DIRECTORY INSN_CACHE_DEPTH INSN_CACHE_SIZE \ | |
5145a02e | 705 | INSN_CACHE_LINE_WIDTH INIT_SECTION_PREAMBLE NEED_ATEXIT ON_EXIT \ |
edf11bda | 706 | EXIT_BODY OBJECT_FORMAT_ROSE MULTIBYTE_CHARS MAP_CHARACTER \ |
ba029213 | 707 | LIBGCC_NEEDS_DOUBLE FINAL_PRESCAN_LABEL DEFAULT_CALLER_SAVES \ |
c6a515f4 | 708 | LOAD_ARGS_REVERSED MAX_INTEGER_COMPUTATION_MODE \ |
b816f339 | 709 | CONVERT_HARD_REGISTER_TO_SSA_P ASM_OUTPUT_MAIN_SOURCE_FILENAME \ |
616f6d84 | 710 | FIRST_INSN_ADDRESS TEXT_SECTION SHARED_BSS_SECTION_ASM_OP \ |
16201823 | 711 | PROMOTED_MODE EXPAND_BUILTIN_VA_END \ |
9b2b3375 | 712 | LINKER_DOES_NOT_WORK_WITH_DWARF2 FUNCTION_ARG_KEEP_AS_REFERENCE \ |
1197924d | 713 | GIV_SORT_CRITERION MAX_LONG_TYPE_SIZE MAX_LONG_DOUBLE_TYPE_SIZE \ |
9e9126f3 | 714 | MAX_WCHAR_TYPE_SIZE SHARED_SECTION_ASM_OP INTEGRATE_THRESHOLD \ |
c1a41c2f | 715 | FINAL_REG_PARM_STACK_SPACE MAYBE_REG_PARM_STACK_SPACE \ |
fdf89bf5 | 716 | TRADITIONAL_PIPELINE_INTERFACE DFA_PIPELINE_INTERFACE \ |
67dfe110 | 717 | DBX_OUTPUT_STANDARD_TYPES BUILTIN_SETJMP_FRAME_VALUE \ |
082a099c | 718 | SUNOS4_SHARED_LIBRARIES PROMOTE_FOR_CALL_ONLY \ |
bb2d400f | 719 | SPACE_AFTER_L_OPTION NO_RECURSIVE_FUNCTION_CSE \ |
b89dc911 | 720 | DEFAULT_MAIN_RETURN TARGET_MEM_FUNCTIONS EXPAND_BUILTIN_VA_ARG \ |
ac746f1d ZW |
721 | COLLECT_PARSE_FLAG DWARF2_GENERATE_TEXT_SECTION_LABEL WINNING_GDB \ |
722 | ASM_OUTPUT_FILENAME ASM_OUTPUT_SOURCE_LINE FILE_NAME_JOINER \ | |
723 | GDB_INV_REF_REGPARM_STABS_LETTER DBX_MEMPARM_STABS_LETTER \ | |
93a27b7b | 724 | PUT_SDB_SRC_FILE STABS_GCC_MARKER DBX_OUTPUT_FUNCTION_END \ |
6e14af16 | 725 | DBX_OUTPUT_GCC_MARKER DBX_FINISH_SYMBOL SDB_GENERATE_FAKE \ |
6be85b25 | 726 | NON_SAVING_SETJMP TARGET_LATE_RTL_PROLOGUE_EPILOGUE \ |
c5ff069d | 727 | CASE_DROPS_THROUGH TARGET_BELL TARGET_BS TARGET_CR TARGET_DIGIT0 \ |
57642751 | 728 | TARGET_ESC TARGET_FF TARGET_NEWLINE TARGET_TAB TARGET_VT \ |
bacf5b96 | 729 | LINK_LIBGCC_SPECIAL DONT_ACCESS_GBLS_AFTER_EPILOGUE \ |
c2acaf06 | 730 | TARGET_OPTIONS TARGET_SWITCHES EXTRA_CC_MODES FINALIZE_PIC \ |
d6b5193b RS |
731 | PREDICATE_CODES SPECIAL_MODE_PREDICATES HOST_PTR_PRINTF \ |
732 | EXTRA_SECTIONS EXTRA_SECTION_FUNCTIONS READONLY_DATA_SECTION \ | |
733 | TARGET_ASM_EXCEPTION_SECTION TARGET_ASM_EH_FRAME_SECTION | |
aa6ad1a6 | 734 | |
e2500fed GK |
735 | /* Hooks that are no longer used. */ |
736 | #pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE \ | |
9dcf6e73 JM |
737 | LANG_HOOKS_MARK_TREE LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES \ |
738 | LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS \ | |
739 | LANG_HOOKS_PUSHLEVEL LANG_HOOKS_SET_BLOCK \ | |
740 | LANG_HOOKS_MAYBE_BUILD_CLEANUP LANG_HOOKS_UPDATE_DECL_AFTER_SAVING \ | |
d101034c | 741 | LANG_HOOKS_POPLEVEL LANG_HOOKS_TRUTHVALUE_CONVERSION |
e2500fed | 742 | |
b0c231bb KG |
743 | /* Libiberty macros that are no longer used in GCC. */ |
744 | #undef ANSI_PROTOTYPES | |
745 | #undef PTR_CONST | |
746 | #undef LONG_DOUBLE | |
747 | #undef VPARAMS | |
748 | #undef VA_OPEN | |
749 | #undef VA_FIXEDARG | |
750 | #undef VA_CLOSE | |
751 | #undef VA_START | |
627aa08a KG |
752 | #pragma GCC poison ANSI_PROTOTYPES PTR_CONST LONG_DOUBLE VPARAMS VA_OPEN \ |
753 | VA_FIXEDARG VA_CLOSE VA_START | |
77b84559 | 754 | #endif /* IN_GCC */ |
f4ce9d90 | 755 | |
8e944909 KG |
756 | /* Note: not all uses of the `index' token (e.g. variable names and |
757 | structure members) have been eliminated. */ | |
758 | #undef bcopy | |
8a0e5115 KG |
759 | #undef bzero |
760 | #undef bcmp | |
761 | #undef rindex | |
8e944909 | 762 | #pragma GCC poison bcopy bzero bcmp rindex |
f4ce9d90 KG |
763 | |
764 | #endif /* GCC >= 3.0 */ | |
765 | ||
88657302 | 766 | #endif /* ! GCC_SYSTEM_H */ |