xref: /dragonfly/contrib/gcc-8.0/libcpp/system.h (revision 38fd1498)
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