xref: /netbsd-src/external/gpl3/gcc/dist/libcpp/system.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
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