| 1 | /* Get common system includes and various definitions and declarations based |
| 2 | on autoconf macros. |
| 3 | Copyright (C) 1998-2025 Free Software Foundation, Inc. |
| 4 | |
| 5 | This file is part of GCC. |
| 6 | |
| 7 | GCC is free software; you can redistribute it and/or modify it under |
| 8 | the terms of the GNU General Public License as published by the Free |
| 9 | Software Foundation; either version 3, or (at your option) any later |
| 10 | version. |
| 11 | |
| 12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
| 13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 15 | for more details. |
| 16 | |
| 17 | You should have received a copy of the GNU General Public License |
| 18 | along with GCC; see the file COPYING3. If not see |
| 19 | <http://www.gnu.org/licenses/>. */ |
| 20 | |
| 21 | |
| 22 | #ifndef GCC_SYSTEM_H |
| 23 | #define GCC_SYSTEM_H |
| 24 | |
| 25 | /* Define this so that inttypes.h defines the PRI?64 macros even |
| 26 | when compiling with a C++ compiler. Define it here so in the |
| 27 | event inttypes.h gets pulled in by another header it is already |
| 28 | defined. */ |
| 29 | #define __STDC_FORMAT_MACROS |
| 30 | |
| 31 | /* We must include stdarg.h before stdio.h. */ |
| 32 | #include <stdarg.h> |
| 33 | |
| 34 | #ifndef va_copy |
| 35 | # ifdef __va_copy |
| 36 | # define va_copy(d,s) __va_copy (d, s) |
| 37 | # else |
| 38 | # define va_copy(d,s) ((d) = (s)) |
| 39 | # endif |
| 40 | #endif |
| 41 | |
| 42 | #ifdef HAVE_STDDEF_H |
| 43 | # include <stddef.h> |
| 44 | #endif |
| 45 | |
| 46 | #include <stdio.h> |
| 47 | |
| 48 | /* Define a generic NULL if one hasn't already been defined. */ |
| 49 | #ifndef NULL |
| 50 | #define NULL 0 |
| 51 | #endif |
| 52 | |
| 53 | /* Use the unlocked open routines from libiberty. */ |
| 54 | |
| 55 | /* Some of these are #define on some systems, e.g. on AIX to redirect |
| 56 | the names to 64bit capable functions for LARGE_FILES support. These |
| 57 | redefs are pointless here so we can override them. */ |
| 58 | |
| 59 | #undef fopen |
| 60 | #undef freopen |
| 61 | |
| 62 | #define fopen(PATH, MODE) fopen_unlocked (PATH, MODE) |
| 63 | #define fdopen(FILDES, MODE) fdopen_unlocked (FILDES, MODE) |
| 64 | #define freopen(PATH, MODE, STREAM) freopen_unlocked (PATH, MODE, STREAM) |
| 65 | |
| 66 | /* The compiler is not a multi-threaded application and therefore we |
| 67 | do not have to use the locking functions. In fact, using the locking |
| 68 | functions can cause the compiler to be significantly slower under |
| 69 | I/O bound conditions (such as -g -O0 on very large source files). |
| 70 | |
| 71 | HAVE_DECL_PUTC_UNLOCKED actually indicates whether or not the stdio |
| 72 | code is multi-thread safe by default. If it is set to 0, then do |
| 73 | not worry about using the _unlocked functions. |
| 74 | |
| 75 | fputs_unlocked, fwrite_unlocked, and fprintf_unlocked are |
| 76 | extensions and need to be prototyped by hand (since we do not |
| 77 | define _GNU_SOURCE). */ |
| 78 | |
| 79 | #if defined HAVE_DECL_PUTC_UNLOCKED && HAVE_DECL_PUTC_UNLOCKED |
| 80 | |
| 81 | # ifdef HAVE_PUTC_UNLOCKED |
| 82 | # undef putc |
| 83 | # define putc(C, Stream) putc_unlocked (C, Stream) |
| 84 | # endif |
| 85 | # ifdef HAVE_PUTCHAR_UNLOCKED |
| 86 | # undef putchar |
| 87 | # define putchar(C) putchar_unlocked (C) |
| 88 | # endif |
| 89 | # ifdef HAVE_GETC_UNLOCKED |
| 90 | # undef getc |
| 91 | # define getc(Stream) getc_unlocked (Stream) |
| 92 | # endif |
| 93 | # ifdef HAVE_GETCHAR_UNLOCKED |
| 94 | # undef getchar |
| 95 | # define getchar() getchar_unlocked () |
| 96 | # endif |
| 97 | # ifdef HAVE_FPUTC_UNLOCKED |
| 98 | # undef fputc |
| 99 | # define fputc(C, Stream) fputc_unlocked (C, Stream) |
| 100 | # endif |
| 101 | |
| 102 | #ifdef __cplusplus |
| 103 | extern "C" { |
| 104 | #endif |
| 105 | |
| 106 | # ifdef HAVE_CLEARERR_UNLOCKED |
| 107 | # undef clearerr |
| 108 | # define clearerr(Stream) clearerr_unlocked (Stream) |
| 109 | # if defined (HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED |
| 110 | extern void clearerr_unlocked (FILE *); |
| 111 | # endif |
| 112 | # endif |
| 113 | # ifdef HAVE_FEOF_UNLOCKED |
| 114 | # undef feof |
| 115 | # define feof(Stream) feof_unlocked (Stream) |
| 116 | # if defined (HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED |
| 117 | extern int feof_unlocked (FILE *); |
| 118 | # endif |
| 119 | # endif |
| 120 | # ifdef HAVE_FILENO_UNLOCKED |
| 121 | # undef fileno |
| 122 | # define fileno(Stream) fileno_unlocked (Stream) |
| 123 | # if defined (HAVE_DECL_FILENO_UNLOCKED) && !HAVE_DECL_FILENO_UNLOCKED |
| 124 | extern int fileno_unlocked (FILE *); |
| 125 | # endif |
| 126 | # endif |
| 127 | # ifdef HAVE_FFLUSH_UNLOCKED |
| 128 | # undef fflush |
| 129 | # define fflush(Stream) fflush_unlocked (Stream) |
| 130 | # if defined (HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED |
| 131 | extern int fflush_unlocked (FILE *); |
| 132 | # endif |
| 133 | # endif |
| 134 | # ifdef HAVE_FGETC_UNLOCKED |
| 135 | # undef fgetc |
| 136 | # define fgetc(Stream) fgetc_unlocked (Stream) |
| 137 | # if defined (HAVE_DECL_FGETC_UNLOCKED) && !HAVE_DECL_FGETC_UNLOCKED |
| 138 | extern int fgetc_unlocked (FILE *); |
| 139 | # endif |
| 140 | # endif |
| 141 | # ifdef HAVE_FGETS_UNLOCKED |
| 142 | # undef fgets |
| 143 | # define fgets(S, n, Stream) fgets_unlocked (S, n, Stream) |
| 144 | # if defined (HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED |
| 145 | extern char *fgets_unlocked (char *, int, FILE *); |
| 146 | # endif |
| 147 | # endif |
| 148 | # ifdef HAVE_FPUTS_UNLOCKED |
| 149 | # undef fputs |
| 150 | # define fputs(String, Stream) fputs_unlocked (String, Stream) |
| 151 | # if defined (HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED |
| 152 | extern int fputs_unlocked (const char *, FILE *); |
| 153 | # endif |
| 154 | # endif |
| 155 | # ifdef HAVE_FERROR_UNLOCKED |
| 156 | # undef ferror |
| 157 | # define ferror(Stream) ferror_unlocked (Stream) |
| 158 | # if defined (HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED |
| 159 | extern int ferror_unlocked (FILE *); |
| 160 | # endif |
| 161 | # endif |
| 162 | # ifdef HAVE_FREAD_UNLOCKED |
| 163 | # undef fread |
| 164 | # define fread(Ptr, Size, N, Stream) fread_unlocked (Ptr, Size, N, Stream) |
| 165 | # if defined (HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED |
| 166 | extern size_t fread_unlocked (void *, size_t, size_t, FILE *); |
| 167 | # endif |
| 168 | # endif |
| 169 | # ifdef HAVE_FWRITE_UNLOCKED |
| 170 | # undef fwrite |
| 171 | # define fwrite(Ptr, Size, N, Stream) fwrite_unlocked (Ptr, Size, N, Stream) |
| 172 | # if defined (HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED |
| 173 | extern size_t fwrite_unlocked (const void *, size_t, size_t, FILE *); |
| 174 | # endif |
| 175 | # endif |
| 176 | # ifdef HAVE_FPRINTF_UNLOCKED |
| 177 | # undef fprintf |
| 178 | /* We can't use a function-like macro here because we don't know if |
| 179 | we have varargs macros. */ |
| 180 | # define fprintf fprintf_unlocked |
| 181 | # if defined (HAVE_DECL_FPRINTF_UNLOCKED) && !HAVE_DECL_FPRINTF_UNLOCKED |
| 182 | extern int fprintf_unlocked (FILE *, const char *, ...); |
| 183 | # endif |
| 184 | # endif |
| 185 | |
| 186 | #ifdef __cplusplus |
| 187 | } |
| 188 | #endif |
| 189 | |
| 190 | #endif |
| 191 | |
| 192 | /* ??? Glibc's fwrite/fread_unlocked macros cause |
| 193 | "warning: signed and unsigned type in conditional expression". */ |
| 194 | #undef fread_unlocked |
| 195 | #undef fwrite_unlocked |
| 196 | |
| 197 | /* Include C++ standard headers before "safe-ctype.h" to avoid GCC |
| 198 | poisoning the ctype macros through safe-ctype.h */ |
| 199 | |
| 200 | #ifdef __cplusplus |
| 201 | #if defined (INCLUDE_ALGORITHM) || !defined (HAVE_SWAP_IN_UTILITY) |
| 202 | # include <algorithm> |
| 203 | #endif |
| 204 | #ifdef INCLUDE_LIST |
| 205 | # include <list> |
| 206 | #endif |
| 207 | #ifdef INCLUDE_MAP |
| 208 | # include <map> |
| 209 | #endif |
| 210 | #ifdef INCLUDE_SET |
| 211 | # include <set> |
| 212 | #endif |
| 213 | #ifdef INCLUDE_STRING |
| 214 | # include <string> |
| 215 | #endif |
| 216 | #ifdef INCLUDE_VECTOR |
| 217 | # include <vector> |
| 218 | #endif |
| 219 | #ifdef INCLUDE_ARRAY |
| 220 | # include <array> |
| 221 | #endif |
| 222 | #ifdef INCLUDE_FUNCTIONAL |
| 223 | # include <functional> |
| 224 | #endif |
| 225 | #ifdef INCLUDE_SSTREAM |
| 226 | # include <sstream> |
| 227 | #endif |
| 228 | # include <memory> |
| 229 | # include <cstring> |
| 230 | # include <initializer_list> |
| 231 | # include <new> |
| 232 | # include <utility> |
| 233 | # include <type_traits> |
| 234 | #endif |
| 235 | |
| 236 | /* There are an extraordinary number of issues with <ctype.h>. |
| 237 | The last straw is that it varies with the locale. Use libiberty's |
| 238 | replacement instead. */ |
| 239 | #include "safe-ctype.h" |
| 240 | |
| 241 | #include <sys/types.h> |
| 242 | |
| 243 | #include <errno.h> |
| 244 | |
| 245 | #if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO |
| 246 | extern int errno; |
| 247 | #endif |
| 248 | |
| 249 | /* Some of glibc's string inlines cause warnings. Plus we'd rather |
| 250 | rely on (and therefore test) GCC's string builtins. */ |
| 251 | #define __NO_STRING_INLINES |
| 252 | |
| 253 | #ifdef STRING_WITH_STRINGS |
| 254 | # include <string.h> |
| 255 | # include <strings.h> |
| 256 | #else |
| 257 | # ifdef HAVE_STRING_H |
| 258 | # include <string.h> |
| 259 | # else |
| 260 | # ifdef HAVE_STRINGS_H |
| 261 | # include <strings.h> |
| 262 | # endif |
| 263 | # endif |
| 264 | #endif |
| 265 | |
| 266 | #ifdef HAVE_STDLIB_H |
| 267 | # include <stdlib.h> |
| 268 | #endif |
| 269 | |
| 270 | /* When compiling C++ we need to include <cstdlib> as well as <stdlib.h> so |
| 271 | that it is processed before we poison "malloc"; otherwise, if a source |
| 272 | file uses a standard library header that includes <cstdlib>, we will get |
| 273 | an error about 'using std::malloc'. */ |
| 274 | #ifdef __cplusplus |
| 275 | #include <cstdlib> |
| 276 | #endif |
| 277 | |
| 278 | /* Undef vec_free from AIX stdlib.h header which conflicts with vec.h. */ |
| 279 | #undef vec_free |
| 280 | |
| 281 | /* If we don't have an overriding definition, set SUCCESS_EXIT_CODE and |
| 282 | FATAL_EXIT_CODE to EXIT_SUCCESS and EXIT_FAILURE respectively, |
| 283 | or 0 and 1 if those macros are not defined. */ |
| 284 | #ifndef SUCCESS_EXIT_CODE |
| 285 | # ifdef EXIT_SUCCESS |
| 286 | # define SUCCESS_EXIT_CODE EXIT_SUCCESS |
| 287 | # else |
| 288 | # define SUCCESS_EXIT_CODE 0 |
| 289 | # endif |
| 290 | #endif |
| 291 | |
| 292 | #ifndef FATAL_EXIT_CODE |
| 293 | # ifdef EXIT_FAILURE |
| 294 | # define FATAL_EXIT_CODE EXIT_FAILURE |
| 295 | # else |
| 296 | # define FATAL_EXIT_CODE 1 |
| 297 | # endif |
| 298 | #endif |
| 299 | |
| 300 | #define ICE_EXIT_CODE 4 |
| 301 | |
| 302 | #ifdef HAVE_UNISTD_H |
| 303 | # include <unistd.h> |
| 304 | #endif |
| 305 | |
| 306 | #ifdef HAVE_SYS_PARAM_H |
| 307 | # include <sys/param.h> |
| 308 | /* We use these identifiers later and they appear in some vendor param.h's. */ |
| 309 | # undef PREFETCH |
| 310 | # undef m_slot |
| 311 | #endif |
| 312 | |
| 313 | #if HAVE_LIMITS_H |
| 314 | # include <limits.h> |
| 315 | #endif |
| 316 | |
| 317 | /* A macro to determine whether a VALUE lies inclusively within a |
| 318 | certain range without evaluating the VALUE more than once. This |
| 319 | macro won't warn if the VALUE is unsigned and the LOWER bound is |
| 320 | zero, as it would e.g. with "VALUE >= 0 && ...". Note the LOWER |
| 321 | bound *is* evaluated twice, and LOWER must not be greater than |
| 322 | UPPER. However the bounds themselves can be either positive or |
| 323 | negative. */ |
| 324 | #define IN_RANGE(VALUE, LOWER, UPPER) \ |
| 325 | ((unsigned HOST_WIDE_INT) (VALUE) - (unsigned HOST_WIDE_INT) (LOWER) \ |
| 326 | <= (unsigned HOST_WIDE_INT) (UPPER) - (unsigned HOST_WIDE_INT) (LOWER)) |
| 327 | |
| 328 | /* Infrastructure for defining missing _MAX and _MIN macros. Note that |
| 329 | macros defined with these cannot be used in #if. */ |
| 330 | |
| 331 | /* The extra casts work around common compiler bugs. */ |
| 332 | #define INTTYPE_SIGNED(t) (! ((t) 0 < (t) -1)) |
| 333 | /* The outer cast is needed to work around a bug in Cray C 5.0.3.0. |
| 334 | It is necessary at least when t == time_t. */ |
| 335 | #define INTTYPE_MINIMUM(t) ((t) (INTTYPE_SIGNED (t) \ |
| 336 | ? (t) 1 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) |
| 337 | #define INTTYPE_MAXIMUM(t) ((t) (~ (t) 0 - INTTYPE_MINIMUM (t))) |
| 338 | |
| 339 | /* Use that infrastructure to provide a few constants. */ |
| 340 | #ifndef UCHAR_MAX |
| 341 | # define UCHAR_MAX INTTYPE_MAXIMUM (unsigned char) |
| 342 | #endif |
| 343 | |
| 344 | #ifdef TIME_WITH_SYS_TIME |
| 345 | # include <sys/time.h> |
| 346 | # include <time.h> |
| 347 | #else |
| 348 | # if HAVE_SYS_TIME_H |
| 349 | # include <sys/time.h> |
| 350 | # else |
| 351 | # ifdef HAVE_TIME_H |
| 352 | # include <time.h> |
| 353 | # endif |
| 354 | # endif |
| 355 | #endif |
| 356 | |
| 357 | #ifdef HAVE_FCNTL_H |
| 358 | # include <fcntl.h> |
| 359 | #else |
| 360 | # ifdef HAVE_SYS_FILE_H |
| 361 | # include <sys/file.h> |
| 362 | # endif |
| 363 | #endif |
| 364 | |
| 365 | #ifdef HAVE_SYS_LOCKING_H |
| 366 | # include <sys/locking.h> |
| 367 | #endif |
| 368 | |
| 369 | #ifndef SEEK_SET |
| 370 | # define SEEK_SET 0 |
| 371 | # define SEEK_CUR 1 |
| 372 | # define SEEK_END 2 |
| 373 | #endif |
| 374 | #ifndef F_OK |
| 375 | # define F_OK 0 |
| 376 | # define X_OK 1 |
| 377 | # define W_OK 2 |
| 378 | # define R_OK 4 |
| 379 | #endif |
| 380 | #ifndef O_RDONLY |
| 381 | # define O_RDONLY 0 |
| 382 | #endif |
| 383 | #ifndef O_WRONLY |
| 384 | # define O_WRONLY 1 |
| 385 | #endif |
| 386 | #ifndef O_BINARY |
| 387 | # define O_BINARY 0 |
| 388 | #endif |
| 389 | |
| 390 | /* Some systems define these in, e.g., param.h. We undefine these names |
| 391 | here to avoid the warnings. We prefer to use our definitions since we |
| 392 | know they are correct. */ |
| 393 | |
| 394 | #undef MIN |
| 395 | #undef MAX |
| 396 | #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) |
| 397 | #define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) |
| 398 | |
| 399 | /* Returns the least number N such that N * Y >= X. */ |
| 400 | #define CEIL(x,y) (((x) + (y) - 1) / (y)) |
| 401 | |
| 402 | /* This macro rounds x up to the y boundary. */ |
| 403 | #define ROUND_UP(x,y) (((x) + (y) - 1) & ~((y) - 1)) |
| 404 | |
| 405 | /* This macro rounds x down to the y boundary. */ |
| 406 | #define ROUND_DOWN(x,y) ((x) & ~((y) - 1)) |
| 407 | |
| 408 | #ifdef HAVE_SYS_WAIT_H |
| 409 | #include <sys/wait.h> |
| 410 | #endif |
| 411 | |
| 412 | #ifndef WIFSIGNALED |
| 413 | #define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f) |
| 414 | #endif |
| 415 | #ifndef WTERMSIG |
| 416 | #define WTERMSIG(S) ((S) & 0x7f) |
| 417 | #endif |
| 418 | #ifndef WIFEXITED |
| 419 | #define WIFEXITED(S) (((S) & 0xff) == 0) |
| 420 | #endif |
| 421 | #ifndef WEXITSTATUS |
| 422 | #define WEXITSTATUS(S) (((S) & 0xff00) >> 8) |
| 423 | #endif |
| 424 | #ifndef WSTOPSIG |
| 425 | #define WSTOPSIG WEXITSTATUS |
| 426 | #endif |
| 427 | #ifndef WCOREDUMP |
| 428 | #define WCOREDUMP(S) ((S) & WCOREFLG) |
| 429 | #endif |
| 430 | #ifndef WCOREFLG |
| 431 | #define WCOREFLG 0200 |
| 432 | #endif |
| 433 | |
| 434 | #include <signal.h> |
| 435 | #if !defined (SIGCHLD) && defined (SIGCLD) |
| 436 | # define SIGCHLD SIGCLD |
| 437 | #endif |
| 438 | |
| 439 | #ifdef HAVE_SYS_MMAN_H |
| 440 | # include <sys/mman.h> |
| 441 | #endif |
| 442 | |
| 443 | #ifndef MAP_FAILED |
| 444 | # define MAP_FAILED ((void *)-1) |
| 445 | #endif |
| 446 | |
| 447 | #if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) |
| 448 | # define MAP_ANONYMOUS MAP_ANON |
| 449 | #endif |
| 450 | |
| 451 | #ifdef HAVE_SYS_RESOURCE_H |
| 452 | # include <sys/resource.h> |
| 453 | #endif |
| 454 | |
| 455 | #ifdef HAVE_SYS_TIMES_H |
| 456 | # include <sys/times.h> |
| 457 | #endif |
| 458 | |
| 459 | /* The HAVE_DECL_* macros are three-state, undefined, 0 or 1. If they |
| 460 | are defined to 0 then we must provide the relevant declaration |
| 461 | here. These checks will be in the undefined state while configure |
| 462 | is running so be careful to test "defined (HAVE_DECL_*)". */ |
| 463 | |
| 464 | #ifdef __cplusplus |
| 465 | extern "C" { |
| 466 | #endif |
| 467 | |
| 468 | #if defined (HAVE_DECL_ATOF) && !HAVE_DECL_ATOF |
| 469 | extern double atof (const char *); |
| 470 | #endif |
| 471 | |
| 472 | #if defined (HAVE_DECL_ATOL) && !HAVE_DECL_ATOL |
| 473 | extern long atol (const char *); |
| 474 | #endif |
| 475 | |
| 476 | #if defined (HAVE_DECL_FREE) && !HAVE_DECL_FREE |
| 477 | extern void free (void *); |
| 478 | #endif |
| 479 | |
| 480 | #if defined (HAVE_DECL_GETCWD) && !HAVE_DECL_GETCWD |
| 481 | extern char *getcwd (char *, size_t); |
| 482 | #endif |
| 483 | |
| 484 | #if defined (HAVE_DECL_GETENV) && !HAVE_DECL_GETENV |
| 485 | extern char *getenv (const char *); |
| 486 | #endif |
| 487 | |
| 488 | #if defined (HAVE_DECL_GETOPT) && !HAVE_DECL_GETOPT |
| 489 | extern int getopt (int, char * const *, const char *); |
| 490 | #endif |
| 491 | |
| 492 | #if defined (HAVE_DECL_GETPAGESIZE) && !HAVE_DECL_GETPAGESIZE |
| 493 | extern int getpagesize (void); |
| 494 | #endif |
| 495 | |
| 496 | #if defined (HAVE_DECL_GETWD) && !HAVE_DECL_GETWD |
| 497 | extern char *getwd (char *); |
| 498 | #endif |
| 499 | |
| 500 | #if defined (HAVE_DECL_SBRK) && !HAVE_DECL_SBRK |
| 501 | extern void *sbrk (int); |
| 502 | #endif |
| 503 | |
| 504 | #if defined (HAVE_DECL_SETENV) && !HAVE_DECL_SETENV |
| 505 | int setenv(const char *, const char *, int); |
| 506 | #endif |
| 507 | |
| 508 | #if defined (HAVE_DECL_STRSTR) && !HAVE_DECL_STRSTR |
| 509 | extern char *strstr (const char *, const char *); |
| 510 | #endif |
| 511 | |
| 512 | #if defined (HAVE_DECL_STPCPY) && !HAVE_DECL_STPCPY |
| 513 | extern char *stpcpy (char *, const char *); |
| 514 | #endif |
| 515 | |
| 516 | #if defined (HAVE_DECL_UNSETENV) && !HAVE_DECL_UNSETENV |
| 517 | int unsetenv(const char *); |
| 518 | #endif |
| 519 | |
| 520 | #if defined (HAVE_DECL_MALLOC) && !HAVE_DECL_MALLOC |
| 521 | extern void *malloc (size_t); |
| 522 | #endif |
| 523 | |
| 524 | #if defined (HAVE_DECL_CALLOC) && !HAVE_DECL_CALLOC |
| 525 | extern void *calloc (size_t, size_t); |
| 526 | #endif |
| 527 | |
| 528 | #if defined (HAVE_DECL_REALLOC) && !HAVE_DECL_REALLOC |
| 529 | extern void *realloc (void *, size_t); |
| 530 | #endif |
| 531 | |
| 532 | #ifdef __cplusplus |
| 533 | } |
| 534 | #endif |
| 535 | |
| 536 | #ifdef HAVE_STDINT_H |
| 537 | #include <stdint.h> |
| 538 | #endif |
| 539 | |
| 540 | #ifdef HAVE_INTTYPES_H |
| 541 | #include <inttypes.h> |
| 542 | #endif |
| 543 | |
| 544 | #ifndef SIZE_MAX |
| 545 | # define SIZE_MAX INTTYPE_MAXIMUM (size_t) |
| 546 | #endif |
| 547 | |
| 548 | #ifdef __cplusplus |
| 549 | extern "C" { |
| 550 | #endif |
| 551 | |
| 552 | /* If the system doesn't provide strsignal, we get it defined in |
| 553 | libiberty but no declaration is supplied. */ |
| 554 | #if !defined (HAVE_STRSIGNAL) \ |
| 555 | || (defined (HAVE_DECL_STRSIGNAL) && !HAVE_DECL_STRSIGNAL) |
| 556 | # ifndef strsignal |
| 557 | extern const char *strsignal (int); |
| 558 | # endif |
| 559 | #endif |
| 560 | |
| 561 | #ifdef HAVE_GETRLIMIT |
| 562 | # if defined (HAVE_DECL_GETRLIMIT) && !HAVE_DECL_GETRLIMIT |
| 563 | # ifndef getrlimit |
| 564 | struct rlimit; |
| 565 | extern int getrlimit (int, struct rlimit *); |
| 566 | # endif |
| 567 | # endif |
| 568 | #endif |
| 569 | |
| 570 | #ifdef HAVE_SETRLIMIT |
| 571 | # if defined (HAVE_DECL_SETRLIMIT) && !HAVE_DECL_SETRLIMIT |
| 572 | # ifndef setrlimit |
| 573 | struct rlimit; |
| 574 | extern int setrlimit (int, const struct rlimit *); |
| 575 | # endif |
| 576 | # endif |
| 577 | #endif |
| 578 | |
| 579 | #if defined (HAVE_DECL_ABORT) && !HAVE_DECL_ABORT |
| 580 | extern void abort (void); |
| 581 | #endif |
| 582 | |
| 583 | #if defined (HAVE_DECL_SNPRINTF) && !HAVE_DECL_SNPRINTF |
| 584 | extern int snprintf (char *, size_t, const char *, ...); |
| 585 | #endif |
| 586 | |
| 587 | #if defined (HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF |
| 588 | extern int vsnprintf (char *, size_t, const char *, va_list); |
| 589 | #endif |
| 590 | |
| 591 | #ifdef __cplusplus |
| 592 | } |
| 593 | #endif |
| 594 | |
| 595 | /* 1 if we have C99 designated initializers. */ |
| 596 | #if !defined(HAVE_DESIGNATED_INITIALIZERS) |
| 597 | #ifdef __cplusplus |
| 598 | #define HAVE_DESIGNATED_INITIALIZERS 0 |
| 599 | #else |
| 600 | #define HAVE_DESIGNATED_INITIALIZERS \ |
| 601 | ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) |
| 602 | #endif |
| 603 | #endif |
| 604 | |
| 605 | #if !defined(HAVE_DESIGNATED_UNION_INITIALIZERS) |
| 606 | #ifdef __cplusplus |
| 607 | #define HAVE_DESIGNATED_UNION_INITIALIZERS (GCC_VERSION >= 4007) |
| 608 | #else |
| 609 | #define HAVE_DESIGNATED_UNION_INITIALIZERS \ |
| 610 | ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) |
| 611 | #endif |
| 612 | #endif |
| 613 | |
| 614 | #if HAVE_SYS_STAT_H |
| 615 | # include <sys/stat.h> |
| 616 | #endif |
| 617 | |
| 618 | /* Test if something is a normal file. */ |
| 619 | #ifndef S_ISREG |
| 620 | #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) |
| 621 | #endif |
| 622 | |
| 623 | /* Test if something is a directory. */ |
| 624 | #ifndef S_ISDIR |
| 625 | #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) |
| 626 | #endif |
| 627 | |
| 628 | /* Test if something is a character special file. */ |
| 629 | #ifndef S_ISCHR |
| 630 | #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) |
| 631 | #endif |
| 632 | |
| 633 | /* Test if something is a block special file. */ |
| 634 | #ifndef S_ISBLK |
| 635 | #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) |
| 636 | #endif |
| 637 | |
| 638 | /* Test if something is a socket. */ |
| 639 | #ifndef S_ISSOCK |
| 640 | # ifdef S_IFSOCK |
| 641 | # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) |
| 642 | # else |
| 643 | # define S_ISSOCK(m) 0 |
| 644 | # endif |
| 645 | #endif |
| 646 | |
| 647 | /* Test if something is a FIFO. */ |
| 648 | #ifndef S_ISFIFO |
| 649 | # ifdef S_IFIFO |
| 650 | # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) |
| 651 | # else |
| 652 | # define S_ISFIFO(m) 0 |
| 653 | # endif |
| 654 | #endif |
| 655 | |
| 656 | /* Define well known filenos if the system does not define them. */ |
| 657 | #ifndef STDIN_FILENO |
| 658 | # define STDIN_FILENO 0 |
| 659 | #endif |
| 660 | #ifndef STDOUT_FILENO |
| 661 | # define STDOUT_FILENO 1 |
| 662 | #endif |
| 663 | #ifndef STDERR_FILENO |
| 664 | # define STDERR_FILENO 2 |
| 665 | #endif |
| 666 | |
| 667 | /* Some systems have mkdir that takes a single argument. */ |
| 668 | #ifdef MKDIR_TAKES_ONE_ARG |
| 669 | # define mkdir(a,b) mkdir (a) |
| 670 | #endif |
| 671 | |
| 672 | #ifndef HAVE_KILL |
| 673 | # define kill(p,s) raise (s) |
| 674 | #endif |
| 675 | |
| 676 | /* Provide a way to print an address via printf. */ |
| 677 | #ifndef HOST_PTR_PRINTF |
| 678 | #define HOST_PTR_PRINTF "%p" |
| 679 | #endif /* ! HOST_PTR_PRINTF */ |
| 680 | |
| 681 | /* By default, colon separates directories in a path. */ |
| 682 | #ifndef PATH_SEPARATOR |
| 683 | #define PATH_SEPARATOR ':' |
| 684 | #endif |
| 685 | |
| 686 | /* Filename handling macros. */ |
| 687 | #include "filenames.h" |
| 688 | |
| 689 | /* These should be phased out in favor of IS_DIR_SEPARATOR, where possible. */ |
| 690 | #ifndef DIR_SEPARATOR |
| 691 | # define DIR_SEPARATOR '/' |
| 692 | # ifdef HAVE_DOS_BASED_FILE_SYSTEM |
| 693 | # define DIR_SEPARATOR_2 '\\' |
| 694 | # endif |
| 695 | #endif |
| 696 | |
| 697 | #if defined (INCLUDE_DLFCN_H) && defined (HAVE_DLFCN_H) |
| 698 | /* If plugin support is enabled, we could use libdl. */ |
| 699 | #include <dlfcn.h> |
| 700 | #endif |
| 701 | |
| 702 | /* Do not introduce a gmp.h dependency on the build system. */ |
| 703 | #ifndef GENERATOR_FILE |
| 704 | #include <gmp.h> |
| 705 | |
| 706 | class auto_mpz |
| 707 | { |
| 708 | public: |
| 709 | auto_mpz () { mpz_init (m_mpz); } |
| 710 | ~auto_mpz () { mpz_clear (m_mpz); } |
| 711 | |
| 712 | operator mpz_t& () { return m_mpz; } |
| 713 | mpz_ptr operator-> () { return m_mpz; } |
| 714 | |
| 715 | auto_mpz (const auto_mpz &) = delete; |
| 716 | auto_mpz &operator= (const auto_mpz &) = delete; |
| 717 | |
| 718 | #if GCC_VERSION < 4008 || GCC_VERSION >= 5000 |
| 719 | /* GCC 4.8 and 4.9 don't support this, only fixed in PR62101 for 5.0. */ |
| 720 | friend void mpz_clear (auto_mpz&) = delete; |
| 721 | friend void mpz_init (auto_mpz&) = delete; |
| 722 | #endif |
| 723 | |
| 724 | private: |
| 725 | mpz_t m_mpz; |
| 726 | }; |
| 727 | #endif |
| 728 | |
| 729 | /* Get libiberty declarations. */ |
| 730 | #include "libiberty.h" |
| 731 | |
| 732 | #undef FFS /* Some systems predefine this symbol; don't let it interfere. */ |
| 733 | #undef FLOAT /* Likewise. */ |
| 734 | #undef ABS /* Likewise. */ |
| 735 | #undef PC /* Likewise. */ |
| 736 | |
| 737 | /* Provide a default for the HOST_BIT_BUCKET. |
| 738 | This suffices for POSIX-like hosts. */ |
| 739 | |
| 740 | #ifndef HOST_BIT_BUCKET |
| 741 | #define HOST_BIT_BUCKET "/dev/null" |
| 742 | #endif |
| 743 | |
| 744 | #ifndef offsetof |
| 745 | #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) |
| 746 | #endif |
| 747 | |
| 748 | /* Various error reporting routines want to use __FUNCTION__. */ |
| 749 | #if (GCC_VERSION < 2007) |
| 750 | #ifndef __FUNCTION__ |
| 751 | #define __FUNCTION__ "?" |
| 752 | #endif /* ! __FUNCTION__ */ |
| 753 | #endif |
| 754 | |
| 755 | /* __builtin_expect(A, B) evaluates to A, but notifies the compiler that |
| 756 | the most likely value of A is B. This feature was added at some point |
| 757 | between 2.95 and 3.0. Let's use 3.0 as the lower bound for now. */ |
| 758 | #if (GCC_VERSION < 3000) |
| 759 | #define __builtin_expect(a, b) (a) |
| 760 | #endif |
| 761 | |
| 762 | #define LIKELY(x) (__builtin_expect ((x), 1)) |
| 763 | #define UNLIKELY(x) (__builtin_expect ((x), 0)) |
| 764 | |
| 765 | |
| 766 | #ifdef INCLUDE_MUTEX |
| 767 | # include <mutex> |
| 768 | #endif |
| 769 | |
| 770 | #ifdef INCLUDE_MALLOC_H |
| 771 | #if defined(HAVE_MALLINFO) || defined(HAVE_MALLINFO2) |
| 772 | #include <malloc.h> |
| 773 | #endif |
| 774 | #endif |
| 775 | |
| 776 | #ifdef INCLUDE_ISL |
| 777 | #ifdef HAVE_isl |
| 778 | #include <isl/options.h> |
| 779 | #include <isl/ctx.h> |
| 780 | #include <isl/val.h> |
| 781 | #include <isl/set.h> |
| 782 | #include <isl/union_set.h> |
| 783 | #include <isl/map.h> |
| 784 | #include <isl/union_map.h> |
| 785 | #include <isl/aff.h> |
| 786 | #include <isl/constraint.h> |
| 787 | #include <isl/flow.h> |
| 788 | #include <isl/ilp.h> |
| 789 | #include <isl/schedule.h> |
| 790 | #include <isl/ast_build.h> |
| 791 | #include <isl/schedule_node.h> |
| 792 | #include <isl/id.h> |
| 793 | #include <isl/space.h> |
| 794 | #endif |
| 795 | #endif |
| 796 | |
| 797 | /* Redefine 'abort' to report an internal error w/o coredump, and |
| 798 | reporting the location of the error in the source file. |
| 799 | Instead of directly calling 'abort' or 'fancy_abort', GCC code |
| 800 | should normally call 'internal_error' with a specific message. */ |
| 801 | extern void fancy_abort (const char *, int, const char *) |
| 802 | ATTRIBUTE_NORETURN ATTRIBUTE_COLD; |
| 803 | #define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__) |
| 804 | |
| 805 | /* Use gcc_assert(EXPR) to test invariants. */ |
| 806 | #if ENABLE_ASSERT_CHECKING |
| 807 | #define gcc_assert(EXPR) \ |
| 808 | ((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0)) |
| 809 | #elif (GCC_VERSION >= 4005) |
| 810 | #define gcc_assert(EXPR) \ |
| 811 | ((void)(UNLIKELY (!(EXPR)) ? __builtin_unreachable (), 0 : 0)) |
| 812 | #else |
| 813 | /* Include EXPR, so that unused variable warnings do not occur. */ |
| 814 | #define gcc_assert(EXPR) ((void)(0 && (EXPR))) |
| 815 | #endif |
| 816 | |
| 817 | #if CHECKING_P |
| 818 | #define gcc_checking_assert(EXPR) gcc_assert (EXPR) |
| 819 | #else |
| 820 | /* N.B.: in release build EXPR is not evaluated. */ |
| 821 | #define gcc_checking_assert(EXPR) ((void)(0 && (EXPR))) |
| 822 | #endif |
| 823 | |
| 824 | #if GCC_VERSION >= 4000 |
| 825 | #define ALWAYS_INLINE inline __attribute__ ((always_inline)) |
| 826 | #else |
| 827 | #define ALWAYS_INLINE inline |
| 828 | #endif |
| 829 | |
| 830 | #if GCC_VERSION >= 3004 |
| 831 | #define WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) |
| 832 | #else |
| 833 | #define WARN_UNUSED_RESULT |
| 834 | #endif |
| 835 | |
| 836 | /* Use gcc_unreachable() to mark unreachable locations (like an |
| 837 | unreachable default case of a switch. Do not use gcc_assert(0). */ |
| 838 | #if (GCC_VERSION >= 4005) && !ENABLE_ASSERT_CHECKING |
| 839 | #define gcc_unreachable() __builtin_unreachable () |
| 840 | #else |
| 841 | #define gcc_unreachable() (fancy_abort (__FILE__, __LINE__, __FUNCTION__)) |
| 842 | #endif |
| 843 | |
| 844 | #if GCC_VERSION >= 7000 && defined(__has_attribute) |
| 845 | # if __has_attribute(fallthrough) |
| 846 | # define gcc_fallthrough() __attribute__((fallthrough)) |
| 847 | # else |
| 848 | # define gcc_fallthrough() |
| 849 | # endif |
| 850 | #else |
| 851 | # define gcc_fallthrough() |
| 852 | #endif |
| 853 | |
| 854 | #if GCC_VERSION >= 3001 |
| 855 | #define STATIC_CONSTANT_P(X) (__builtin_constant_p (X) && (X)) |
| 856 | #else |
| 857 | #define STATIC_CONSTANT_P(X) (false && (X)) |
| 858 | #endif |
| 859 | |
| 860 | #ifdef __cplusplus |
| 861 | #define STATIC_ASSERT(X) \ |
| 862 | static_assert ((X), #X) |
| 863 | #else |
| 864 | #define STATIC_ASSERT(X) \ |
| 865 | typedef int assertion1[(X) ? 1 : -1] ATTRIBUTE_UNUSED |
| 866 | #endif |
| 867 | |
| 868 | /* Provide a fake boolean type. We make no attempt to use the |
| 869 | C99 _Bool, as it may not be available in the bootstrap compiler, |
| 870 | and even if it is, it is liable to be buggy. |
| 871 | This must be after all inclusion of system headers, as some of |
| 872 | them will mess us up. */ |
| 873 | |
| 874 | #undef TRUE |
| 875 | #undef FALSE |
| 876 | |
| 877 | #ifdef __cplusplus |
| 878 | /* Obsolete. */ |
| 879 | # define TRUE true |
| 880 | # define FALSE false |
| 881 | #else /* !__cplusplus */ |
| 882 | # undef bool |
| 883 | # undef true |
| 884 | # undef false |
| 885 | |
| 886 | # define bool unsigned char |
| 887 | # define true 1 |
| 888 | # define false 0 |
| 889 | |
| 890 | /* Obsolete. */ |
| 891 | # define TRUE true |
| 892 | # define FALSE false |
| 893 | #endif /* !__cplusplus */ |
| 894 | |
| 895 | /* Some compilers do not allow the use of unsigned char in bitfields. */ |
| 896 | #define BOOL_BITFIELD unsigned int |
| 897 | |
| 898 | /* As the last action in this file, we poison the identifiers that |
| 899 | shouldn't be used. Note, luckily gcc-3.0's token-based integrated |
| 900 | preprocessor won't trip on poisoned identifiers that arrive from |
| 901 | the expansion of macros. E.g. #define strrchr rindex, won't error |
| 902 | if rindex is poisoned after this directive is issued and later on |
| 903 | strrchr is called. |
| 904 | |
| 905 | Note: We define bypass macros for the few cases where we really |
| 906 | want to use the libc memory allocation routines. Otherwise we |
| 907 | insist you use the "x" versions from libiberty. */ |
| 908 | |
| 909 | #define really_call_malloc malloc |
| 910 | #define really_call_calloc calloc |
| 911 | #define really_call_realloc realloc |
| 912 | |
| 913 | #if defined(FLEX_SCANNER) || defined(YYBISON) || defined(YYBYACC) |
| 914 | /* Flex and bison use malloc and realloc. Yuk. Note that this means |
| 915 | really_call_* cannot be used in a .l or .y file. */ |
| 916 | #define malloc xmalloc |
| 917 | #define realloc xrealloc |
| 918 | #endif |
| 919 | |
| 920 | #if (GCC_VERSION >= 3000) |
| 921 | |
| 922 | /* Note autoconf checks for prototype declarations and includes |
| 923 | system.h while doing so. Only poison these tokens if actually |
| 924 | compiling gcc, so that the autoconf declaration tests for malloc |
| 925 | etc don't spuriously fail. */ |
| 926 | #ifdef IN_GCC |
| 927 | |
| 928 | #undef calloc |
| 929 | #undef strdup |
| 930 | #undef strndup |
| 931 | #pragma GCC poison calloc strdup strndup |
| 932 | |
| 933 | #if !defined(FLEX_SCANNER) && !defined(YYBISON) |
| 934 | #undef malloc |
| 935 | #undef realloc |
| 936 | #pragma GCC poison malloc realloc |
| 937 | #endif |
| 938 | |
| 939 | /* The %m format should be used when GCC's main diagnostic functions |
| 940 | supporting %m are available, and xstrerror from libiberty |
| 941 | otherwise. */ |
| 942 | #undef strerror |
| 943 | #pragma GCC poison strerror |
| 944 | |
| 945 | /* loc_t is defined on some systems and too inviting for some |
| 946 | programmers to avoid. */ |
| 947 | #undef loc_t |
| 948 | #pragma GCC poison loc_t |
| 949 | |
| 950 | /* Old target macros that have moved to the target hooks structure. */ |
| 951 | #pragma GCC poison ASM_OPEN_PAREN ASM_CLOSE_PAREN \ |
| 952 | FUNCTION_PROLOGUE FUNCTION_EPILOGUE \ |
| 953 | FUNCTION_END_PROLOGUE FUNCTION_BEGIN_EPILOGUE \ |
| 954 | DECL_MACHINE_ATTRIBUTES COMP_TYPE_ATTRIBUTES INSERT_ATTRIBUTES \ |
| 955 | VALID_MACHINE_DECL_ATTRIBUTE VALID_MACHINE_TYPE_ATTRIBUTE \ |
| 956 | SET_DEFAULT_TYPE_ATTRIBUTES SET_DEFAULT_DECL_ATTRIBUTES \ |
| 957 | MERGE_MACHINE_TYPE_ATTRIBUTES MERGE_MACHINE_DECL_ATTRIBUTES \ |
| 958 | MD_INIT_BUILTINS MD_EXPAND_BUILTIN ASM_OUTPUT_CONSTRUCTOR \ |
| 959 | ASM_OUTPUT_DESTRUCTOR SIGNED_CHAR_SPEC MAX_CHAR_TYPE_SIZE \ |
| 960 | WCHAR_UNSIGNED UNIQUE_SECTION SELECT_SECTION SELECT_RTX_SECTION \ |
| 961 | ENCODE_SECTION_INFO STRIP_NAME_ENCODING ASM_GLOBALIZE_LABEL \ |
| 962 | ASM_OUTPUT_MI_THUNK CONST_COSTS RTX_COSTS DEFAULT_RTX_COSTS \ |
| 963 | ADDRESS_COST MACHINE_DEPENDENT_REORG ASM_FILE_START ASM_FILE_END \ |
| 964 | ASM_SIMPLIFY_DWARF_ADDR INIT_TARGET_OPTABS INIT_SUBTARGET_OPTABS \ |
| 965 | INIT_GOFAST_OPTABS MULSI3_LIBCALL MULDI3_LIBCALL DIVSI3_LIBCALL \ |
| 966 | DIVDI3_LIBCALL UDIVSI3_LIBCALL UDIVDI3_LIBCALL MODSI3_LIBCALL \ |
| 967 | MODDI3_LIBCALL UMODSI3_LIBCALL UMODDI3_LIBCALL BUILD_VA_LIST_TYPE \ |
| 968 | PRETEND_OUTGOING_VARARGS_NAMED STRUCT_VALUE_INCOMING_REGNUM \ |
| 969 | ASM_OUTPUT_SECTION_NAME PROMOTE_FUNCTION_ARGS PROMOTE_FUNCTION_MODE \ |
| 970 | STRUCT_VALUE_INCOMING STRICT_ARGUMENT_NAMING \ |
| 971 | PROMOTE_FUNCTION_RETURN PROMOTE_PROTOTYPES STRUCT_VALUE_REGNUM \ |
| 972 | SETUP_INCOMING_VARARGS EXPAND_BUILTIN_SAVEREGS \ |
| 973 | DEFAULT_SHORT_ENUMS SPLIT_COMPLEX_ARGS MD_ASM_CLOBBERS \ |
| 974 | HANDLE_PRAGMA_REDEFINE_EXTNAME HANDLE_PRAGMA_EXTERN_PREFIX \ |
| 975 | MUST_PASS_IN_STACK FUNCTION_ARG_PASS_BY_REFERENCE \ |
| 976 | VECTOR_MODE_SUPPORTED_P TARGET_SUPPORTS_HIDDEN \ |
| 977 | FUNCTION_ARG_PARTIAL_NREGS ASM_OUTPUT_DWARF_DTPREL \ |
| 978 | ALLOCATE_INITIAL_VALUE LEGITIMIZE_ADDRESS FRAME_POINTER_REQUIRED \ |
| 979 | CAN_ELIMINATE TRAMPOLINE_TEMPLATE INITIALIZE_TRAMPOLINE \ |
| 980 | TRAMPOLINE_ADJUST_ADDRESS STATIC_CHAIN STATIC_CHAIN_INCOMING \ |
| 981 | RETURN_POPS_ARGS UNITS_PER_SIMD_WORD OVERRIDE_OPTIONS \ |
| 982 | OPTIMIZATION_OPTIONS CLASS_LIKELY_SPILLED_P \ |
| 983 | USING_SJLJ_EXCEPTIONS TARGET_UNWIND_INFO \ |
| 984 | CAN_DEBUG_WITHOUT_FP UNLIKELY_EXECUTED_TEXT_SECTION_NAME \ |
| 985 | HOT_TEXT_SECTION_NAME LEGITIMATE_CONSTANT_P ALWAYS_STRIP_DOTDOT \ |
| 986 | OUTPUT_ADDR_CONST_EXTRA SMALL_REGISTER_CLASSES ASM_OUTPUT_IDENT \ |
| 987 | ASM_BYTE_OP MEMBER_TYPE_FORCES_BLK LIBGCC2_HAS_SF_MODE \ |
| 988 | LIBGCC2_HAS_DF_MODE LIBGCC2_HAS_XF_MODE LIBGCC2_HAS_TF_MODE \ |
| 989 | CLEAR_BY_PIECES_P MOVE_BY_PIECES_P SET_BY_PIECES_P \ |
| 990 | STORE_BY_PIECES_P TARGET_FLT_EVAL_METHOD \ |
| 991 | HARD_REGNO_CALL_PART_CLOBBERED HARD_REGNO_MODE_OK \ |
| 992 | MODES_TIEABLE_P FUNCTION_ARG_PADDING SLOW_UNALIGNED_ACCESS \ |
| 993 | HARD_REGNO_NREGS SECONDARY_MEMORY_NEEDED_MODE \ |
| 994 | SECONDARY_MEMORY_NEEDED CANNOT_CHANGE_MODE_CLASS \ |
| 995 | TRULY_NOOP_TRUNCATION FUNCTION_ARG_OFFSET CONSTANT_ALIGNMENT \ |
| 996 | STARTING_FRAME_OFFSET FLOAT_TYPE_SIZE DOUBLE_TYPE_SIZE \ |
| 997 | LONG_DOUBLE_TYPE_SIZE |
| 998 | |
| 999 | /* Target macros only used for code built for the target, that have |
| 1000 | moved to libgcc-tm.h or have never been present elsewhere. */ |
| 1001 | #pragma GCC poison DECLARE_LIBRARY_RENAMES LIBGCC2_GNU_PREFIX \ |
| 1002 | MD_UNWIND_SUPPORT MD_FROB_UPDATE_CONTEXT ENABLE_EXECUTE_STACK \ |
| 1003 | REG_VALUE_IN_UNWIND_CONTEXT ASSUME_EXTENDED_UNWIND_CONTEXT |
| 1004 | |
| 1005 | /* Other obsolete target macros, or macros that used to be in target |
| 1006 | headers and were not used, and may be obsolete or may never have |
| 1007 | been used. */ |
| 1008 | #pragma GCC poison INT_ASM_OP ASM_OUTPUT_EH_REGION_BEG CPP_PREDEFINES \ |
| 1009 | ASM_OUTPUT_EH_REGION_END ASM_OUTPUT_LABELREF_AS_INT SMALL_STACK \ |
| 1010 | DOESNT_NEED_UNWINDER EH_TABLE_LOOKUP OBJC_SELECTORS_WITHOUT_LABELS \ |
| 1011 | OMIT_EH_TABLE EASY_DIV_EXPR IMPLICIT_FIX_EXPR \ |
| 1012 | LONGJMP_RESTORE_FROM_STACK MAX_INT_TYPE_SIZE ASM_IDENTIFY_GCC \ |
| 1013 | STDC_VALUE TRAMPOLINE_ALIGN ASM_IDENTIFY_GCC_AFTER_SOURCE \ |
| 1014 | SLOW_ZERO_EXTEND SUBREG_REGNO_OFFSET DWARF_LINE_MIN_INSTR_LENGTH \ |
| 1015 | TRADITIONAL_RETURN_FLOAT NO_BUILTIN_SIZE_TYPE \ |
| 1016 | NO_BUILTIN_PTRDIFF_TYPE NO_BUILTIN_WCHAR_TYPE NO_BUILTIN_WINT_TYPE \ |
| 1017 | BLOCK_PROFILER BLOCK_PROFILER_CODE FUNCTION_BLOCK_PROFILER \ |
| 1018 | FUNCTION_BLOCK_PROFILER_EXIT MACHINE_STATE_SAVE \ |
| 1019 | MACHINE_STATE_RESTORE SCCS_DIRECTIVE SECTION_ASM_OP BYTEORDER \ |
| 1020 | ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL HOST_WORDS_BIG_ENDIAN \ |
| 1021 | OBJC_PROLOGUE ALLOCATE_TRAMPOLINE HANDLE_PRAGMA ROUND_TYPE_SIZE \ |
| 1022 | ROUND_TYPE_SIZE_UNIT CONST_SECTION_ASM_OP CRT_GET_RFIB_TEXT \ |
| 1023 | INSN_CACHE_DEPTH INSN_CACHE_SIZE \ |
| 1024 | INSN_CACHE_LINE_WIDTH INIT_SECTION_PREAMBLE NEED_ATEXIT ON_EXIT \ |
| 1025 | EXIT_BODY OBJECT_FORMAT_ROSE MULTIBYTE_CHARS MAP_CHARACTER \ |
| 1026 | LIBGCC_NEEDS_DOUBLE FINAL_PRESCAN_LABEL DEFAULT_CALLER_SAVES \ |
| 1027 | LOAD_ARGS_REVERSED MAX_INTEGER_COMPUTATION_MODE \ |
| 1028 | CONVERT_HARD_REGISTER_TO_SSA_P ASM_OUTPUT_MAIN_SOURCE_FILENAME \ |
| 1029 | FIRST_INSN_ADDRESS TEXT_SECTION SHARED_BSS_SECTION_ASM_OP \ |
| 1030 | PROMOTED_MODE EXPAND_BUILTIN_VA_END \ |
| 1031 | LINKER_DOES_NOT_WORK_WITH_DWARF2 FUNCTION_ARG_KEEP_AS_REFERENCE \ |
| 1032 | GIV_SORT_CRITERION MAX_LONG_TYPE_SIZE MAX_LONG_DOUBLE_TYPE_SIZE \ |
| 1033 | MAX_WCHAR_TYPE_SIZE SHARED_SECTION_ASM_OP INTEGRATE_THRESHOLD \ |
| 1034 | FINAL_REG_PARM_STACK_SPACE MAYBE_REG_PARM_STACK_SPACE \ |
| 1035 | TRADITIONAL_PIPELINE_INTERFACE DFA_PIPELINE_INTERFACE \ |
| 1036 | BUILTIN_SETJMP_FRAME_VALUE \ |
| 1037 | SUNOS4_SHARED_LIBRARIES PROMOTE_FOR_CALL_ONLY \ |
| 1038 | SPACE_AFTER_L_OPTION NO_RECURSIVE_FUNCTION_CSE \ |
| 1039 | DEFAULT_MAIN_RETURN TARGET_MEM_FUNCTIONS EXPAND_BUILTIN_VA_ARG \ |
| 1040 | COLLECT_PARSE_FLAG DWARF2_GENERATE_TEXT_SECTION_LABEL WINNING_GDB \ |
| 1041 | ASM_OUTPUT_FILENAME ASM_OUTPUT_SOURCE_LINE FILE_NAME_JOINER \ |
| 1042 | GDB_INV_REF_REGPARM_STABS_LETTER \ |
| 1043 | PUT_SDB_SRC_FILE STABS_GCC_MARKER SDB_GENERATE_FAKE \ |
| 1044 | NON_SAVING_SETJMP TARGET_LATE_RTL_PROLOGUE_EPILOGUE \ |
| 1045 | CASE_DROPS_THROUGH TARGET_BELL TARGET_BS TARGET_CR TARGET_DIGIT0 \ |
| 1046 | TARGET_ESC TARGET_FF TARGET_NEWLINE TARGET_TAB TARGET_VT \ |
| 1047 | LINK_LIBGCC_SPECIAL DONT_ACCESS_GBLS_AFTER_EPILOGUE \ |
| 1048 | TARGET_OPTIONS TARGET_SWITCHES EXTRA_CC_MODES FINALIZE_PIC \ |
| 1049 | PREDICATE_CODES SPECIAL_MODE_PREDICATES UNALIGNED_WORD_ASM_OP \ |
| 1050 | EXTRA_SECTIONS EXTRA_SECTION_FUNCTIONS READONLY_DATA_SECTION \ |
| 1051 | TARGET_ASM_EXCEPTION_SECTION TARGET_ASM_EH_FRAME_SECTION \ |
| 1052 | SMALL_ARG_MAX ASM_OUTPUT_SHARED_BSS ASM_OUTPUT_SHARED_COMMON \ |
| 1053 | ASM_OUTPUT_SHARED_LOCAL ASM_MAKE_LABEL_LINKONCE \ |
| 1054 | STACK_CHECK_PROBE_INTERVAL STACK_CHECK_PROBE_LOAD \ |
| 1055 | ORDER_REGS_FOR_LOCAL_ALLOC FUNCTION_OUTGOING_VALUE \ |
| 1056 | ASM_DECLARE_CONSTANT_NAME MODIFY_TARGET_NAME SWITCHES_NEED_SPACES \ |
| 1057 | SWITCH_CURTAILS_COMPILATION SWITCH_TAKES_ARG WORD_SWITCH_TAKES_ARG \ |
| 1058 | TARGET_OPTION_TRANSLATE_TABLE HANDLE_PRAGMA_PACK_PUSH_POP \ |
| 1059 | HANDLE_SYSV_PRAGMA HANDLE_PRAGMA_WEAK CONDITIONAL_REGISTER_USAGE \ |
| 1060 | FUNCTION_ARG_BOUNDARY MUST_USE_SJLJ_EXCEPTIONS US_SOFTWARE_GOFAST \ |
| 1061 | USING_SVR4_H SVR4_ASM_SPEC FUNCTION_ARG FUNCTION_ARG_ADVANCE \ |
| 1062 | FUNCTION_INCOMING_ARG IRA_COVER_CLASSES TARGET_VERSION \ |
| 1063 | MACHINE_TYPE TARGET_HAS_TARGETCM ASM_OUTPUT_BSS \ |
| 1064 | SETJMP_VIA_SAVE_AREA FORBIDDEN_INC_DEC_CLASSES \ |
| 1065 | PREFERRED_OUTPUT_RELOAD_CLASS SYSTEM_INCLUDE_DIR \ |
| 1066 | STANDARD_INCLUDE_DIR STANDARD_INCLUDE_COMPONENT \ |
| 1067 | LINK_ELIMINATE_DUPLICATE_LDIRECTORIES MIPS_DEBUGGING_INFO \ |
| 1068 | IDENT_ASM_OP ALL_COP_ADDITIONAL_REGISTER_NAMES \ |
| 1069 | RANGE_TEST_NON_SHORT_CIRCUIT \ |
| 1070 | REAL_VALUE_TRUNCATE REVERSE_CONDEXEC_PREDICATES_P \ |
| 1071 | TARGET_ALIGN_ANON_BITFIELDS TARGET_NARROW_VOLATILE_BITFIELDS \ |
| 1072 | IDENT_ASM_OP UNALIGNED_SHORT_ASM_OP UNALIGNED_INT_ASM_OP \ |
| 1073 | UNALIGNED_LONG_ASM_OP UNALIGNED_DOUBLE_INT_ASM_OP \ |
| 1074 | USE_COMMON_FOR_ONE_ONLY IFCVT_EXTRA_FIELDS IFCVT_INIT_EXTRA_FIELDS \ |
| 1075 | CASE_USE_BIT_TESTS FIXUNS_TRUNC_LIKE_FIX_TRUNC \ |
| 1076 | GO_IF_MODE_DEPENDENT_ADDRESS DELAY_SLOTS_FOR_EPILOGUE \ |
| 1077 | ELIGIBLE_FOR_EPILOGUE_DELAY TARGET_C99_FUNCTIONS TARGET_HAS_SINCOS \ |
| 1078 | REG_CLASS_FROM_LETTER CONST_OK_FOR_LETTER_P \ |
| 1079 | CONST_DOUBLE_OK_FOR_LETTER_P EXTRA_CONSTRAINT \ |
| 1080 | REG_CLASS_FROM_CONSTRAINT REG_CLASS_FOR_CONSTRAINT \ |
| 1081 | EXTRA_CONSTRAINT_STR EXTRA_MEMORY_CONSTRAINT \ |
| 1082 | EXTRA_ADDRESS_CONSTRAINT CONST_DOUBLE_OK_FOR_CONSTRAINT_P \ |
| 1083 | CALLER_SAVE_PROFITABLE LARGEST_EXPONENT_IS_NORMAL \ |
| 1084 | ROUND_TOWARDS_ZERO SF_SIZE DF_SIZE XF_SIZE TF_SIZE LIBGCC2_TF_CEXT \ |
| 1085 | LIBGCC2_LONG_DOUBLE_TYPE_SIZE STRUCT_VALUE \ |
| 1086 | EH_FRAME_IN_DATA_SECTION TARGET_FLT_EVAL_METHOD_NON_DEFAULT \ |
| 1087 | JCR_SECTION_NAME TARGET_USE_JCR_SECTION SDB_DEBUGGING_INFO \ |
| 1088 | SDB_DEBUG NO_IMPLICIT_EXTERN_C NOTICE_UPDATE_CC \ |
| 1089 | CC_STATUS_MDEP_INIT CC_STATUS_MDEP CC_STATUS SLOW_SHORT_ACCESS |
| 1090 | |
| 1091 | /* Hooks that are no longer used. */ |
| 1092 | #pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE \ |
| 1093 | LANG_HOOKS_MARK_TREE LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES \ |
| 1094 | LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS \ |
| 1095 | LANG_HOOKS_PUSHLEVEL LANG_HOOKS_SET_BLOCK \ |
| 1096 | LANG_HOOKS_MAYBE_BUILD_CLEANUP LANG_HOOKS_UPDATE_DECL_AFTER_SAVING \ |
| 1097 | LANG_HOOKS_POPLEVEL LANG_HOOKS_TRUTHVALUE_CONVERSION \ |
| 1098 | TARGET_PROMOTE_FUNCTION_ARGS TARGET_PROMOTE_FUNCTION_RETURN \ |
| 1099 | LANG_HOOKS_MISSING_ARGUMENT LANG_HOOKS_HASH_TYPES \ |
| 1100 | TARGET_HANDLE_OFAST TARGET_OPTION_OPTIMIZATION \ |
| 1101 | TARGET_IRA_COVER_CLASSES TARGET_HELP \ |
| 1102 | TARGET_HANDLE_PRAGMA_EXTERN_PREFIX \ |
| 1103 | TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN \ |
| 1104 | TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD \ |
| 1105 | TARGET_MD_ASM_CLOBBERS TARGET_RELAXED_ORDERING \ |
| 1106 | EXTENDED_SDB_BASIC_TYPES TARGET_INVALID_PARAMETER_TYPE \ |
| 1107 | TARGET_INVALID_RETURN_TYPE |
| 1108 | |
| 1109 | /* Arrays that were deleted in favor of a functional interface. */ |
| 1110 | #pragma GCC poison built_in_decls implicit_built_in_decls |
| 1111 | |
| 1112 | /* Hooks into libgcc2. */ |
| 1113 | #pragma GCC poison LIBGCC2_DOUBLE_TYPE_SIZE LIBGCC2_WORDS_BIG_ENDIAN \ |
| 1114 | LIBGCC2_FLOAT_WORDS_BIG_ENDIAN |
| 1115 | |
| 1116 | /* Miscellaneous macros that are no longer used. */ |
| 1117 | #pragma GCC poison USE_MAPPED_LOCATION GET_ENVIRONMENT |
| 1118 | |
| 1119 | /* Libiberty macros that are no longer used in GCC. */ |
| 1120 | #undef ANSI_PROTOTYPES |
| 1121 | #undef PTR_CONST |
| 1122 | #undef LONG_DOUBLE |
| 1123 | #undef VPARAMS |
| 1124 | #undef VA_OPEN |
| 1125 | #undef VA_FIXEDARG |
| 1126 | #undef VA_CLOSE |
| 1127 | #undef VA_START |
| 1128 | #pragma GCC poison ANSI_PROTOTYPES PTR_CONST LONG_DOUBLE VPARAMS VA_OPEN \ |
| 1129 | VA_FIXEDARG VA_CLOSE VA_START |
| 1130 | #endif /* IN_GCC */ |
| 1131 | |
| 1132 | /* Front ends should never have to include middle-end headers. Enforce |
| 1133 | this by poisoning the header double-include protection defines. */ |
| 1134 | #ifdef IN_GCC_FRONTEND |
| 1135 | #pragma GCC poison GCC_RTL_H GCC_EXCEPT_H GCC_EXPR_H |
| 1136 | #endif |
| 1137 | |
| 1138 | /* Note: not all uses of the `index' token (e.g. variable names and |
| 1139 | structure members) have been eliminated. */ |
| 1140 | #undef bcopy |
| 1141 | #undef bzero |
| 1142 | #undef bcmp |
| 1143 | #undef rindex |
| 1144 | #pragma GCC poison bcopy bzero bcmp rindex |
| 1145 | |
| 1146 | /* Poison ENABLE_CHECKING macro that should be replaced with |
| 1147 | 'if (flag_checking)', or with CHECKING_P macro. */ |
| 1148 | #pragma GCC poison ENABLE_CHECKING |
| 1149 | |
| 1150 | #endif /* GCC >= 3.0 */ |
| 1151 | |
| 1152 | /* This macro allows casting away const-ness to pass -Wcast-qual |
| 1153 | warnings. DO NOT USE THIS UNLESS YOU REALLY HAVE TO! It should |
| 1154 | only be used in certain specific cases. One valid case is where |
| 1155 | the C standard definitions or prototypes force you to. E.g. if you |
| 1156 | need to free a const object, or if you pass a const string to |
| 1157 | execv, et al. Another valid use would be in an allocation function |
| 1158 | that creates const objects that need to be initialized. In some |
| 1159 | cases we have non-const functions that return the argument |
| 1160 | (e.g. next_nonnote_insn). Rather than create const shadow |
| 1161 | functions, we can cast away const-ness in calling these interfaces |
| 1162 | if we're careful to verify that the called function does indeed not |
| 1163 | modify its argument and the return value is only used in a const |
| 1164 | context. (This can be somewhat dangerous as these assumptions can |
| 1165 | change after the fact). Beyond these uses, most other cases of |
| 1166 | using this macro should be viewed with extreme caution. */ |
| 1167 | |
| 1168 | #ifdef __cplusplus |
| 1169 | #define CONST_CAST2(TOTYPE,FROMTYPE,X) (const_cast<TOTYPE> (X)) |
| 1170 | #else |
| 1171 | #if defined(__GNUC__) && GCC_VERSION > 4000 |
| 1172 | /* GCC 4.0.x has a bug where it may ICE on this expression, |
| 1173 | so does GCC 3.4.x (PR17436). */ |
| 1174 | #define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; TOTYPE _nq;})(X))._nq) |
| 1175 | #elif defined(__GNUC__) |
| 1176 | inline char * |
| 1177 | helper_const_non_const_cast (const char *p) |
| 1178 | { |
| 1179 | union { |
| 1180 | const char *const_c; |
| 1181 | char *c; |
| 1182 | } val; |
| 1183 | val.const_c = p; |
| 1184 | return val.c; |
| 1185 | } |
| 1186 | |
| 1187 | #define CONST_CAST2(TOTYPE,FROMTYPE,X) \ |
| 1188 | ((TOTYPE) helper_const_non_const_cast ((const char *) (FROMTYPE) (X))) |
| 1189 | #else |
| 1190 | #define CONST_CAST2(TOTYPE,FROMTYPE,X) ((TOTYPE)(FROMTYPE)(X)) |
| 1191 | #endif |
| 1192 | #endif |
| 1193 | #define CONST_CAST(TYPE,X) CONST_CAST2 (TYPE, const TYPE, (X)) |
| 1194 | #define CONST_CAST_TREE(X) CONST_CAST (union tree_node *, (X)) |
| 1195 | #define CONST_CAST_RTX(X) CONST_CAST (struct rtx_def *, (X)) |
| 1196 | #define CONST_CAST_RTX_INSN(X) CONST_CAST (struct rtx_insn *, (X)) |
| 1197 | #define CONST_CAST_BB(X) CONST_CAST (struct basic_block_def *, (X)) |
| 1198 | #define CONST_CAST_GIMPLE(X) CONST_CAST (gimple *, (X)) |
| 1199 | |
| 1200 | /* Activate certain diagnostics as warnings (not errors via the |
| 1201 | -Werror flag). */ |
| 1202 | #if GCC_VERSION >= 4003 |
| 1203 | /* If asserts are disabled, activate -Wuninitialized as a warning (not |
| 1204 | an error/-Werror). */ |
| 1205 | #ifndef ENABLE_ASSERT_CHECKING |
| 1206 | #pragma GCC diagnostic warning "-Wuninitialized" |
| 1207 | #endif |
| 1208 | #endif |
| 1209 | |
| 1210 | #ifdef ENABLE_VALGRIND_ANNOTATIONS |
| 1211 | #include <valgrind/memcheck.h> |
| 1212 | #else |
| 1213 | /* VALGRIND_DISCARD unregisters the given block handle, |
| 1214 | but our code misuses it for discarding annotations. */ |
| 1215 | #define VALGRIND_DISCARD(x) |
| 1216 | #endif |
| 1217 | |
| 1218 | /* Macros to temporarily ignore some warnings. */ |
| 1219 | #if GCC_VERSION >= 6000 |
| 1220 | #define GCC_DIAGNOSTIC_STRINGIFY(x) #x |
| 1221 | #define GCC_DIAGNOSTIC_PUSH_IGNORED(x) \ |
| 1222 | _Pragma ("GCC diagnostic push") \ |
| 1223 | _Pragma (GCC_DIAGNOSTIC_STRINGIFY (GCC diagnostic ignored #x)) |
| 1224 | #define GCC_DIAGNOSTIC_POP _Pragma ("GCC diagnostic pop") |
| 1225 | #else |
| 1226 | #define GCC_DIAGNOSTIC_PUSH_IGNORED(x) |
| 1227 | #define GCC_DIAGNOSTIC_POP |
| 1228 | #endif |
| 1229 | |
| 1230 | /* In LTO -fwhole-program build we still want to keep the debug functions available |
| 1231 | for debugger. Mark them as used to prevent removal. */ |
| 1232 | #if (GCC_VERSION > 4000) |
| 1233 | #define DEBUG_FUNCTION __attribute__ ((__used__)) |
| 1234 | #define DEBUG_VARIABLE __attribute__ ((__used__)) |
| 1235 | #else |
| 1236 | #define DEBUG_FUNCTION |
| 1237 | #define DEBUG_VARIABLE |
| 1238 | #endif |
| 1239 | |
| 1240 | /* General macro to extract bit Y of X. */ |
| 1241 | #define TEST_BIT(X, Y) (((X) >> (Y)) & 1) |
| 1242 | |
| 1243 | /* Get definitions of HOST_WIDE_INT. */ |
| 1244 | #include "hwint.h" |
| 1245 | |
| 1246 | typedef int sort_r_cmp_fn (const void *, const void *, void *); |
| 1247 | void qsort_chk (void *, size_t, size_t, sort_r_cmp_fn *, void *); |
| 1248 | void gcc_sort_r (void *, size_t, size_t, sort_r_cmp_fn *, void *); |
| 1249 | void gcc_qsort (void *, size_t, size_t, int (*)(const void *, const void *)); |
| 1250 | void gcc_stablesort (void *, size_t, size_t, |
| 1251 | int (*)(const void *, const void *)); |
| 1252 | void gcc_stablesort_r (void *, size_t, size_t, sort_r_cmp_fn *, void *data); |
| 1253 | /* Redirect four-argument qsort calls to gcc_qsort; one-argument invocations |
| 1254 | correspond to vec::qsort, and use C qsort internally. */ |
| 1255 | #define PP_5th(a1, a2, a3, a4, a5, ...) a5 |
| 1256 | #undef qsort |
| 1257 | #define qsort(...) PP_5th (__VA_ARGS__, gcc_qsort, 3, 2, qsort, 0) (__VA_ARGS__) |
| 1258 | |
| 1259 | #define ONE_K 1024 |
| 1260 | #define ONE_M (ONE_K * ONE_K) |
| 1261 | #define ONE_G (ONE_K * ONE_M) |
| 1262 | |
| 1263 | /* Display a number as an integer multiple of either: |
| 1264 | - 1024, if said integer is >= to 10 K (in base 2) |
| 1265 | - 1024 * 1024, if said integer is >= 10 M in (base 2) |
| 1266 | */ |
| 1267 | #define SIZE_SCALE(x) (((x) < 10 * ONE_K \ |
| 1268 | ? (x) \ |
| 1269 | : ((x) < 10 * ONE_M \ |
| 1270 | ? (x) / ONE_K \ |
| 1271 | : (x) / ONE_M))) |
| 1272 | |
| 1273 | /* For a given integer, display either: |
| 1274 | - the character 'k', if the number is higher than 10 K (in base 2) |
| 1275 | but strictly lower than 10 M (in base 2) |
| 1276 | - the character 'M' if the number is higher than 10 M (in base2) |
| 1277 | - the charcter ' ' if the number is strictly lower than 10 K */ |
| 1278 | #define SIZE_LABEL(x) ((x) < 10 * ONE_K ? ' ' : ((x) < 10 * ONE_M ? 'k' : 'M')) |
| 1279 | |
| 1280 | /* Display an integer amount as multiple of 1K or 1M (in base 2). |
| 1281 | Display the correct unit (either k, M, or ' ') after the amount, as |
| 1282 | well. */ |
| 1283 | #define SIZE_AMOUNT(size) (uint64_t)SIZE_SCALE (size), SIZE_LABEL (size) |
| 1284 | |
| 1285 | /* Format string particle for printing a SIZE_AMOUNT with N being the width |
| 1286 | of the number. */ |
| 1287 | #define PRsa(n) "%" #n PRIu64 "%c" |
| 1288 | |
| 1289 | /* System headers may define NULL to be an integer (e.g. 0L), which cannot be |
| 1290 | used safely in certain contexts (e.g. as sentinels). Redefine NULL to |
| 1291 | nullptr in order to make it safer. Note that this might confuse system |
| 1292 | headers, however, by convention they must not be included after this point. |
| 1293 | */ |
| 1294 | #ifdef __cplusplus |
| 1295 | #undef NULL |
| 1296 | #define NULL nullptr |
| 1297 | #endif |
| 1298 | |
| 1299 | /* Workaround clang on PowerPC which has vec_step as reserved keyword |
| 1300 | rather than function-like macro defined in <altivec.h>. See PR114369. */ |
| 1301 | #if defined(__clang__) && defined(__powerpc__) |
| 1302 | #define vec_step vec_step_ |
| 1303 | #endif |
| 1304 | |
| 1305 | /* Return true if STR string starts with PREFIX. */ |
| 1306 | |
| 1307 | inline bool |
| 1308 | startswith (const char *str, const char *prefix) |
| 1309 | { |
| 1310 | return strncmp (s1: str, s2: prefix, n: strlen (s: prefix)) == 0; |
| 1311 | } |
| 1312 | |
| 1313 | /* Return true if STR string ends with SUFFIX. */ |
| 1314 | |
| 1315 | inline bool |
| 1316 | endswith (const char *str, const char *suffix) |
| 1317 | { |
| 1318 | size_t str_len = strlen (s: str); |
| 1319 | size_t suffix_len = strlen (s: suffix); |
| 1320 | if (str_len < suffix_len) |
| 1321 | return false; |
| 1322 | |
| 1323 | return memcmp (s1: str + str_len - suffix_len, s2: suffix, n: suffix_len) == 0; |
| 1324 | } |
| 1325 | |
| 1326 | #endif /* ! GCC_SYSTEM_H */ |
| 1327 | |