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