1*38fd1498Szrj /* Get common system includes and various definitions and declarations based 2*38fd1498Szrj on autoconf macros. 3*38fd1498Szrj Copyright (C) 1998-2018 Free Software Foundation, Inc. 4*38fd1498Szrj 5*38fd1498Szrj This file is part of GCC. 6*38fd1498Szrj 7*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under 8*38fd1498Szrj the terms of the GNU General Public License as published by the Free 9*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later 10*38fd1498Szrj version. 11*38fd1498Szrj 12*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or 14*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15*38fd1498Szrj for more details. 16*38fd1498Szrj 17*38fd1498Szrj You should have received a copy of the GNU General Public License 18*38fd1498Szrj along with GCC; see the file COPYING3. If not see 19*38fd1498Szrj <http://www.gnu.org/licenses/>. */ 20*38fd1498Szrj 21*38fd1498Szrj 22*38fd1498Szrj #ifndef LIBCPP_SYSTEM_H 23*38fd1498Szrj #define LIBCPP_SYSTEM_H 24*38fd1498Szrj 25*38fd1498Szrj /* We must include stdarg.h before stdio.h. */ 26*38fd1498Szrj #include <stdarg.h> 27*38fd1498Szrj 28*38fd1498Szrj #ifdef HAVE_STDDEF_H 29*38fd1498Szrj # include <stddef.h> 30*38fd1498Szrj #endif 31*38fd1498Szrj #ifdef HAVE_STDINT_H 32*38fd1498Szrj # include <stdint.h> 33*38fd1498Szrj #endif 34*38fd1498Szrj #ifdef HAVE_INTTYPES_H 35*38fd1498Szrj # include <inttypes.h> 36*38fd1498Szrj #endif 37*38fd1498Szrj 38*38fd1498Szrj #include <stdio.h> 39*38fd1498Szrj 40*38fd1498Szrj /* Define a generic NULL if one hasn't already been defined. */ 41*38fd1498Szrj #ifndef NULL 42*38fd1498Szrj #define NULL 0 43*38fd1498Szrj #endif 44*38fd1498Szrj 45*38fd1498Szrj /* Use the unlocked open routines from libiberty. */ 46*38fd1498Szrj 47*38fd1498Szrj /* Some of these are #define on some systems, e.g. on AIX to redirect 48*38fd1498Szrj the names to 64bit capable functions for LARGE_FILES support. These 49*38fd1498Szrj redefs are pointless here so we can override them. */ 50*38fd1498Szrj 51*38fd1498Szrj #undef fopen 52*38fd1498Szrj #undef freopen 53*38fd1498Szrj 54*38fd1498Szrj #define fopen(PATH,MODE) fopen_unlocked(PATH,MODE) 55*38fd1498Szrj #define fdopen(FILDES,MODE) fdopen_unlocked(FILDES,MODE) 56*38fd1498Szrj #define freopen(PATH,MODE,STREAM) freopen_unlocked(PATH,MODE,STREAM) 57*38fd1498Szrj 58*38fd1498Szrj /* The compiler is not a multi-threaded application and therefore we 59*38fd1498Szrj do not have to use the locking functions. In fact, using the locking 60*38fd1498Szrj functions can cause the compiler to be significantly slower under 61*38fd1498Szrj I/O bound conditions (such as -g -O0 on very large source files). 62*38fd1498Szrj 63*38fd1498Szrj HAVE_DECL_PUTC_UNLOCKED actually indicates whether or not the stdio 64*38fd1498Szrj code is multi-thread safe by default. If it is set to 0, then do 65*38fd1498Szrj not worry about using the _unlocked functions. 66*38fd1498Szrj 67*38fd1498Szrj fputs_unlocked, fwrite_unlocked, and fprintf_unlocked are 68*38fd1498Szrj extensions and need to be prototyped by hand (since we do not 69*38fd1498Szrj define _GNU_SOURCE). */ 70*38fd1498Szrj 71*38fd1498Szrj #if defined HAVE_DECL_PUTC_UNLOCKED && HAVE_DECL_PUTC_UNLOCKED 72*38fd1498Szrj 73*38fd1498Szrj # ifdef HAVE_PUTC_UNLOCKED 74*38fd1498Szrj # undef putc 75*38fd1498Szrj # define putc(C, Stream) putc_unlocked (C, Stream) 76*38fd1498Szrj # endif 77*38fd1498Szrj # ifdef HAVE_PUTCHAR_UNLOCKED 78*38fd1498Szrj # undef putchar 79*38fd1498Szrj # define putchar(C) putchar_unlocked (C) 80*38fd1498Szrj # endif 81*38fd1498Szrj # ifdef HAVE_GETC_UNLOCKED 82*38fd1498Szrj # undef getc 83*38fd1498Szrj # define getc(Stream) getc_unlocked (Stream) 84*38fd1498Szrj # endif 85*38fd1498Szrj # ifdef HAVE_GETCHAR_UNLOCKED 86*38fd1498Szrj # undef getchar 87*38fd1498Szrj # define getchar() getchar_unlocked () 88*38fd1498Szrj # endif 89*38fd1498Szrj # ifdef HAVE_FPUTC_UNLOCKED 90*38fd1498Szrj # undef fputc 91*38fd1498Szrj # define fputc(C, Stream) fputc_unlocked (C, Stream) 92*38fd1498Szrj # endif 93*38fd1498Szrj 94*38fd1498Szrj #ifdef __cplusplus 95*38fd1498Szrj extern "C" { 96*38fd1498Szrj #endif 97*38fd1498Szrj 98*38fd1498Szrj # ifdef HAVE_CLEARERR_UNLOCKED 99*38fd1498Szrj # undef clearerr 100*38fd1498Szrj # define clearerr(Stream) clearerr_unlocked (Stream) 101*38fd1498Szrj # if defined (HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED 102*38fd1498Szrj extern void clearerr_unlocked (FILE *); 103*38fd1498Szrj # endif 104*38fd1498Szrj # endif 105*38fd1498Szrj # ifdef HAVE_FEOF_UNLOCKED 106*38fd1498Szrj # undef feof 107*38fd1498Szrj # define feof(Stream) feof_unlocked (Stream) 108*38fd1498Szrj # if defined (HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED 109*38fd1498Szrj extern int feof_unlocked (FILE *); 110*38fd1498Szrj # endif 111*38fd1498Szrj # endif 112*38fd1498Szrj # ifdef HAVE_FILENO_UNLOCKED 113*38fd1498Szrj # undef fileno 114*38fd1498Szrj # define fileno(Stream) fileno_unlocked (Stream) 115*38fd1498Szrj # if defined (HAVE_DECL_FILENO_UNLOCKED) && !HAVE_DECL_FILENO_UNLOCKED 116*38fd1498Szrj extern int fileno_unlocked (FILE *); 117*38fd1498Szrj # endif 118*38fd1498Szrj # endif 119*38fd1498Szrj # ifdef HAVE_FFLUSH_UNLOCKED 120*38fd1498Szrj # undef fflush 121*38fd1498Szrj # define fflush(Stream) fflush_unlocked (Stream) 122*38fd1498Szrj # if defined (HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED 123*38fd1498Szrj extern int fflush_unlocked (FILE *); 124*38fd1498Szrj # endif 125*38fd1498Szrj # endif 126*38fd1498Szrj # ifdef HAVE_FGETC_UNLOCKED 127*38fd1498Szrj # undef fgetc 128*38fd1498Szrj # define fgetc(Stream) fgetc_unlocked (Stream) 129*38fd1498Szrj # if defined (HAVE_DECL_FGETC_UNLOCKED) && !HAVE_DECL_FGETC_UNLOCKED 130*38fd1498Szrj extern int fgetc_unlocked (FILE *); 131*38fd1498Szrj # endif 132*38fd1498Szrj # endif 133*38fd1498Szrj # ifdef HAVE_FGETS_UNLOCKED 134*38fd1498Szrj # undef fgets 135*38fd1498Szrj # define fgets(S, n, Stream) fgets_unlocked (S, n, Stream) 136*38fd1498Szrj # if defined (HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED 137*38fd1498Szrj extern char *fgets_unlocked (char *, int, FILE *); 138*38fd1498Szrj # endif 139*38fd1498Szrj # endif 140*38fd1498Szrj # ifdef HAVE_FPUTS_UNLOCKED 141*38fd1498Szrj # undef fputs 142*38fd1498Szrj # define fputs(String, Stream) fputs_unlocked (String, Stream) 143*38fd1498Szrj # if defined (HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED 144*38fd1498Szrj extern int fputs_unlocked (const char *, FILE *); 145*38fd1498Szrj # endif 146*38fd1498Szrj # endif 147*38fd1498Szrj # ifdef HAVE_FERROR_UNLOCKED 148*38fd1498Szrj # undef ferror 149*38fd1498Szrj # define ferror(Stream) ferror_unlocked (Stream) 150*38fd1498Szrj # if defined (HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED 151*38fd1498Szrj extern int ferror_unlocked (FILE *); 152*38fd1498Szrj # endif 153*38fd1498Szrj # endif 154*38fd1498Szrj # ifdef HAVE_FREAD_UNLOCKED 155*38fd1498Szrj # undef fread 156*38fd1498Szrj # define fread(Ptr, Size, N, Stream) fread_unlocked (Ptr, Size, N, Stream) 157*38fd1498Szrj # if defined (HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED 158*38fd1498Szrj extern size_t fread_unlocked (void *, size_t, size_t, FILE *); 159*38fd1498Szrj # endif 160*38fd1498Szrj # endif 161*38fd1498Szrj # ifdef HAVE_FWRITE_UNLOCKED 162*38fd1498Szrj # undef fwrite 163*38fd1498Szrj # define fwrite(Ptr, Size, N, Stream) fwrite_unlocked (Ptr, Size, N, Stream) 164*38fd1498Szrj # if defined (HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED 165*38fd1498Szrj extern size_t fwrite_unlocked (const void *, size_t, size_t, FILE *); 166*38fd1498Szrj # endif 167*38fd1498Szrj # endif 168*38fd1498Szrj # ifdef HAVE_FPRINTF_UNLOCKED 169*38fd1498Szrj # undef fprintf 170*38fd1498Szrj /* We can't use a function-like macro here because we don't know if 171*38fd1498Szrj we have varargs macros. */ 172*38fd1498Szrj # define fprintf fprintf_unlocked 173*38fd1498Szrj # if defined (HAVE_DECL_FPRINTF_UNLOCKED) && !HAVE_DECL_FPRINTF_UNLOCKED 174*38fd1498Szrj extern int fprintf_unlocked (FILE *, const char *, ...); 175*38fd1498Szrj # endif 176*38fd1498Szrj # endif 177*38fd1498Szrj 178*38fd1498Szrj #ifdef __cplusplus 179*38fd1498Szrj } 180*38fd1498Szrj #endif 181*38fd1498Szrj 182*38fd1498Szrj #endif 183*38fd1498Szrj 184*38fd1498Szrj /* ??? Glibc's fwrite/fread_unlocked macros cause 185*38fd1498Szrj "warning: signed and unsigned type in conditional expression". */ 186*38fd1498Szrj #undef fread_unlocked 187*38fd1498Szrj #undef fwrite_unlocked 188*38fd1498Szrj 189*38fd1498Szrj #include <sys/types.h> 190*38fd1498Szrj #include <errno.h> 191*38fd1498Szrj 192*38fd1498Szrj #if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO 193*38fd1498Szrj extern int errno; 194*38fd1498Szrj #endif 195*38fd1498Szrj 196*38fd1498Szrj /* Some of glibc's string inlines cause warnings. Plus we'd rather 197*38fd1498Szrj rely on (and therefore test) GCC's string builtins. */ 198*38fd1498Szrj #define __NO_STRING_INLINES 199*38fd1498Szrj 200*38fd1498Szrj #ifdef STRING_WITH_STRINGS 201*38fd1498Szrj # include <string.h> 202*38fd1498Szrj # include <strings.h> 203*38fd1498Szrj #else 204*38fd1498Szrj # ifdef HAVE_STRING_H 205*38fd1498Szrj # include <string.h> 206*38fd1498Szrj # else 207*38fd1498Szrj # ifdef HAVE_STRINGS_H 208*38fd1498Szrj # include <strings.h> 209*38fd1498Szrj # endif 210*38fd1498Szrj # endif 211*38fd1498Szrj #endif 212*38fd1498Szrj 213*38fd1498Szrj #ifdef HAVE_STDLIB_H 214*38fd1498Szrj # include <stdlib.h> 215*38fd1498Szrj #endif 216*38fd1498Szrj 217*38fd1498Szrj #ifdef HAVE_UNISTD_H 218*38fd1498Szrj # include <unistd.h> 219*38fd1498Szrj #endif 220*38fd1498Szrj 221*38fd1498Szrj #if HAVE_LIMITS_H 222*38fd1498Szrj # include <limits.h> 223*38fd1498Szrj #endif 224*38fd1498Szrj 225*38fd1498Szrj /* Infrastructure for defining missing _MAX and _MIN macros. Note that 226*38fd1498Szrj macros defined with these cannot be used in #if. */ 227*38fd1498Szrj 228*38fd1498Szrj /* The extra casts work around common compiler bugs. */ 229*38fd1498Szrj #define INTTYPE_SIGNED(t) (! ((t) 0 < (t) -1)) 230*38fd1498Szrj /* The outer cast is needed to work around a bug in Cray C 5.0.3.0. 231*38fd1498Szrj It is necessary at least when t == time_t. */ 232*38fd1498Szrj #define INTTYPE_MINIMUM(t) ((t) (INTTYPE_SIGNED (t) \ 233*38fd1498Szrj ? (t) 1 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) 234*38fd1498Szrj #define INTTYPE_MAXIMUM(t) ((t) (~ (t) 0 - INTTYPE_MINIMUM (t))) 235*38fd1498Szrj 236*38fd1498Szrj /* Use that infrastructure to provide a few constants. */ 237*38fd1498Szrj #ifndef UCHAR_MAX 238*38fd1498Szrj # define UCHAR_MAX INTTYPE_MAXIMUM (unsigned char) 239*38fd1498Szrj #endif 240*38fd1498Szrj 241*38fd1498Szrj #ifdef TIME_WITH_SYS_TIME 242*38fd1498Szrj # include <sys/time.h> 243*38fd1498Szrj # include <time.h> 244*38fd1498Szrj #else 245*38fd1498Szrj # if HAVE_SYS_TIME_H 246*38fd1498Szrj # include <sys/time.h> 247*38fd1498Szrj # else 248*38fd1498Szrj # ifdef HAVE_TIME_H 249*38fd1498Szrj # include <time.h> 250*38fd1498Szrj # endif 251*38fd1498Szrj # endif 252*38fd1498Szrj #endif 253*38fd1498Szrj 254*38fd1498Szrj #ifdef HAVE_FCNTL_H 255*38fd1498Szrj # include <fcntl.h> 256*38fd1498Szrj #else 257*38fd1498Szrj # ifdef HAVE_SYS_FILE_H 258*38fd1498Szrj # include <sys/file.h> 259*38fd1498Szrj # endif 260*38fd1498Szrj #endif 261*38fd1498Szrj 262*38fd1498Szrj #ifdef HAVE_LOCALE_H 263*38fd1498Szrj # include <locale.h> 264*38fd1498Szrj #endif 265*38fd1498Szrj 266*38fd1498Szrj #ifdef HAVE_LANGINFO_CODESET 267*38fd1498Szrj # include <langinfo.h> 268*38fd1498Szrj #endif 269*38fd1498Szrj 270*38fd1498Szrj #ifndef HAVE_SETLOCALE 271*38fd1498Szrj # define setlocale(category, locale) (locale) 272*38fd1498Szrj #endif 273*38fd1498Szrj 274*38fd1498Szrj #ifdef ENABLE_NLS 275*38fd1498Szrj #include <libintl.h> 276*38fd1498Szrj #else 277*38fd1498Szrj /* Stubs. */ 278*38fd1498Szrj # undef dgettext 279*38fd1498Szrj # define dgettext(package, msgid) (msgid) 280*38fd1498Szrj #endif 281*38fd1498Szrj 282*38fd1498Szrj #ifndef _ 283*38fd1498Szrj # define _(msgid) dgettext (PACKAGE, msgid) 284*38fd1498Szrj #endif 285*38fd1498Szrj 286*38fd1498Szrj #ifndef N_ 287*38fd1498Szrj # define N_(msgid) msgid 288*38fd1498Szrj #endif 289*38fd1498Szrj 290*38fd1498Szrj /* Some systems define these in, e.g., param.h. We undefine these names 291*38fd1498Szrj here to avoid the warnings. We prefer to use our definitions since we 292*38fd1498Szrj know they are correct. */ 293*38fd1498Szrj 294*38fd1498Szrj #undef MIN 295*38fd1498Szrj #undef MAX 296*38fd1498Szrj #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) 297*38fd1498Szrj #define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) 298*38fd1498Szrj 299*38fd1498Szrj /* The HAVE_DECL_* macros are three-state, undefined, 0 or 1. If they 300*38fd1498Szrj are defined to 0 then we must provide the relevant declaration 301*38fd1498Szrj here. These checks will be in the undefined state while configure 302*38fd1498Szrj is running so be careful to test "defined (HAVE_DECL_*)". */ 303*38fd1498Szrj 304*38fd1498Szrj #ifdef __cplusplus 305*38fd1498Szrj extern "C" { 306*38fd1498Szrj #endif 307*38fd1498Szrj 308*38fd1498Szrj #if defined (HAVE_DECL_ABORT) && !HAVE_DECL_ABORT 309*38fd1498Szrj extern void abort (void); 310*38fd1498Szrj #endif 311*38fd1498Szrj 312*38fd1498Szrj #ifdef __cplusplus 313*38fd1498Szrj } 314*38fd1498Szrj #endif 315*38fd1498Szrj 316*38fd1498Szrj #if HAVE_SYS_STAT_H 317*38fd1498Szrj # include <sys/stat.h> 318*38fd1498Szrj #endif 319*38fd1498Szrj 320*38fd1498Szrj /* Test if something is a normal file. */ 321*38fd1498Szrj #ifndef S_ISREG 322*38fd1498Szrj #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 323*38fd1498Szrj #endif 324*38fd1498Szrj 325*38fd1498Szrj /* Test if something is a directory. */ 326*38fd1498Szrj #ifndef S_ISDIR 327*38fd1498Szrj #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 328*38fd1498Szrj #endif 329*38fd1498Szrj 330*38fd1498Szrj /* Test if something is a character special file. */ 331*38fd1498Szrj #ifndef S_ISCHR 332*38fd1498Szrj #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) 333*38fd1498Szrj #endif 334*38fd1498Szrj 335*38fd1498Szrj /* Test if something is a block special file. */ 336*38fd1498Szrj #ifndef S_ISBLK 337*38fd1498Szrj #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) 338*38fd1498Szrj #endif 339*38fd1498Szrj 340*38fd1498Szrj /* Test if something is a socket. */ 341*38fd1498Szrj #ifndef S_ISSOCK 342*38fd1498Szrj # ifdef S_IFSOCK 343*38fd1498Szrj # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) 344*38fd1498Szrj # else 345*38fd1498Szrj # define S_ISSOCK(m) 0 346*38fd1498Szrj # endif 347*38fd1498Szrj #endif 348*38fd1498Szrj 349*38fd1498Szrj /* Test if something is a FIFO. */ 350*38fd1498Szrj #ifndef S_ISFIFO 351*38fd1498Szrj # ifdef S_IFIFO 352*38fd1498Szrj # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) 353*38fd1498Szrj # else 354*38fd1498Szrj # define S_ISFIFO(m) 0 355*38fd1498Szrj # endif 356*38fd1498Szrj #endif 357*38fd1498Szrj 358*38fd1498Szrj /* Approximate O_NOCTTY and O_BINARY. */ 359*38fd1498Szrj #ifndef O_NOCTTY 360*38fd1498Szrj #define O_NOCTTY 0 361*38fd1498Szrj #endif 362*38fd1498Szrj #ifndef O_BINARY 363*38fd1498Szrj # define O_BINARY 0 364*38fd1498Szrj #endif 365*38fd1498Szrj 366*38fd1498Szrj /* Filename handling macros. */ 367*38fd1498Szrj #include "filenames.h" 368*38fd1498Szrj 369*38fd1498Szrj /* Get libiberty declarations. */ 370*38fd1498Szrj #include "libiberty.h" 371*38fd1498Szrj #include "safe-ctype.h" 372*38fd1498Szrj 373*38fd1498Szrj /* 1 if we have C99 designated initializers. 374*38fd1498Szrj 375*38fd1498Szrj ??? C99 designated initializers are not supported by most C++ 376*38fd1498Szrj compilers, including G++. -- gdr, 2005-05-18 */ 377*38fd1498Szrj #if !defined(HAVE_DESIGNATED_INITIALIZERS) 378*38fd1498Szrj #ifdef __cplusplus 379*38fd1498Szrj #define HAVE_DESIGNATED_INITIALIZERS 0 380*38fd1498Szrj #else 381*38fd1498Szrj #define HAVE_DESIGNATED_INITIALIZERS \ 382*38fd1498Szrj ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) 383*38fd1498Szrj #endif 384*38fd1498Szrj #endif 385*38fd1498Szrj 386*38fd1498Szrj #ifndef offsetof 387*38fd1498Szrj #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) 388*38fd1498Szrj #endif 389*38fd1498Szrj 390*38fd1498Szrj /* __builtin_expect(A, B) evaluates to A, but notifies the compiler that 391*38fd1498Szrj the most likely value of A is B. This feature was added at some point 392*38fd1498Szrj between 2.95 and 3.0. Let's use 3.0 as the lower bound for now. */ 393*38fd1498Szrj #if (GCC_VERSION < 3000) 394*38fd1498Szrj #define __builtin_expect(a, b) (a) 395*38fd1498Szrj #endif 396*38fd1498Szrj 397*38fd1498Szrj /* Redefine abort to report an internal error w/o coredump, and 398*38fd1498Szrj reporting the location of the error in the source file. */ 399*38fd1498Szrj extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; 400*38fd1498Szrj #define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__) 401*38fd1498Szrj 402*38fd1498Szrj /* Use gcc_assert(EXPR) to test invariants. */ 403*38fd1498Szrj #if ENABLE_ASSERT_CHECKING 404*38fd1498Szrj #define gcc_assert(EXPR) \ 405*38fd1498Szrj ((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0)) 406*38fd1498Szrj #elif (GCC_VERSION >= 4005) 407*38fd1498Szrj #define gcc_assert(EXPR) \ 408*38fd1498Szrj ((void)(__builtin_expect (!(EXPR), 0) ? __builtin_unreachable (), 0 : 0)) 409*38fd1498Szrj #else 410*38fd1498Szrj /* Include EXPR, so that unused variable warnings do not occur. */ 411*38fd1498Szrj #define gcc_assert(EXPR) ((void)(0 && (EXPR))) 412*38fd1498Szrj #endif 413*38fd1498Szrj 414*38fd1498Szrj #if CHECKING_P 415*38fd1498Szrj #define gcc_checking_assert(EXPR) gcc_assert (EXPR) 416*38fd1498Szrj #else 417*38fd1498Szrj /* N.B.: in release build EXPR is not evaluated. */ 418*38fd1498Szrj #define gcc_checking_assert(EXPR) ((void)(0 && (EXPR))) 419*38fd1498Szrj #endif 420*38fd1498Szrj 421*38fd1498Szrj /* Provide a fake boolean type. We make no attempt to use the 422*38fd1498Szrj C99 _Bool, as it may not be available in the bootstrap compiler, 423*38fd1498Szrj and even if it is, it is liable to be buggy. 424*38fd1498Szrj This must be after all inclusion of system headers, as some of 425*38fd1498Szrj them will mess us up. */ 426*38fd1498Szrj #undef bool 427*38fd1498Szrj #undef true 428*38fd1498Szrj #undef false 429*38fd1498Szrj #undef TRUE 430*38fd1498Szrj #undef FALSE 431*38fd1498Szrj 432*38fd1498Szrj #ifndef __cplusplus 433*38fd1498Szrj #define bool unsigned char 434*38fd1498Szrj #endif 435*38fd1498Szrj #define true 1 436*38fd1498Szrj #define false 0 437*38fd1498Szrj 438*38fd1498Szrj /* Some compilers do not allow the use of unsigned char in bitfields. */ 439*38fd1498Szrj #define BOOL_BITFIELD unsigned int 440*38fd1498Szrj 441*38fd1498Szrj /* Poison identifiers we do not want to use. */ 442*38fd1498Szrj #if (GCC_VERSION >= 3000) 443*38fd1498Szrj #undef calloc 444*38fd1498Szrj #undef strdup 445*38fd1498Szrj #undef malloc 446*38fd1498Szrj #undef realloc 447*38fd1498Szrj #pragma GCC poison calloc strdup 448*38fd1498Szrj #pragma GCC poison malloc realloc 449*38fd1498Szrj 450*38fd1498Szrj /* Libiberty macros that are no longer used in GCC. */ 451*38fd1498Szrj #undef ANSI_PROTOTYPES 452*38fd1498Szrj #undef PTR_CONST 453*38fd1498Szrj #undef LONG_DOUBLE 454*38fd1498Szrj #undef VPARAMS 455*38fd1498Szrj #undef VA_OPEN 456*38fd1498Szrj #undef VA_FIXEDARG 457*38fd1498Szrj #undef VA_CLOSE 458*38fd1498Szrj #undef VA_START 459*38fd1498Szrj #pragma GCC poison ANSI_PROTOTYPES PTR_CONST LONG_DOUBLE VPARAMS VA_OPEN \ 460*38fd1498Szrj VA_FIXEDARG VA_CLOSE VA_START 461*38fd1498Szrj 462*38fd1498Szrj /* Note: not all uses of the `index' token (e.g. variable names and 463*38fd1498Szrj structure members) have been eliminated. */ 464*38fd1498Szrj #undef bcopy 465*38fd1498Szrj #undef bzero 466*38fd1498Szrj #undef bcmp 467*38fd1498Szrj #undef rindex 468*38fd1498Szrj #pragma GCC poison bcopy bzero bcmp rindex 469*38fd1498Szrj 470*38fd1498Szrj #endif /* GCC >= 3.0 */ 471*38fd1498Szrj #endif /* ! LIBCPP_SYSTEM_H */ 472