| 1 | /* Get common system includes and various definitions and declarations based |
| 2 | on autoconf macros. |
| 3 | Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 |
| 4 | Free Software Foundation, Inc. |
| 5 | |
| 6 | This file is part of GCC. |
| 7 | |
| 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. |
| 12 | |
| 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. |
| 17 | |
| 18 | You should have received a copy of the GNU General Public License |
| 19 | along with GCC; see the file COPYING. If not, write to the Free |
| 20 | Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA |
| 21 | 02110-1301, USA. */ |
| 22 | |
| 23 | |
| 24 | #ifndef GCC_SYSTEM_H |
| 25 | #define GCC_SYSTEM_H |
| 26 | |
| 27 | /* We must include stdarg.h before stdio.h. */ |
| 28 | #include <stdarg.h> |
| 29 | |
| 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 | |
| 38 | #ifdef HAVE_STDDEF_H |
| 39 | # include <stddef.h> |
| 40 | #endif |
| 41 | |
| 42 | #include <stdio.h> |
| 43 | |
| 44 | /* Define a generic NULL if one hasn't already been defined. */ |
| 45 | #ifndef NULL |
| 46 | #define NULL 0 |
| 47 | #endif |
| 48 | |
| 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 | |
| 54 | /* The compiler is not a multi-threaded application and therefore we |
| 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). |
| 58 | |
| 59 | HAVE_DECL_PUTC_UNLOCKED actually indicates whether or not the stdio |
| 60 | code is multi-thread safe by default. If it is set to 0, then do |
| 61 | not worry about using the _unlocked functions. |
| 62 | |
| 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). */ |
| 66 | |
| 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 |
| 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 |
| 85 | # ifdef HAVE_FPUTC_UNLOCKED |
| 86 | # undef fputc |
| 87 | # define fputc(C, Stream) fputc_unlocked (C, Stream) |
| 88 | # endif |
| 89 | |
| 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 |
| 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 |
| 136 | extern int fputs_unlocked (const char *, FILE *); |
| 137 | # endif |
| 138 | # endif |
| 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 |
| 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 |
| 157 | extern size_t fwrite_unlocked (const void *, size_t, size_t, FILE *); |
| 158 | # endif |
| 159 | # endif |
| 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 |
| 166 | extern int fprintf_unlocked (FILE *, const char *, ...); |
| 167 | # endif |
| 168 | # endif |
| 169 | |
| 170 | #endif |
| 171 | |
| 172 | /* ??? Glibc's fwrite/fread_unlocked macros cause |
| 173 | "warning: signed and unsigned type in conditional expression". */ |
| 174 | #undef fread_unlocked |
| 175 | #undef fwrite_unlocked |
| 176 | |
| 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> |
| 181 | |
| 182 | #include <sys/types.h> |
| 183 | |
| 184 | #include <errno.h> |
| 185 | |
| 186 | #if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO |
| 187 | extern int errno; |
| 188 | #endif |
| 189 | |
| 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 | |
| 194 | #ifdef STRING_WITH_STRINGS |
| 195 | # include <string.h> |
| 196 | # include <strings.h> |
| 197 | #else |
| 198 | # ifdef HAVE_STRING_H |
| 199 | # include <string.h> |
| 200 | # else |
| 201 | # ifdef HAVE_STRINGS_H |
| 202 | # include <strings.h> |
| 203 | # endif |
| 204 | # endif |
| 205 | #endif |
| 206 | |
| 207 | #ifdef HAVE_STDLIB_H |
| 208 | # include <stdlib.h> |
| 209 | #endif |
| 210 | |
| 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 | |
| 230 | #ifdef HAVE_UNISTD_H |
| 231 | # include <unistd.h> |
| 232 | #endif |
| 233 | |
| 234 | #ifdef HAVE_SYS_PARAM_H |
| 235 | # include <sys/param.h> |
| 236 | /* We use this identifier later and it appears in some vendor param.h's. */ |
| 237 | # undef PREFETCH |
| 238 | #endif |
| 239 | |
| 240 | #if HAVE_LIMITS_H |
| 241 | # include <limits.h> |
| 242 | #endif |
| 243 | |
| 244 | /* Get definitions of HOST_WIDE_INT and HOST_WIDEST_INT. */ |
| 245 | #include "hwint.h" |
| 246 | |
| 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) \ |
| 255 | ((unsigned HOST_WIDE_INT)((VALUE) - (LOWER)) <= ((UPPER) - (LOWER))) |
| 256 | |
| 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 | |
| 273 | #ifdef TIME_WITH_SYS_TIME |
| 274 | # include <sys/time.h> |
| 275 | # include <time.h> |
| 276 | #else |
| 277 | # if HAVE_SYS_TIME_H |
| 278 | # include <sys/time.h> |
| 279 | # else |
| 280 | # ifdef HAVE_TIME_H |
| 281 | # include <time.h> |
| 282 | # endif |
| 283 | # endif |
| 284 | #endif |
| 285 | |
| 286 | #ifdef HAVE_FCNTL_H |
| 287 | # include <fcntl.h> |
| 288 | #else |
| 289 | # ifdef HAVE_SYS_FILE_H |
| 290 | # include <sys/file.h> |
| 291 | # endif |
| 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 |
| 305 | #ifndef O_RDONLY |
| 306 | # define O_RDONLY 0 |
| 307 | #endif |
| 308 | #ifndef O_WRONLY |
| 309 | # define O_WRONLY 1 |
| 310 | #endif |
| 311 | |
| 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 | |
| 321 | /* Returns the least number N such that N * Y >= X. */ |
| 322 | #define CEIL(x,y) (((x) + (y) - 1) / (y)) |
| 323 | |
| 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 |
| 340 | #ifndef WSTOPSIG |
| 341 | #define WSTOPSIG WEXITSTATUS |
| 342 | #endif |
| 343 | #ifndef WCOREDUMP |
| 344 | #define WCOREDUMP(S) ((S) & WCOREFLG) |
| 345 | #endif |
| 346 | #ifndef WCOREFLG |
| 347 | #define WCOREFLG 0200 |
| 348 | #endif |
| 349 | |
| 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_*)". */ |
| 354 | |
| 355 | #if defined (HAVE_DECL_ATOF) && !HAVE_DECL_ATOF |
| 356 | extern double atof (const char *); |
| 357 | #endif |
| 358 | |
| 359 | #if defined (HAVE_DECL_ATOL) && !HAVE_DECL_ATOL |
| 360 | extern long atol (const char *); |
| 361 | #endif |
| 362 | |
| 363 | #if defined (HAVE_DECL_FREE) && !HAVE_DECL_FREE |
| 364 | extern void free (void *); |
| 365 | #endif |
| 366 | |
| 367 | #if defined (HAVE_DECL_GETCWD) && !HAVE_DECL_GETCWD |
| 368 | extern char *getcwd (char *, size_t); |
| 369 | #endif |
| 370 | |
| 371 | #if defined (HAVE_DECL_GETENV) && !HAVE_DECL_GETENV |
| 372 | extern char *getenv (const char *); |
| 373 | #endif |
| 374 | |
| 375 | #if defined (HAVE_DECL_GETOPT) && !HAVE_DECL_GETOPT |
| 376 | extern int getopt (int, char * const *, const char *); |
| 377 | #endif |
| 378 | |
| 379 | #if defined (HAVE_DECL_GETPAGESIZE) && !HAVE_DECL_GETPAGESIZE |
| 380 | extern int getpagesize (void); |
| 381 | #endif |
| 382 | |
| 383 | #if defined (HAVE_DECL_GETWD) && !HAVE_DECL_GETWD |
| 384 | extern char *getwd (char *); |
| 385 | #endif |
| 386 | |
| 387 | #if defined (HAVE_DECL_SBRK) && !HAVE_DECL_SBRK |
| 388 | extern void *sbrk (int); |
| 389 | #endif |
| 390 | |
| 391 | #if defined (HAVE_DECL_STRSTR) && !HAVE_DECL_STRSTR |
| 392 | extern char *strstr (const char *, const char *); |
| 393 | #endif |
| 394 | |
| 395 | #ifdef HAVE_MALLOC_H |
| 396 | #include <malloc.h> |
| 397 | #endif |
| 398 | |
| 399 | #if defined (HAVE_DECL_MALLOC) && !HAVE_DECL_MALLOC |
| 400 | extern void *malloc (size_t); |
| 401 | #endif |
| 402 | |
| 403 | #if defined (HAVE_DECL_CALLOC) && !HAVE_DECL_CALLOC |
| 404 | extern void *calloc (size_t, size_t); |
| 405 | #endif |
| 406 | |
| 407 | #if defined (HAVE_DECL_REALLOC) && !HAVE_DECL_REALLOC |
| 408 | extern void *realloc (void *, size_t); |
| 409 | #endif |
| 410 | |
| 411 | /* If the system doesn't provide strsignal, we get it defined in |
| 412 | libiberty but no declaration is supplied. */ |
| 413 | #if !defined (HAVE_STRSIGNAL) \ |
| 414 | || (defined (HAVE_DECL_STRSIGNAL) && !HAVE_DECL_STRSIGNAL) |
| 415 | # ifndef strsignal |
| 416 | extern const char *strsignal (int); |
| 417 | # endif |
| 418 | #endif |
| 419 | |
| 420 | #ifdef HAVE_GETRLIMIT |
| 421 | # if defined (HAVE_DECL_GETRLIMIT) && !HAVE_DECL_GETRLIMIT |
| 422 | # ifndef getrlimit |
| 423 | struct rlimit; |
| 424 | extern int getrlimit (int, struct rlimit *); |
| 425 | # endif |
| 426 | # endif |
| 427 | #endif |
| 428 | |
| 429 | #ifdef HAVE_SETRLIMIT |
| 430 | # if defined (HAVE_DECL_SETRLIMIT) && !HAVE_DECL_SETRLIMIT |
| 431 | # ifndef setrlimit |
| 432 | struct rlimit; |
| 433 | extern int setrlimit (int, const struct rlimit *); |
| 434 | # endif |
| 435 | # endif |
| 436 | #endif |
| 437 | |
| 438 | #if defined (HAVE_DECL_ABORT) && !HAVE_DECL_ABORT |
| 439 | extern void abort (void); |
| 440 | #endif |
| 441 | |
| 442 | #if defined (HAVE_DECL_SNPRINTF) && !HAVE_DECL_SNPRINTF |
| 443 | extern int snprintf (char *, size_t, const char *, ...); |
| 444 | #endif |
| 445 | |
| 446 | #if defined (HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF |
| 447 | extern int vsnprintf(char *, size_t, const char *, va_list); |
| 448 | #endif |
| 449 | |
| 450 | /* 1 if we have C99 designated initializers. */ |
| 451 | #if !defined(HAVE_DESIGNATED_INITIALIZERS) |
| 452 | #define HAVE_DESIGNATED_INITIALIZERS \ |
| 453 | ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) |
| 454 | #endif |
| 455 | |
| 456 | #if HAVE_SYS_STAT_H |
| 457 | # include <sys/stat.h> |
| 458 | #endif |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 |
| 505 | #ifndef STDERR_FILENO |
| 506 | # define STDERR_FILENO 2 |
| 507 | #endif |
| 508 | |
| 509 | /* Some systems have mkdir that takes a single argument. */ |
| 510 | #ifdef MKDIR_TAKES_ONE_ARG |
| 511 | # define mkdir(a,b) mkdir(a) |
| 512 | #endif |
| 513 | |
| 514 | /* By default, colon separates directories in a path. */ |
| 515 | #ifndef PATH_SEPARATOR |
| 516 | #define PATH_SEPARATOR ':' |
| 517 | #endif |
| 518 | |
| 519 | /* Filename handling macros. */ |
| 520 | #include "filenames.h" |
| 521 | |
| 522 | /* These should be phased out in favor of IS_DIR_SEPARATOR, where possible. */ |
| 523 | #ifndef DIR_SEPARATOR |
| 524 | # define DIR_SEPARATOR '/' |
| 525 | # ifdef HAVE_DOS_BASED_FILE_SYSTEM |
| 526 | # define DIR_SEPARATOR_2 '\\' |
| 527 | # endif |
| 528 | #endif |
| 529 | |
| 530 | /* Get libiberty declarations. */ |
| 531 | #include "libiberty.h" |
| 532 | |
| 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 | |
| 540 | /* Be conservative and only use enum bitfields with GCC. |
| 541 | FIXME: provide a complete autoconf test for buggy enum bitfields. */ |
| 542 | |
| 543 | #if (GCC_VERSION > 2000) |
| 544 | #define ENUM_BITFIELD(TYPE) __extension__ enum TYPE |
| 545 | #else |
| 546 | #define ENUM_BITFIELD(TYPE) unsigned int |
| 547 | #endif |
| 548 | |
| 549 | #ifndef offsetof |
| 550 | #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) |
| 551 | #endif |
| 552 | |
| 553 | /* Various error reporting routines want to use __FUNCTION__. */ |
| 554 | #if (GCC_VERSION < 2007) |
| 555 | #ifndef __FUNCTION__ |
| 556 | #define __FUNCTION__ "?" |
| 557 | #endif /* ! __FUNCTION__ */ |
| 558 | #endif |
| 559 | |
| 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 | |
| 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 | |
| 572 | /* Use gcc_assert(EXPR) to test invariants. */ |
| 573 | #if ENABLE_ASSERT_CHECKING |
| 574 | #define gcc_assert(EXPR) \ |
| 575 | ((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0)) |
| 576 | #else |
| 577 | /* Include EXPR, so that unused variable warnings do not occur. */ |
| 578 | #define gcc_assert(EXPR) ((void)(0 && (EXPR))) |
| 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 | |
| 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, |
| 587 | and even if it is, it is liable to be buggy. |
| 588 | This must be after all inclusion of system headers, as some of |
| 589 | them will mess us up. */ |
| 590 | |
| 591 | #undef TRUE |
| 592 | #undef FALSE |
| 593 | |
| 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 */ |
| 611 | |
| 612 | |
| 613 | /* Some compilers do not allow the use of unsigned char in bitfields. */ |
| 614 | #define BOOL_BITFIELD unsigned int |
| 615 | |
| 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 | |
| 631 | #if defined(FLEX_SCANNER) || defined(YYBISON) || defined(YYBYACC) |
| 632 | /* Flex and bison use malloc and realloc. Yuk. Note that this means |
| 633 | really_call_* cannot be used in a .l or .y file. */ |
| 634 | #define malloc xmalloc |
| 635 | #define realloc xrealloc |
| 636 | #endif |
| 637 | |
| 638 | #if (GCC_VERSION >= 3000) |
| 639 | |
| 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 |
| 645 | #undef calloc |
| 646 | #undef strdup |
| 647 | #pragma GCC poison calloc strdup |
| 648 | |
| 649 | #if !defined(FLEX_SCANNER) && !defined(YYBISON) && !defined(YYBYACC) |
| 650 | #undef malloc |
| 651 | #undef realloc |
| 652 | #pragma GCC poison malloc realloc |
| 653 | #endif |
| 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 \ |
| 663 | MD_INIT_BUILTINS MD_EXPAND_BUILTIN ASM_OUTPUT_CONSTRUCTOR \ |
| 664 | ASM_OUTPUT_DESTRUCTOR SIGNED_CHAR_SPEC MAX_CHAR_TYPE_SIZE \ |
| 665 | WCHAR_UNSIGNED UNIQUE_SECTION SELECT_SECTION SELECT_RTX_SECTION \ |
| 666 | ENCODE_SECTION_INFO STRIP_NAME_ENCODING ASM_GLOBALIZE_LABEL \ |
| 667 | ASM_OUTPUT_MI_THUNK CONST_COSTS RTX_COSTS DEFAULT_RTX_COSTS \ |
| 668 | ADDRESS_COST MACHINE_DEPENDENT_REORG ASM_FILE_START ASM_FILE_END \ |
| 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 \ |
| 672 | MODDI3_LIBCALL UMODSI3_LIBCALL UMODDI3_LIBCALL BUILD_VA_LIST_TYPE \ |
| 673 | PRETEND_OUTGOING_VARARGS_NAMED STRUCT_VALUE_INCOMING_REGNUM \ |
| 674 | ASM_OUTPUT_SECTION_NAME PROMOTE_FUNCTION_ARGS \ |
| 675 | STRUCT_VALUE_INCOMING STRICT_ARGUMENT_NAMING \ |
| 676 | PROMOTE_FUNCTION_RETURN PROMOTE_PROTOTYPES STRUCT_VALUE_REGNUM \ |
| 677 | SETUP_INCOMING_VARARGS EXPAND_BUILTIN_SAVEREGS \ |
| 678 | DEFAULT_SHORT_ENUMS SPLIT_COMPLEX_ARGS MD_ASM_CLOBBERS \ |
| 679 | HANDLE_PRAGMA_REDEFINE_EXTNAME HANDLE_PRAGMA_EXTERN_PREFIX \ |
| 680 | MUST_PASS_IN_STACK FUNCTION_ARG_PASS_BY_REFERENCE \ |
| 681 | VECTOR_MODE_SUPPORTED_P TARGET_SUPPORTS_HIDDEN \ |
| 682 | FUNCTION_ARG_PARTIAL_NREGS ASM_OUTPUT_DWARF_DTPREL \ |
| 683 | ALLOCATE_INITIAL_VALUE |
| 684 | |
| 685 | /* Other obsolete target macros, or macros that used to be in target |
| 686 | headers and were not used, and may be obsolete or may never have |
| 687 | been used. */ |
| 688 | #pragma GCC poison INT_ASM_OP ASM_OUTPUT_EH_REGION_BEG CPP_PREDEFINES \ |
| 689 | ASM_OUTPUT_EH_REGION_END ASM_OUTPUT_LABELREF_AS_INT SMALL_STACK \ |
| 690 | DOESNT_NEED_UNWINDER EH_TABLE_LOOKUP OBJC_SELECTORS_WITHOUT_LABELS \ |
| 691 | OMIT_EH_TABLE EASY_DIV_EXPR IMPLICIT_FIX_EXPR \ |
| 692 | LONGJMP_RESTORE_FROM_STACK MAX_INT_TYPE_SIZE ASM_IDENTIFY_GCC \ |
| 693 | STDC_VALUE TRAMPOLINE_ALIGN ASM_IDENTIFY_GCC_AFTER_SOURCE \ |
| 694 | SLOW_ZERO_EXTEND SUBREG_REGNO_OFFSET DWARF_LINE_MIN_INSTR_LENGTH \ |
| 695 | TRADITIONAL_RETURN_FLOAT NO_BUILTIN_SIZE_TYPE \ |
| 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 \ |
| 699 | MACHINE_STATE_RESTORE SCCS_DIRECTIVE SECTION_ASM_OP BYTEORDER \ |
| 700 | ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL HOST_WORDS_BIG_ENDIAN \ |
| 701 | OBJC_PROLOGUE ALLOCATE_TRAMPOLINE HANDLE_PRAGMA ROUND_TYPE_SIZE \ |
| 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 \ |
| 705 | INSN_CACHE_LINE_WIDTH INIT_SECTION_PREAMBLE NEED_ATEXIT ON_EXIT \ |
| 706 | EXIT_BODY OBJECT_FORMAT_ROSE MULTIBYTE_CHARS MAP_CHARACTER \ |
| 707 | LIBGCC_NEEDS_DOUBLE FINAL_PRESCAN_LABEL DEFAULT_CALLER_SAVES \ |
| 708 | LOAD_ARGS_REVERSED MAX_INTEGER_COMPUTATION_MODE \ |
| 709 | CONVERT_HARD_REGISTER_TO_SSA_P ASM_OUTPUT_MAIN_SOURCE_FILENAME \ |
| 710 | FIRST_INSN_ADDRESS TEXT_SECTION SHARED_BSS_SECTION_ASM_OP \ |
| 711 | PROMOTED_MODE EXPAND_BUILTIN_VA_END \ |
| 712 | LINKER_DOES_NOT_WORK_WITH_DWARF2 FUNCTION_ARG_KEEP_AS_REFERENCE \ |
| 713 | GIV_SORT_CRITERION MAX_LONG_TYPE_SIZE MAX_LONG_DOUBLE_TYPE_SIZE \ |
| 714 | MAX_WCHAR_TYPE_SIZE SHARED_SECTION_ASM_OP INTEGRATE_THRESHOLD \ |
| 715 | FINAL_REG_PARM_STACK_SPACE MAYBE_REG_PARM_STACK_SPACE \ |
| 716 | TRADITIONAL_PIPELINE_INTERFACE DFA_PIPELINE_INTERFACE \ |
| 717 | DBX_OUTPUT_STANDARD_TYPES BUILTIN_SETJMP_FRAME_VALUE \ |
| 718 | SUNOS4_SHARED_LIBRARIES PROMOTE_FOR_CALL_ONLY \ |
| 719 | SPACE_AFTER_L_OPTION NO_RECURSIVE_FUNCTION_CSE \ |
| 720 | DEFAULT_MAIN_RETURN TARGET_MEM_FUNCTIONS EXPAND_BUILTIN_VA_ARG \ |
| 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 \ |
| 724 | PUT_SDB_SRC_FILE STABS_GCC_MARKER DBX_OUTPUT_FUNCTION_END \ |
| 725 | DBX_OUTPUT_GCC_MARKER DBX_FINISH_SYMBOL SDB_GENERATE_FAKE \ |
| 726 | NON_SAVING_SETJMP TARGET_LATE_RTL_PROLOGUE_EPILOGUE \ |
| 727 | CASE_DROPS_THROUGH TARGET_BELL TARGET_BS TARGET_CR TARGET_DIGIT0 \ |
| 728 | TARGET_ESC TARGET_FF TARGET_NEWLINE TARGET_TAB TARGET_VT \ |
| 729 | LINK_LIBGCC_SPECIAL DONT_ACCESS_GBLS_AFTER_EPILOGUE \ |
| 730 | TARGET_OPTIONS TARGET_SWITCHES EXTRA_CC_MODES FINALIZE_PIC \ |
| 731 | PREDICATE_CODES SPECIAL_MODE_PREDICATES HOST_PTR_PRINTF |
| 732 | |
| 733 | /* Hooks that are no longer used. */ |
| 734 | #pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE \ |
| 735 | LANG_HOOKS_MARK_TREE LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES \ |
| 736 | LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS \ |
| 737 | LANG_HOOKS_PUSHLEVEL LANG_HOOKS_SET_BLOCK \ |
| 738 | LANG_HOOKS_MAYBE_BUILD_CLEANUP LANG_HOOKS_UPDATE_DECL_AFTER_SAVING \ |
| 739 | LANG_HOOKS_POPLEVEL LANG_HOOKS_TRUTHVALUE_CONVERSION |
| 740 | |
| 741 | /* Libiberty macros that are no longer used in GCC. */ |
| 742 | #undef ANSI_PROTOTYPES |
| 743 | #undef PTR_CONST |
| 744 | #undef LONG_DOUBLE |
| 745 | #undef VPARAMS |
| 746 | #undef VA_OPEN |
| 747 | #undef VA_FIXEDARG |
| 748 | #undef VA_CLOSE |
| 749 | #undef VA_START |
| 750 | #pragma GCC poison ANSI_PROTOTYPES PTR_CONST LONG_DOUBLE VPARAMS VA_OPEN \ |
| 751 | VA_FIXEDARG VA_CLOSE VA_START |
| 752 | #endif /* IN_GCC */ |
| 753 | |
| 754 | /* Note: not all uses of the `index' token (e.g. variable names and |
| 755 | structure members) have been eliminated. */ |
| 756 | #undef bcopy |
| 757 | #undef bzero |
| 758 | #undef bcmp |
| 759 | #undef rindex |
| 760 | #pragma GCC poison bcopy bzero bcmp rindex |
| 761 | |
| 762 | #endif /* GCC >= 3.0 */ |
| 763 | |
| 764 | #endif /* ! GCC_SYSTEM_H */ |