14fee23f9Smrg /* Get common system includes and various definitions and declarations based 24fee23f9Smrg on autoconf macros. 3*b1e83836Smrg Copyright (C) 1998-2022 Free Software Foundation, Inc. 44fee23f9Smrg 54fee23f9Smrg This file is part of GCC. 64fee23f9Smrg 74fee23f9Smrg GCC is free software; you can redistribute it and/or modify it under 84fee23f9Smrg the terms of the GNU General Public License as published by the Free 94fee23f9Smrg Software Foundation; either version 3, or (at your option) any later 104fee23f9Smrg version. 114fee23f9Smrg 124fee23f9Smrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 134fee23f9Smrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 144fee23f9Smrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 154fee23f9Smrg for more details. 164fee23f9Smrg 174fee23f9Smrg You should have received a copy of the GNU General Public License 184fee23f9Smrg along with GCC; see the file COPYING3. If not see 194fee23f9Smrg <http://www.gnu.org/licenses/>. */ 204fee23f9Smrg 214fee23f9Smrg 224fee23f9Smrg #ifndef LIBCPP_SYSTEM_H 234fee23f9Smrg #define LIBCPP_SYSTEM_H 244fee23f9Smrg 254fee23f9Smrg /* We must include stdarg.h before stdio.h. */ 264fee23f9Smrg #include <stdarg.h> 274fee23f9Smrg 284fee23f9Smrg #ifdef HAVE_STDDEF_H 294fee23f9Smrg # include <stddef.h> 304fee23f9Smrg #endif 3148fb7bfaSmrg #ifdef HAVE_STDINT_H 3248fb7bfaSmrg # include <stdint.h> 3348fb7bfaSmrg #endif 3448fb7bfaSmrg #ifdef HAVE_INTTYPES_H 3548fb7bfaSmrg # include <inttypes.h> 3648fb7bfaSmrg #endif 374fee23f9Smrg 384fee23f9Smrg #include <stdio.h> 394fee23f9Smrg 40181254a7Smrg #ifdef __cplusplus 41181254a7Smrg #include <new> 42181254a7Smrg #endif 43181254a7Smrg 444fee23f9Smrg /* Define a generic NULL if one hasn't already been defined. */ 454fee23f9Smrg #ifndef NULL 464fee23f9Smrg #define NULL 0 474fee23f9Smrg #endif 484fee23f9Smrg 494fee23f9Smrg /* Use the unlocked open routines from libiberty. */ 5048fb7bfaSmrg 5148fb7bfaSmrg /* Some of these are #define on some systems, e.g. on AIX to redirect 5248fb7bfaSmrg the names to 64bit capable functions for LARGE_FILES support. These 5348fb7bfaSmrg redefs are pointless here so we can override them. */ 5448fb7bfaSmrg 5548fb7bfaSmrg #undef fopen 5648fb7bfaSmrg #undef freopen 5748fb7bfaSmrg 584fee23f9Smrg #define fopen(PATH,MODE) fopen_unlocked(PATH,MODE) 594fee23f9Smrg #define fdopen(FILDES,MODE) fdopen_unlocked(FILDES,MODE) 604fee23f9Smrg #define freopen(PATH,MODE,STREAM) freopen_unlocked(PATH,MODE,STREAM) 614fee23f9Smrg 624fee23f9Smrg /* The compiler is not a multi-threaded application and therefore we 634fee23f9Smrg do not have to use the locking functions. In fact, using the locking 644fee23f9Smrg functions can cause the compiler to be significantly slower under 654fee23f9Smrg I/O bound conditions (such as -g -O0 on very large source files). 664fee23f9Smrg 674fee23f9Smrg HAVE_DECL_PUTC_UNLOCKED actually indicates whether or not the stdio 684fee23f9Smrg code is multi-thread safe by default. If it is set to 0, then do 694fee23f9Smrg not worry about using the _unlocked functions. 704fee23f9Smrg 714fee23f9Smrg fputs_unlocked, fwrite_unlocked, and fprintf_unlocked are 724fee23f9Smrg extensions and need to be prototyped by hand (since we do not 734fee23f9Smrg define _GNU_SOURCE). */ 744fee23f9Smrg 754fee23f9Smrg #if defined HAVE_DECL_PUTC_UNLOCKED && HAVE_DECL_PUTC_UNLOCKED 764fee23f9Smrg 774fee23f9Smrg # ifdef HAVE_PUTC_UNLOCKED 784fee23f9Smrg # undef putc 794fee23f9Smrg # define putc(C, Stream) putc_unlocked (C, Stream) 804fee23f9Smrg # endif 814fee23f9Smrg # ifdef HAVE_PUTCHAR_UNLOCKED 824fee23f9Smrg # undef putchar 834fee23f9Smrg # define putchar(C) putchar_unlocked (C) 844fee23f9Smrg # endif 854fee23f9Smrg # ifdef HAVE_GETC_UNLOCKED 864fee23f9Smrg # undef getc 874fee23f9Smrg # define getc(Stream) getc_unlocked (Stream) 884fee23f9Smrg # endif 894fee23f9Smrg # ifdef HAVE_GETCHAR_UNLOCKED 904fee23f9Smrg # undef getchar 914fee23f9Smrg # define getchar() getchar_unlocked () 924fee23f9Smrg # endif 934fee23f9Smrg # ifdef HAVE_FPUTC_UNLOCKED 944fee23f9Smrg # undef fputc 954fee23f9Smrg # define fputc(C, Stream) fputc_unlocked (C, Stream) 964fee23f9Smrg # endif 974fee23f9Smrg 9848fb7bfaSmrg #ifdef __cplusplus 9948fb7bfaSmrg extern "C" { 10048fb7bfaSmrg #endif 10148fb7bfaSmrg 1024fee23f9Smrg # ifdef HAVE_CLEARERR_UNLOCKED 1034fee23f9Smrg # undef clearerr 1044fee23f9Smrg # define clearerr(Stream) clearerr_unlocked (Stream) 1054fee23f9Smrg # if defined (HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED 1064fee23f9Smrg extern void clearerr_unlocked (FILE *); 1074fee23f9Smrg # endif 1084fee23f9Smrg # endif 1094fee23f9Smrg # ifdef HAVE_FEOF_UNLOCKED 1104fee23f9Smrg # undef feof 1114fee23f9Smrg # define feof(Stream) feof_unlocked (Stream) 1124fee23f9Smrg # if defined (HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED 1134fee23f9Smrg extern int feof_unlocked (FILE *); 1144fee23f9Smrg # endif 1154fee23f9Smrg # endif 1164fee23f9Smrg # ifdef HAVE_FILENO_UNLOCKED 1174fee23f9Smrg # undef fileno 1184fee23f9Smrg # define fileno(Stream) fileno_unlocked (Stream) 1194fee23f9Smrg # if defined (HAVE_DECL_FILENO_UNLOCKED) && !HAVE_DECL_FILENO_UNLOCKED 1204fee23f9Smrg extern int fileno_unlocked (FILE *); 1214fee23f9Smrg # endif 1224fee23f9Smrg # endif 1234fee23f9Smrg # ifdef HAVE_FFLUSH_UNLOCKED 1244fee23f9Smrg # undef fflush 1254fee23f9Smrg # define fflush(Stream) fflush_unlocked (Stream) 1264fee23f9Smrg # if defined (HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED 1274fee23f9Smrg extern int fflush_unlocked (FILE *); 1284fee23f9Smrg # endif 1294fee23f9Smrg # endif 1304fee23f9Smrg # ifdef HAVE_FGETC_UNLOCKED 1314fee23f9Smrg # undef fgetc 1324fee23f9Smrg # define fgetc(Stream) fgetc_unlocked (Stream) 1334fee23f9Smrg # if defined (HAVE_DECL_FGETC_UNLOCKED) && !HAVE_DECL_FGETC_UNLOCKED 1344fee23f9Smrg extern int fgetc_unlocked (FILE *); 1354fee23f9Smrg # endif 1364fee23f9Smrg # endif 1374fee23f9Smrg # ifdef HAVE_FGETS_UNLOCKED 1384fee23f9Smrg # undef fgets 1394fee23f9Smrg # define fgets(S, n, Stream) fgets_unlocked (S, n, Stream) 1404fee23f9Smrg # if defined (HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED 1414fee23f9Smrg extern char *fgets_unlocked (char *, int, FILE *); 1424fee23f9Smrg # endif 1434fee23f9Smrg # endif 1444fee23f9Smrg # ifdef HAVE_FPUTS_UNLOCKED 1454fee23f9Smrg # undef fputs 1464fee23f9Smrg # define fputs(String, Stream) fputs_unlocked (String, Stream) 1474fee23f9Smrg # if defined (HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED 1484fee23f9Smrg extern int fputs_unlocked (const char *, FILE *); 1494fee23f9Smrg # endif 1504fee23f9Smrg # endif 1514fee23f9Smrg # ifdef HAVE_FERROR_UNLOCKED 1524fee23f9Smrg # undef ferror 1534fee23f9Smrg # define ferror(Stream) ferror_unlocked (Stream) 1544fee23f9Smrg # if defined (HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED 1554fee23f9Smrg extern int ferror_unlocked (FILE *); 1564fee23f9Smrg # endif 1574fee23f9Smrg # endif 1584fee23f9Smrg # ifdef HAVE_FREAD_UNLOCKED 1594fee23f9Smrg # undef fread 1604fee23f9Smrg # define fread(Ptr, Size, N, Stream) fread_unlocked (Ptr, Size, N, Stream) 1614fee23f9Smrg # if defined (HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED 1624fee23f9Smrg extern size_t fread_unlocked (void *, size_t, size_t, FILE *); 1634fee23f9Smrg # endif 1644fee23f9Smrg # endif 1654fee23f9Smrg # ifdef HAVE_FWRITE_UNLOCKED 1664fee23f9Smrg # undef fwrite 1674fee23f9Smrg # define fwrite(Ptr, Size, N, Stream) fwrite_unlocked (Ptr, Size, N, Stream) 1684fee23f9Smrg # if defined (HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED 1694fee23f9Smrg extern size_t fwrite_unlocked (const void *, size_t, size_t, FILE *); 1704fee23f9Smrg # endif 1714fee23f9Smrg # endif 1724fee23f9Smrg # ifdef HAVE_FPRINTF_UNLOCKED 1734fee23f9Smrg # undef fprintf 1744fee23f9Smrg /* We can't use a function-like macro here because we don't know if 1754fee23f9Smrg we have varargs macros. */ 1764fee23f9Smrg # define fprintf fprintf_unlocked 1774fee23f9Smrg # if defined (HAVE_DECL_FPRINTF_UNLOCKED) && !HAVE_DECL_FPRINTF_UNLOCKED 1784fee23f9Smrg extern int fprintf_unlocked (FILE *, const char *, ...); 1794fee23f9Smrg # endif 1804fee23f9Smrg # endif 1814fee23f9Smrg 18248fb7bfaSmrg #ifdef __cplusplus 18348fb7bfaSmrg } 18448fb7bfaSmrg #endif 18548fb7bfaSmrg 1864fee23f9Smrg #endif 1874fee23f9Smrg 1884fee23f9Smrg /* ??? Glibc's fwrite/fread_unlocked macros cause 1894fee23f9Smrg "warning: signed and unsigned type in conditional expression". */ 1904fee23f9Smrg #undef fread_unlocked 1914fee23f9Smrg #undef fwrite_unlocked 1924fee23f9Smrg 1934fee23f9Smrg #include <sys/types.h> 1944fee23f9Smrg #include <errno.h> 1954fee23f9Smrg 1964fee23f9Smrg #if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO 1974fee23f9Smrg extern int errno; 1984fee23f9Smrg #endif 1994fee23f9Smrg 2004fee23f9Smrg /* Some of glibc's string inlines cause warnings. Plus we'd rather 2014fee23f9Smrg rely on (and therefore test) GCC's string builtins. */ 2024fee23f9Smrg #define __NO_STRING_INLINES 2034fee23f9Smrg 2044fee23f9Smrg #ifdef STRING_WITH_STRINGS 2054fee23f9Smrg # include <string.h> 2064fee23f9Smrg # include <strings.h> 2074fee23f9Smrg #else 2084fee23f9Smrg # ifdef HAVE_STRING_H 2094fee23f9Smrg # include <string.h> 2104fee23f9Smrg # else 2114fee23f9Smrg # ifdef HAVE_STRINGS_H 2124fee23f9Smrg # include <strings.h> 2134fee23f9Smrg # endif 2144fee23f9Smrg # endif 2154fee23f9Smrg #endif 2164fee23f9Smrg 2174fee23f9Smrg #ifdef HAVE_STDLIB_H 2184fee23f9Smrg # include <stdlib.h> 2194fee23f9Smrg #endif 2204fee23f9Smrg 2214fee23f9Smrg #ifdef HAVE_UNISTD_H 2224fee23f9Smrg # include <unistd.h> 2234fee23f9Smrg #endif 2244fee23f9Smrg 2254fee23f9Smrg #if HAVE_LIMITS_H 2264fee23f9Smrg # include <limits.h> 2274fee23f9Smrg #endif 2284fee23f9Smrg 2294fee23f9Smrg /* Infrastructure for defining missing _MAX and _MIN macros. Note that 2304fee23f9Smrg macros defined with these cannot be used in #if. */ 2314fee23f9Smrg 2324fee23f9Smrg /* The extra casts work around common compiler bugs. */ 2334fee23f9Smrg #define INTTYPE_SIGNED(t) (! ((t) 0 < (t) -1)) 2344fee23f9Smrg /* The outer cast is needed to work around a bug in Cray C 5.0.3.0. 2354fee23f9Smrg It is necessary at least when t == time_t. */ 2364fee23f9Smrg #define INTTYPE_MINIMUM(t) ((t) (INTTYPE_SIGNED (t) \ 237f9a78e0eSmrg ? (t) 1 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) 2384fee23f9Smrg #define INTTYPE_MAXIMUM(t) ((t) (~ (t) 0 - INTTYPE_MINIMUM (t))) 2394fee23f9Smrg 2404fee23f9Smrg /* Use that infrastructure to provide a few constants. */ 2414fee23f9Smrg #ifndef UCHAR_MAX 2424fee23f9Smrg # define UCHAR_MAX INTTYPE_MAXIMUM (unsigned char) 2434fee23f9Smrg #endif 2444fee23f9Smrg 2454fee23f9Smrg #ifdef TIME_WITH_SYS_TIME 2464fee23f9Smrg # include <sys/time.h> 2474fee23f9Smrg # include <time.h> 2484fee23f9Smrg #else 2494fee23f9Smrg # if HAVE_SYS_TIME_H 2504fee23f9Smrg # include <sys/time.h> 2514fee23f9Smrg # else 2524fee23f9Smrg # ifdef HAVE_TIME_H 2534fee23f9Smrg # include <time.h> 2544fee23f9Smrg # endif 2554fee23f9Smrg # endif 2564fee23f9Smrg #endif 2574fee23f9Smrg 2584fee23f9Smrg #ifdef HAVE_FCNTL_H 2594fee23f9Smrg # include <fcntl.h> 2604fee23f9Smrg #else 2614fee23f9Smrg # ifdef HAVE_SYS_FILE_H 2624fee23f9Smrg # include <sys/file.h> 2634fee23f9Smrg # endif 2644fee23f9Smrg #endif 2654fee23f9Smrg 2664fee23f9Smrg #ifdef HAVE_LOCALE_H 2674fee23f9Smrg # include <locale.h> 2684fee23f9Smrg #endif 2694fee23f9Smrg 2704fee23f9Smrg #ifdef HAVE_LANGINFO_CODESET 2714fee23f9Smrg # include <langinfo.h> 2724fee23f9Smrg #endif 2734fee23f9Smrg 2744fee23f9Smrg #ifndef HAVE_SETLOCALE 2754fee23f9Smrg # define setlocale(category, locale) (locale) 2764fee23f9Smrg #endif 2774fee23f9Smrg 2784fee23f9Smrg #ifdef ENABLE_NLS 2794fee23f9Smrg #include <libintl.h> 2804fee23f9Smrg #else 2814fee23f9Smrg /* Stubs. */ 2824fee23f9Smrg # undef dgettext 2834fee23f9Smrg # define dgettext(package, msgid) (msgid) 2844fee23f9Smrg #endif 2854fee23f9Smrg 2864fee23f9Smrg #ifndef _ 2874fee23f9Smrg # define _(msgid) dgettext (PACKAGE, msgid) 2884fee23f9Smrg #endif 2894fee23f9Smrg 2904fee23f9Smrg #ifndef N_ 2914fee23f9Smrg # define N_(msgid) msgid 2924fee23f9Smrg #endif 2934fee23f9Smrg 2944fee23f9Smrg /* Some systems define these in, e.g., param.h. We undefine these names 2954fee23f9Smrg here to avoid the warnings. We prefer to use our definitions since we 2964fee23f9Smrg know they are correct. */ 2974fee23f9Smrg 2984fee23f9Smrg #undef MIN 2994fee23f9Smrg #undef MAX 3004fee23f9Smrg #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) 3014fee23f9Smrg #define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) 3024fee23f9Smrg 3034fee23f9Smrg /* The HAVE_DECL_* macros are three-state, undefined, 0 or 1. If they 3044fee23f9Smrg are defined to 0 then we must provide the relevant declaration 3054fee23f9Smrg here. These checks will be in the undefined state while configure 3064fee23f9Smrg is running so be careful to test "defined (HAVE_DECL_*)". */ 3074fee23f9Smrg 30848fb7bfaSmrg #ifdef __cplusplus 30948fb7bfaSmrg extern "C" { 31048fb7bfaSmrg #endif 31148fb7bfaSmrg 3124fee23f9Smrg #if defined (HAVE_DECL_ABORT) && !HAVE_DECL_ABORT 3134fee23f9Smrg extern void abort (void); 3144fee23f9Smrg #endif 3154fee23f9Smrg 31648fb7bfaSmrg #ifdef __cplusplus 31748fb7bfaSmrg } 31848fb7bfaSmrg #endif 31948fb7bfaSmrg 3204fee23f9Smrg #if HAVE_SYS_STAT_H 3214fee23f9Smrg # include <sys/stat.h> 3224fee23f9Smrg #endif 3234fee23f9Smrg 3244fee23f9Smrg /* Test if something is a normal file. */ 3254fee23f9Smrg #ifndef S_ISREG 3264fee23f9Smrg #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 3274fee23f9Smrg #endif 3284fee23f9Smrg 3294fee23f9Smrg /* Test if something is a directory. */ 3304fee23f9Smrg #ifndef S_ISDIR 3314fee23f9Smrg #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 3324fee23f9Smrg #endif 3334fee23f9Smrg 3344fee23f9Smrg /* Test if something is a character special file. */ 3354fee23f9Smrg #ifndef S_ISCHR 3364fee23f9Smrg #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) 3374fee23f9Smrg #endif 3384fee23f9Smrg 3394fee23f9Smrg /* Test if something is a block special file. */ 3404fee23f9Smrg #ifndef S_ISBLK 3414fee23f9Smrg #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) 3424fee23f9Smrg #endif 3434fee23f9Smrg 3444fee23f9Smrg /* Test if something is a socket. */ 3454fee23f9Smrg #ifndef S_ISSOCK 3464fee23f9Smrg # ifdef S_IFSOCK 3474fee23f9Smrg # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) 3484fee23f9Smrg # else 3494fee23f9Smrg # define S_ISSOCK(m) 0 3504fee23f9Smrg # endif 3514fee23f9Smrg #endif 3524fee23f9Smrg 3534fee23f9Smrg /* Test if something is a FIFO. */ 3544fee23f9Smrg #ifndef S_ISFIFO 3554fee23f9Smrg # ifdef S_IFIFO 3564fee23f9Smrg # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) 3574fee23f9Smrg # else 3584fee23f9Smrg # define S_ISFIFO(m) 0 3594fee23f9Smrg # endif 3604fee23f9Smrg #endif 3614fee23f9Smrg 3624fee23f9Smrg /* Approximate O_NOCTTY and O_BINARY. */ 3634fee23f9Smrg #ifndef O_NOCTTY 3644fee23f9Smrg #define O_NOCTTY 0 3654fee23f9Smrg #endif 3664fee23f9Smrg #ifndef O_BINARY 3674fee23f9Smrg # define O_BINARY 0 3684fee23f9Smrg #endif 3694fee23f9Smrg 3704fee23f9Smrg /* Filename handling macros. */ 3714fee23f9Smrg #include "filenames.h" 3724fee23f9Smrg 3734fee23f9Smrg /* Get libiberty declarations. */ 3744fee23f9Smrg #include "libiberty.h" 3754fee23f9Smrg #include "safe-ctype.h" 3764fee23f9Smrg 3774fee23f9Smrg /* 1 if we have C99 designated initializers. 3784fee23f9Smrg 3794fee23f9Smrg ??? C99 designated initializers are not supported by most C++ 3804fee23f9Smrg compilers, including G++. -- gdr, 2005-05-18 */ 3814fee23f9Smrg #if !defined(HAVE_DESIGNATED_INITIALIZERS) 382b17d1066Smrg #ifdef __cplusplus 383b17d1066Smrg #define HAVE_DESIGNATED_INITIALIZERS 0 384b17d1066Smrg #else 3854fee23f9Smrg #define HAVE_DESIGNATED_INITIALIZERS \ 386b17d1066Smrg ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) 387b17d1066Smrg #endif 3884fee23f9Smrg #endif 3894fee23f9Smrg 3904fee23f9Smrg #ifndef offsetof 3914fee23f9Smrg #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) 3924fee23f9Smrg #endif 3934fee23f9Smrg 3944fee23f9Smrg /* __builtin_expect(A, B) evaluates to A, but notifies the compiler that 3954fee23f9Smrg the most likely value of A is B. This feature was added at some point 3964fee23f9Smrg between 2.95 and 3.0. Let's use 3.0 as the lower bound for now. */ 3974fee23f9Smrg #if (GCC_VERSION < 3000) 3984fee23f9Smrg #define __builtin_expect(a, b) (a) 3994fee23f9Smrg #endif 4004fee23f9Smrg 401f9a78e0eSmrg /* Redefine abort to report an internal error w/o coredump, and 402f9a78e0eSmrg reporting the location of the error in the source file. */ 403f9a78e0eSmrg extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; 404f9a78e0eSmrg #define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__) 405f9a78e0eSmrg 406f9a78e0eSmrg /* Use gcc_assert(EXPR) to test invariants. */ 407f9a78e0eSmrg #if ENABLE_ASSERT_CHECKING 408f9a78e0eSmrg #define gcc_assert(EXPR) \ 409f9a78e0eSmrg ((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0)) 410f9a78e0eSmrg #elif (GCC_VERSION >= 4005) 411f9a78e0eSmrg #define gcc_assert(EXPR) \ 412f9a78e0eSmrg ((void)(__builtin_expect (!(EXPR), 0) ? __builtin_unreachable (), 0 : 0)) 413f9a78e0eSmrg #else 414f9a78e0eSmrg /* Include EXPR, so that unused variable warnings do not occur. */ 415f9a78e0eSmrg #define gcc_assert(EXPR) ((void)(0 && (EXPR))) 416f9a78e0eSmrg #endif 417f9a78e0eSmrg 418f9a78e0eSmrg #if CHECKING_P 419f9a78e0eSmrg #define gcc_checking_assert(EXPR) gcc_assert (EXPR) 420f9a78e0eSmrg #else 421f9a78e0eSmrg /* N.B.: in release build EXPR is not evaluated. */ 422f9a78e0eSmrg #define gcc_checking_assert(EXPR) ((void)(0 && (EXPR))) 423f9a78e0eSmrg #endif 424f9a78e0eSmrg 425*b1e83836Smrg #ifdef __has_cpp_attribute 426*b1e83836Smrg # if __has_cpp_attribute(likely) 427*b1e83836Smrg # define ATTR_LIKELY [[likely]] 428*b1e83836Smrg # elif __has_cpp_attribute(__likely__) 429*b1e83836Smrg # define ATTR_LIKELY [[__likely__]] 430*b1e83836Smrg # else 431*b1e83836Smrg # define ATTR_LIKELY 4324fee23f9Smrg # endif 433*b1e83836Smrg #else 434*b1e83836Smrg # define ATTR_LIKELY 435*b1e83836Smrg #endif 4364fee23f9Smrg 4374fee23f9Smrg /* Poison identifiers we do not want to use. */ 4384fee23f9Smrg #if (GCC_VERSION >= 3000) 4394fee23f9Smrg #undef calloc 4404fee23f9Smrg #undef strdup 4414fee23f9Smrg #undef malloc 4424fee23f9Smrg #undef realloc 4434fee23f9Smrg #pragma GCC poison calloc strdup 4444fee23f9Smrg #pragma GCC poison malloc realloc 4454fee23f9Smrg 4464fee23f9Smrg /* Libiberty macros that are no longer used in GCC. */ 4474fee23f9Smrg #undef ANSI_PROTOTYPES 4484fee23f9Smrg #undef PTR_CONST 4494fee23f9Smrg #undef LONG_DOUBLE 4504fee23f9Smrg #undef VPARAMS 4514fee23f9Smrg #undef VA_OPEN 4524fee23f9Smrg #undef VA_FIXEDARG 4534fee23f9Smrg #undef VA_CLOSE 4544fee23f9Smrg #undef VA_START 4554fee23f9Smrg #pragma GCC poison ANSI_PROTOTYPES PTR_CONST LONG_DOUBLE VPARAMS VA_OPEN \ 4564fee23f9Smrg VA_FIXEDARG VA_CLOSE VA_START 4574fee23f9Smrg 4584fee23f9Smrg /* Note: not all uses of the `index' token (e.g. variable names and 4594fee23f9Smrg structure members) have been eliminated. */ 4604fee23f9Smrg #undef bcopy 4614fee23f9Smrg #undef bzero 4624fee23f9Smrg #undef bcmp 4634fee23f9Smrg #undef rindex 4644fee23f9Smrg #pragma GCC poison bcopy bzero bcmp rindex 4654fee23f9Smrg 4664fee23f9Smrg #endif /* GCC >= 3.0 */ 4674fee23f9Smrg #endif /* ! LIBCPP_SYSTEM_H */ 468