/* Get common system includes and various definitions and declarations based on autoconf macros. Copyright (C) 1998-2023 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ #ifndef LIBCPP_SYSTEM_H #define LIBCPP_SYSTEM_H /* We must include stdarg.h before stdio.h. */ #include #ifdef HAVE_STDDEF_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #include #ifdef __cplusplus #include #endif /* Define a generic NULL if one hasn't already been defined. */ #ifndef NULL #define NULL 0 #endif /* Use the unlocked open routines from libiberty. */ /* Some of these are #define on some systems, e.g. on AIX to redirect the names to 64bit capable functions for LARGE_FILES support. These redefs are pointless here so we can override them. */ #undef fopen #undef freopen #define fopen(PATH,MODE) fopen_unlocked(PATH,MODE) #define fdopen(FILDES,MODE) fdopen_unlocked(FILDES,MODE) #define freopen(PATH,MODE,STREAM) freopen_unlocked(PATH,MODE,STREAM) /* The compiler is not a multi-threaded application and therefore we do not have to use the locking functions. In fact, using the locking functions can cause the compiler to be significantly slower under I/O bound conditions (such as -g -O0 on very large source files). HAVE_DECL_PUTC_UNLOCKED actually indicates whether or not the stdio code is multi-thread safe by default. If it is set to 0, then do not worry about using the _unlocked functions. fputs_unlocked, fwrite_unlocked, and fprintf_unlocked are extensions and need to be prototyped by hand (since we do not define _GNU_SOURCE). */ #if defined HAVE_DECL_PUTC_UNLOCKED && HAVE_DECL_PUTC_UNLOCKED # ifdef HAVE_PUTC_UNLOCKED # undef putc # define putc(C, Stream) putc_unlocked (C, Stream) # endif # ifdef HAVE_PUTCHAR_UNLOCKED # undef putchar # define putchar(C) putchar_unlocked (C) # endif # ifdef HAVE_GETC_UNLOCKED # undef getc # define getc(Stream) getc_unlocked (Stream) # endif # ifdef HAVE_GETCHAR_UNLOCKED # undef getchar # define getchar() getchar_unlocked () # endif # ifdef HAVE_FPUTC_UNLOCKED # undef fputc # define fputc(C, Stream) fputc_unlocked (C, Stream) # endif #ifdef __cplusplus extern "C" { #endif # ifdef HAVE_CLEARERR_UNLOCKED # undef clearerr # define clearerr(Stream) clearerr_unlocked (Stream) # if defined (HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED extern void clearerr_unlocked (FILE *); # endif # endif # ifdef HAVE_FEOF_UNLOCKED # undef feof # define feof(Stream) feof_unlocked (Stream) # if defined (HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED extern int feof_unlocked (FILE *); # endif # endif # ifdef HAVE_FILENO_UNLOCKED # undef fileno # define fileno(Stream) fileno_unlocked (Stream) # if defined (HAVE_DECL_FILENO_UNLOCKED) && !HAVE_DECL_FILENO_UNLOCKED extern int fileno_unlocked (FILE *); # endif # endif # ifdef HAVE_FFLUSH_UNLOCKED # undef fflush # define fflush(Stream) fflush_unlocked (Stream) # if defined (HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED extern int fflush_unlocked (FILE *); # endif # endif # ifdef HAVE_FGETC_UNLOCKED # undef fgetc # define fgetc(Stream) fgetc_unlocked (Stream) # if defined (HAVE_DECL_FGETC_UNLOCKED) && !HAVE_DECL_FGETC_UNLOCKED extern int fgetc_unlocked (FILE *); # endif # endif # ifdef HAVE_FGETS_UNLOCKED # undef fgets # define fgets(S, n, Stream) fgets_unlocked (S, n, Stream) # if defined (HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED extern char *fgets_unlocked (char *, int, FILE *); # endif # endif # ifdef HAVE_FPUTS_UNLOCKED # undef fputs # define fputs(String, Stream) fputs_unlocked (String, Stream) # if defined (HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED extern int fputs_unlocked (const char *, FILE *); # endif # endif # ifdef HAVE_FERROR_UNLOCKED # undef ferror # define ferror(Stream) ferror_unlocked (Stream) # if defined (HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED extern int ferror_unlocked (FILE *); # endif # endif # ifdef HAVE_FREAD_UNLOCKED # undef fread # define fread(Ptr, Size, N, Stream) fread_unlocked (Ptr, Size, N, Stream) # if defined (HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED extern size_t fread_unlocked (void *, size_t, size_t, FILE *); # endif # endif # ifdef HAVE_FWRITE_UNLOCKED # undef fwrite # define fwrite(Ptr, Size, N, Stream) fwrite_unlocked (Ptr, Size, N, Stream) # if defined (HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED extern size_t fwrite_unlocked (const void *, size_t, size_t, FILE *); # endif # endif # ifdef HAVE_FPRINTF_UNLOCKED # undef fprintf /* We can't use a function-like macro here because we don't know if we have varargs macros. */ # define fprintf fprintf_unlocked # if defined (HAVE_DECL_FPRINTF_UNLOCKED) && !HAVE_DECL_FPRINTF_UNLOCKED extern int fprintf_unlocked (FILE *, const char *, ...); # endif # endif #ifdef __cplusplus } #endif #endif /* ??? Glibc's fwrite/fread_unlocked macros cause "warning: signed and unsigned type in conditional expression". */ #undef fread_unlocked #undef fwrite_unlocked #include #include #if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO extern int errno; #endif /* Some of glibc's string inlines cause warnings. Plus we'd rather rely on (and therefore test) GCC's string builtins. */ #define __NO_STRING_INLINES #ifdef STRING_WITH_STRINGS # include # include #else # ifdef HAVE_STRING_H # include # else # ifdef HAVE_STRINGS_H # include # endif # endif #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_UNISTD_H # include #endif #if HAVE_LIMITS_H # include #endif /* Infrastructure for defining missing _MAX and _MIN macros. Note that macros defined with these cannot be used in #if. */ /* The extra casts work around common compiler bugs. */ #define INTTYPE_SIGNED(t) (! ((t) 0 < (t) -1)) /* The outer cast is needed to work around a bug in Cray C 5.0.3.0. It is necessary at least when t == time_t. */ #define INTTYPE_MINIMUM(t) ((t) (INTTYPE_SIGNED (t) \ ? (t) 1 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) #define INTTYPE_MAXIMUM(t) ((t) (~ (t) 0 - INTTYPE_MINIMUM (t))) /* Use that infrastructure to provide a few constants. */ #ifndef UCHAR_MAX # define UCHAR_MAX INTTYPE_MAXIMUM (unsigned char) #endif #ifdef TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # ifdef HAVE_TIME_H # include # endif # endif #endif #ifdef HAVE_FCNTL_H # include #else # ifdef HAVE_SYS_FILE_H # include # endif #endif #ifdef HAVE_LOCALE_H # include #endif #ifdef HAVE_LANGINFO_CODESET # include #endif #ifndef HAVE_SETLOCALE # define setlocale(category, locale) (locale) #endif #ifdef ENABLE_NLS #include #else /* Stubs. */ # undef dgettext # define dgettext(package, msgid) (msgid) #endif #ifndef _ # define _(msgid) dgettext (PACKAGE, msgid) #endif #ifndef N_ # define N_(msgid) msgid #endif /* Some systems define these in, e.g., param.h. We undefine these names here to avoid the warnings. We prefer to use our definitions since we know they are correct. */ #undef MIN #undef MAX #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) #define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) /* The HAVE_DECL_* macros are three-state, undefined, 0 or 1. If they are defined to 0 then we must provide the relevant declaration here. These checks will be in the undefined state while configure is running so be careful to test "defined (HAVE_DECL_*)". */ #ifdef __cplusplus extern "C" { #endif #if defined (HAVE_DECL_ABORT) && !HAVE_DECL_ABORT extern void abort (void); #endif #ifdef __cplusplus } #endif #if HAVE_SYS_STAT_H # include #endif /* Test if something is a normal file. */ #ifndef S_ISREG #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #endif /* Test if something is a directory. */ #ifndef S_ISDIR #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif /* Test if something is a character special file. */ #ifndef S_ISCHR #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) #endif /* Test if something is a block special file. */ #ifndef S_ISBLK #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) #endif /* Test if something is a socket. */ #ifndef S_ISSOCK # ifdef S_IFSOCK # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) # else # define S_ISSOCK(m) 0 # endif #endif /* Test if something is a FIFO. */ #ifndef S_ISFIFO # ifdef S_IFIFO # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) # else # define S_ISFIFO(m) 0 # endif #endif /* Approximate O_NOCTTY and O_BINARY. */ #ifndef O_NOCTTY #define O_NOCTTY 0 #endif #ifndef O_BINARY # define O_BINARY 0 #endif /* Filename handling macros. */ #include "filenames.h" /* Get libiberty declarations. */ #include "libiberty.h" #include "safe-ctype.h" /* 1 if we have C99 designated initializers. ??? C99 designated initializers are not supported by most C++ compilers, including G++. -- gdr, 2005-05-18 */ #if !defined(HAVE_DESIGNATED_INITIALIZERS) #ifdef __cplusplus #define HAVE_DESIGNATED_INITIALIZERS 0 #else #define HAVE_DESIGNATED_INITIALIZERS \ ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) #endif #endif #ifndef offsetof #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) #endif /* __builtin_expect(A, B) evaluates to A, but notifies the compiler that the most likely value of A is B. This feature was added at some point between 2.95 and 3.0. Let's use 3.0 as the lower bound for now. */ #if (GCC_VERSION < 3000) #define __builtin_expect(a, b) (a) #endif /* Redefine abort to report an internal error w/o coredump, and reporting the location of the error in the source file. */ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; #define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__) /* Use gcc_assert(EXPR) to test invariants. */ #if ENABLE_ASSERT_CHECKING #define gcc_assert(EXPR) \ ((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0)) #elif (GCC_VERSION >= 4005) #define gcc_assert(EXPR) \ ((void)(__builtin_expect (!(EXPR), 0) ? __builtin_unreachable (), 0 : 0)) #else /* Include EXPR, so that unused variable warnings do not occur. */ #define gcc_assert(EXPR) ((void)(0 && (EXPR))) #endif #if CHECKING_P #define gcc_checking_assert(EXPR) gcc_assert (EXPR) #else /* N.B.: in release build EXPR is not evaluated. */ #define gcc_checking_assert(EXPR) ((void)(0 && (EXPR))) #endif #ifdef __has_cpp_attribute # if __has_cpp_attribute(likely) # define ATTR_LIKELY [[likely]] # elif __has_cpp_attribute(__likely__) # define ATTR_LIKELY [[__likely__]] # else # define ATTR_LIKELY # endif #else # define ATTR_LIKELY #endif /* Poison identifiers we do not want to use. */ #if (GCC_VERSION >= 3000) #undef calloc #undef strdup #undef malloc #undef realloc #pragma GCC poison calloc strdup #pragma GCC poison malloc realloc /* Libiberty macros that are no longer used in GCC. */ #undef ANSI_PROTOTYPES #undef PTR_CONST #undef LONG_DOUBLE #undef VPARAMS #undef VA_OPEN #undef VA_FIXEDARG #undef VA_CLOSE #undef VA_START #pragma GCC poison ANSI_PROTOTYPES PTR_CONST LONG_DOUBLE VPARAMS VA_OPEN \ VA_FIXEDARG VA_CLOSE VA_START /* Note: not all uses of the `index' token (e.g. variable names and structure members) have been eliminated. */ #undef bcopy #undef bzero #undef bcmp #undef rindex #pragma GCC poison bcopy bzero bcmp rindex #endif /* GCC >= 3.0 */ #endif /* ! LIBCPP_SYSTEM_H */