1 | // Specific definitions for GNU/Linux -*- C++ -*- |
2 | |
3 | // Copyright (C) 2000-2024 Free Software Foundation, Inc. |
4 | // |
5 | // This file is part of the GNU ISO C++ Library. This library is free |
6 | // software; you can redistribute it and/or modify it under the |
7 | // terms of the GNU General Public License as published by the |
8 | // Free Software Foundation; either version 3, or (at your option) |
9 | // any later version. |
10 | |
11 | // This library is distributed in the hope that it will be useful, |
12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | // GNU General Public License for more details. |
15 | |
16 | // Under Section 7 of GPL version 3, you are granted additional |
17 | // permissions described in the GCC Runtime Library Exception, version |
18 | // 3.1, as published by the Free Software Foundation. |
19 | |
20 | // You should have received a copy of the GNU General Public License and |
21 | // a copy of the GCC Runtime Library Exception along with this program; |
22 | // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
23 | // <http://www.gnu.org/licenses/>. |
24 | |
25 | /** @file bits/os_defines.h |
26 | * This is an internal header file, included by other library headers. |
27 | * Do not attempt to use it directly. @headername{iosfwd} |
28 | */ |
29 | |
30 | #ifndef _GLIBCXX_OS_DEFINES |
31 | #define _GLIBCXX_OS_DEFINES 1 |
32 | |
33 | // System-specific #define, typedefs, corrections, etc, go here. This |
34 | // file will come before all others. |
35 | |
36 | // This keeps isalnum, et al from being propagated as macros. |
37 | #define __NO_CTYPE 1 |
38 | |
39 | #include <features.h> |
40 | |
41 | // Provide a declaration for the possibly deprecated gets function, as |
42 | // glibc 2.15 and later does not declare gets for ISO C11 when |
43 | // __GNU_SOURCE is defined. |
44 | #if __GLIBC_PREREQ(2,15) && defined(_GNU_SOURCE) |
45 | # undef _GLIBCXX_HAVE_GETS |
46 | #endif |
47 | |
48 | // Glibc 2.23 removed the obsolete isinf and isnan declarations. Check the |
49 | // version dynamically in case it has changed since libstdc++ was configured. |
50 | #define _GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC __GLIBC_PREREQ(2,23) |
51 | |
52 | // Glibc 2.26 on i?86/x86-64/ia64/ppc64le added *f128 support. |
53 | // Glibc 2.27 added it also on many other arches but those have IEEE quad |
54 | // long double. |
55 | #if __GLIBC_PREREQ(2, 26) \ |
56 | && (defined(__i386__) || defined(__x86_64__) || defined (__ia64__) \ |
57 | || (defined(__powerpc__) && defined(_ARCH_PWR8) \ |
58 | && defined(__LITTLE_ENDIAN__) && (_CALL_ELF == 2) \ |
59 | && defined(__FLOAT128__))) |
60 | # define _GLIBCXX_HAVE_FLOAT128_MATH 1 |
61 | #endif |
62 | |
63 | // Enable __cxa_thread_atexit to rely on a (presumably libc-provided) |
64 | // __cxa_thread_atexit_impl, if it happens to be defined, even if |
65 | // configure couldn't find it during the build. |
66 | #define _GLIBCXX_MAY_HAVE___CXA_THREAD_ATEXIT_IMPL 1 |
67 | |
68 | #ifdef __linux__ |
69 | // The following libpthread properties only apply to Linux, not GNU/Hurd. |
70 | |
71 | # if __GLIBC_PREREQ(2, 27) |
72 | // Since glibc 2.27 pthread_self() is usable without linking to libpthread. |
73 | # define _GLIBCXX_NATIVE_THREAD_ID pthread_self() |
74 | # else |
75 | // Before then it was in libc.so.6 but not libc.a, and always returns 0, |
76 | // which breaks the invariant this_thread::get_id() != thread::id{}. |
77 | // So only use it if we know the libpthread version is available. |
78 | // Otherwise use (__gthread_t)1 as the ID of the main (and only) thread. |
79 | # define _GLIBCXX_NATIVE_THREAD_ID \ |
80 | (__gthread_active_p() ? __gthread_self() : (__gthread_t)1) |
81 | # endif |
82 | |
83 | # if __GLIBC_PREREQ(2, 34) |
84 | // Since glibc 2.34 all pthreads functions are usable without linking to |
85 | // libpthread. |
86 | # define _GLIBCXX_GTHREAD_USE_WEAK 0 |
87 | # endif |
88 | #endif // __linux__ |
89 | |
90 | #endif |
91 | |