@@ -0,0 +1,12 @@ | |||
{ | |||
"type": "tool", | |||
"name": "toolchain-gcc-arm-embedded", | |||
"version": "0.1.0", | |||
"spec": { | |||
"owner": "skepto", | |||
"id": 99999, | |||
"name": "toolchain-gcc-arm-embedded", | |||
"requirements": null, | |||
"url": null | |||
} | |||
} |
@@ -0,0 +1,82 @@ | |||
/* Provide support for both ANSI and non-ANSI environments. */ | |||
/* To get a strict ANSI C environment, define macro __STRICT_ANSI__. This will | |||
"comment out" the non-ANSI parts of the ANSI header files (non-ANSI header | |||
files aren't affected). */ | |||
#ifndef _ANSIDECL_H_ | |||
#define _ANSIDECL_H_ | |||
#include <newlib.h> | |||
#include <sys/config.h> | |||
/* ISO C++. */ | |||
#ifdef __cplusplus | |||
#if !(defined(_BEGIN_STD_C) && defined(_END_STD_C)) | |||
#ifdef _HAVE_STD_CXX | |||
#define _BEGIN_STD_C namespace std { extern "C" { | |||
#define _END_STD_C } } | |||
#else | |||
#define _BEGIN_STD_C extern "C" { | |||
#define _END_STD_C } | |||
#endif | |||
#if __GNUC_PREREQ (3, 3) | |||
#define _NOTHROW __attribute__ ((__nothrow__)) | |||
#else | |||
#define _NOTHROW throw() | |||
#endif | |||
#endif | |||
#else | |||
#define _BEGIN_STD_C | |||
#define _END_STD_C | |||
#define _NOTHROW | |||
#endif | |||
#ifndef _LONG_DOUBLE | |||
#define _LONG_DOUBLE long double | |||
#endif | |||
/* Support gcc's __attribute__ facility. */ | |||
#ifdef __GNUC__ | |||
#define _ATTRIBUTE(attrs) __attribute__ (attrs) | |||
#else | |||
#define _ATTRIBUTE(attrs) | |||
#endif | |||
/* The traditional meaning of 'extern inline' for GCC is not | |||
to emit the function body unless the address is explicitly | |||
taken. However this behaviour is changing to match the C99 | |||
standard, which uses 'extern inline' to indicate that the | |||
function body *must* be emitted. Likewise, a function declared | |||
without either 'extern' or 'static' defaults to extern linkage | |||
(C99 6.2.2p5), and the compiler may choose whether to use the | |||
inline version or call the extern linkage version (6.7.4p6). | |||
If we are using GCC, but do not have the new behaviour, we need | |||
to use extern inline; if we are using a new GCC with the | |||
C99-compatible behaviour, or a non-GCC compiler (which we will | |||
have to hope is C99, since there is no other way to achieve the | |||
effect of omitting the function if it isn't referenced) we use | |||
'static inline', which c99 defines to mean more-or-less the same | |||
as the Gnu C 'extern inline'. */ | |||
#if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__) | |||
/* We're using GCC, but without the new C99-compatible behaviour. */ | |||
#define _ELIDABLE_INLINE extern __inline__ _ATTRIBUTE ((__always_inline__)) | |||
#else | |||
/* We're using GCC in C99 mode, or an unknown compiler which | |||
we just have to hope obeys the C99 semantics of inline. */ | |||
#define _ELIDABLE_INLINE static __inline__ | |||
#endif | |||
#if __GNUC_PREREQ (3, 1) | |||
#define _NOINLINE __attribute__ ((__noinline__)) | |||
#define _NOINLINE_STATIC _NOINLINE static | |||
#else | |||
/* On non-GNU compilers and GCC prior to version 3.1 the compiler can't be | |||
trusted not to inline if it is static. */ | |||
#define _NOINLINE | |||
#define _NOINLINE_STATIC | |||
#endif | |||
#endif /* _ANSIDECL_H_ */ |
@@ -0,0 +1,12 @@ | |||
/* _newlib_version.h. Generated from _newlib_version.hin by configure. */ | |||
/* Version macros for internal and downstream use. */ | |||
#ifndef _NEWLIB_VERSION_H__ | |||
#define _NEWLIB_VERSION_H__ 1 | |||
#define _NEWLIB_VERSION "3.3.0" | |||
#define __NEWLIB__ 3 | |||
#define __NEWLIB_MINOR__ 3 | |||
#define __NEWLIB_PATCHLEVEL__ 0 | |||
#endif /* !_NEWLIB_VERSION_H__ */ | |||
@@ -0,0 +1,40 @@ | |||
/* internal use only -- mapping of "system calls" for libraries that lose | |||
and only provide C names, so that we end up in violation of ANSI */ | |||
#ifndef __SYSLIST_H | |||
#define __SYSLIST_H | |||
#ifdef MISSING_SYSCALL_NAMES | |||
#define _close close | |||
#define _execve execve | |||
#define _fcntl fcntl | |||
#define _fork fork | |||
#define _fstat fstat | |||
#define _getpid getpid | |||
#define _gettimeofday gettimeofday | |||
#define _isatty isatty | |||
#define _kill kill | |||
#define _link link | |||
#define _lseek lseek | |||
#define _mkdir mkdir | |||
#define _open open | |||
#define _read read | |||
#define _sbrk sbrk | |||
#define _stat stat | |||
#define _times times | |||
#define _unlink unlink | |||
#define _wait wait | |||
#define _write write | |||
#endif /* MISSING_SYSCALL_NAMES */ | |||
#if defined MISSING_SYSCALL_NAMES || !defined HAVE_OPENDIR | |||
/* If the system call interface is missing opendir, readdir, and | |||
closedir, there is an implementation of these functions in | |||
libc/posix that is implemented using open, getdents, and close. | |||
Note, these functions are currently not in the libc/syscalls | |||
directory. */ | |||
#define _opendir opendir | |||
#define _readdir readdir | |||
#define _closedir closedir | |||
#endif /* MISSING_SYSCALL_NAMES || !HAVE_OPENDIR */ | |||
#endif /* !__SYSLIST_H_ */ |
@@ -0,0 +1,21 @@ | |||
/* libc/include/alloca.h - Allocate memory on stack */ | |||
/* Written 2000 by Werner Almesberger */ | |||
/* Rearranged for general inclusion by stdlib.h. | |||
2001, Corinna Vinschen <vinschen@redhat.com> */ | |||
#ifndef _NEWLIB_ALLOCA_H | |||
#define _NEWLIB_ALLOCA_H | |||
#include "_ansi.h" | |||
#include <sys/reent.h> | |||
#undef alloca | |||
#ifdef __GNUC__ | |||
#define alloca(size) __builtin_alloca(size) | |||
#else | |||
void * alloca (size_t); | |||
#endif | |||
#endif |
@@ -0,0 +1,69 @@ | |||
/* $NetBSD: ar.h,v 1.4 1994/10/26 00:55:43 cgd Exp $ */ | |||
/*- | |||
* Copyright (c) 1991, 1993 | |||
* The Regents of the University of California. All rights reserved. | |||
* (c) UNIX System Laboratories, Inc. | |||
* All or some portions of this file are derived from material licensed | |||
* to the University of California by American Telephone and Telegraph | |||
* Co. or Unix System Laboratories, Inc. and are reproduced herein with | |||
* the permission of UNIX System Laboratories, Inc. | |||
* | |||
* This code is derived from software contributed to Berkeley by | |||
* Hugh Smith at The University of Guelph. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in the | |||
* documentation and/or other materials provided with the distribution. | |||
* 3. All advertising materials mentioning features or use of this software | |||
* must display the following acknowledgement: | |||
* This product includes software developed by the University of | |||
* California, Berkeley and its contributors. | |||
* 4. Neither the name of the University nor the names of its contributors | |||
* may be used to endorse or promote products derived from this software | |||
* without specific prior written permission. | |||
* | |||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* | |||
* @(#)ar.h 8.2 (Berkeley) 1/21/94 | |||
*/ | |||
#ifndef _AR_H_ | |||
#define _AR_H_ | |||
/* Pre-4BSD archives had these magic numbers in them. */ | |||
#define OARMAG1 0177555 | |||
#define OARMAG2 0177545 | |||
#define ARMAG "!<arch>\n" /* ar "magic number" */ | |||
#define SARMAG 8 /* strlen(ARMAG); */ | |||
#define AR_EFMT1 "#1/" /* extended format #1 */ | |||
struct ar_hdr { | |||
char ar_name[16]; /* name */ | |||
char ar_date[12]; /* modification time */ | |||
char ar_uid[6]; /* user id */ | |||
char ar_gid[6]; /* group id */ | |||
char ar_mode[8]; /* octal file permissions */ | |||
char ar_size[10]; /* size in bytes */ | |||
#define ARFMAG "`\n" | |||
char ar_fmag[2]; /* consistency check */ | |||
}; | |||
#endif /* !_AR_H_ */ |
@@ -0,0 +1,33 @@ | |||
/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. | |||
* | |||
* Permission to use, copy, modify, and distribute this software | |||
* is freely granted, provided that this notice is preserved. | |||
*/ | |||
#ifndef _ARGZ_H_ | |||
#define _ARGZ_H_ | |||
#include <errno.h> | |||
#include <sys/types.h> | |||
#include "_ansi.h" | |||
_BEGIN_STD_C | |||
/* The newlib implementation of these functions assumes that sizeof(char) == 1. */ | |||
error_t argz_create (char *const argv[], char **argz, size_t *argz_len); | |||
error_t argz_create_sep (const char *string, int sep, char **argz, size_t *argz_len); | |||
size_t argz_count (const char *argz, size_t argz_len); | |||
void argz_extract (char *argz, size_t argz_len, char **argv); | |||
void argz_stringify (char *argz, size_t argz_len, int sep); | |||
error_t argz_add (char **argz, size_t *argz_len, const char *str); | |||
error_t argz_add_sep (char **argz, size_t *argz_len, const char *str, int sep); | |||
error_t argz_append (char **argz, size_t *argz_len, const char *buf, size_t buf_len); | |||
error_t argz_delete (char **argz, size_t *argz_len, char *entry); | |||
error_t argz_insert (char **argz, size_t *argz_len, char *before, const char *entry); | |||
char * argz_next (char *argz, size_t argz_len, const char *entry); | |||
error_t argz_replace (char **argz, size_t *argz_len, const char *str, const char *with, unsigned *replace_count); | |||
_END_STD_C | |||
#endif /* _ARGZ_H_ */ |
@@ -0,0 +1,50 @@ | |||
/* | |||
assert.h | |||
*/ | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
#include "_ansi.h" | |||
#undef assert | |||
#ifdef NDEBUG /* required by ANSI standard */ | |||
# define assert(__e) ((void)0) | |||
#else | |||
# define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \ | |||
__ASSERT_FUNC, #__e)) | |||
# ifndef __ASSERT_FUNC | |||
/* Use g++'s demangled names in C++. */ | |||
# if defined __cplusplus && defined __GNUC__ | |||
# define __ASSERT_FUNC __PRETTY_FUNCTION__ | |||
/* C99 requires the use of __func__. */ | |||
# elif __STDC_VERSION__ >= 199901L | |||
# define __ASSERT_FUNC __func__ | |||
/* Older versions of gcc don't have __func__ but can use __FUNCTION__. */ | |||
# elif __GNUC__ >= 2 | |||
# define __ASSERT_FUNC __FUNCTION__ | |||
/* failed to detect __func__ support. */ | |||
# else | |||
# define __ASSERT_FUNC ((char *) 0) | |||
# endif | |||
# endif /* !__ASSERT_FUNC */ | |||
#endif /* !NDEBUG */ | |||
void __assert (const char *, int, const char *) | |||
_ATTRIBUTE ((__noreturn__)); | |||
void __assert_func (const char *, int, const char *, const char *) | |||
_ATTRIBUTE ((__noreturn__)); | |||
#if __STDC_VERSION__ >= 201112L && !defined __cplusplus | |||
# define static_assert _Static_assert | |||
#endif | |||
#ifdef __cplusplus | |||
} | |||
#endif |
@@ -0,0 +1,86 @@ | |||
// <algorithm> -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/* | |||
* | |||
* Copyright (c) 1994 | |||
* Hewlett-Packard Company | |||
* | |||
* Permission to use, copy, modify, distribute and sell this software | |||
* and its documentation for any purpose is hereby granted without fee, | |||
* provided that the above copyright notice appear in all copies and | |||
* that both that copyright notice and this permission notice appear | |||
* in supporting documentation. Hewlett-Packard Company makes no | |||
* representations about the suitability of this software for any | |||
* purpose. It is provided "as is" without express or implied warranty. | |||
* | |||
* | |||
* Copyright (c) 1996,1997 | |||
* Silicon Graphics Computer Systems, Inc. | |||
* | |||
* Permission to use, copy, modify, distribute and sell this software | |||
* and its documentation for any purpose is hereby granted without fee, | |||
* provided that the above copyright notice appear in all copies and | |||
* that both that copyright notice and this permission notice appear | |||
* in supporting documentation. Silicon Graphics makes no | |||
* representations about the suitability of this software for any | |||
* purpose. It is provided "as is" without express or implied warranty. | |||
*/ | |||
/** @file include/algorithm | |||
* This is a Standard C++ Library header. | |||
*/ | |||
#ifndef _GLIBCXX_ALGORITHM | |||
#define _GLIBCXX_ALGORITHM 1 | |||
#pragma GCC system_header | |||
#include <utility> // UK-300. | |||
#include <bits/stl_algobase.h> | |||
#include <bits/stl_algo.h> | |||
#if __cplusplus > 201703L | |||
# include <bits/ranges_algo.h> | |||
#endif | |||
#if __cplusplus > 201402L | |||
// Parallel STL algorithms | |||
# if _PSTL_EXECUTION_POLICIES_DEFINED | |||
// If <execution> has already been included, pull in implementations | |||
# include <pstl/glue_algorithm_impl.h> | |||
# else | |||
// Otherwise just pull in forward declarations | |||
# include <pstl/glue_algorithm_defs.h> | |||
# define _PSTL_ALGORITHM_FORWARD_DECLARED 1 | |||
# endif | |||
// Feature test macro for parallel algorithms | |||
# define __cpp_lib_parallel_algorithm 201603L | |||
#endif // C++17 | |||
#ifdef _GLIBCXX_PARALLEL | |||
# include <parallel/algorithm> | |||
#endif | |||
#endif /* _GLIBCXX_ALGORITHM */ |
@@ -0,0 +1,636 @@ | |||
// <any> -*- C++ -*- | |||
// Copyright (C) 2014-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file include/any | |||
* This is a Standard C++ Library header. | |||
*/ | |||
#ifndef _GLIBCXX_ANY | |||
#define _GLIBCXX_ANY 1 | |||
#pragma GCC system_header | |||
#if __cplusplus >= 201703L | |||
#include <typeinfo> | |||
#include <new> | |||
#include <utility> | |||
#include <type_traits> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
/** | |||
* @addtogroup utilities | |||
* @{ | |||
*/ | |||
/** | |||
* @brief Exception class thrown by a failed @c any_cast | |||
* @ingroup exceptions | |||
*/ | |||
class bad_any_cast : public bad_cast | |||
{ | |||
public: | |||
virtual const char* what() const noexcept { return "bad any_cast"; } | |||
}; | |||
[[gnu::noreturn]] inline void __throw_bad_any_cast() | |||
{ | |||
#if __cpp_exceptions | |||
throw bad_any_cast{}; | |||
#else | |||
__builtin_abort(); | |||
#endif | |||
} | |||
#define __cpp_lib_any 201606L | |||
/** | |||
* @brief A type-safe container of any type. | |||
* | |||
* An @c any object's state is either empty or it stores a contained object | |||
* of CopyConstructible type. | |||
*/ | |||
class any | |||
{ | |||
// Holds either pointer to a heap object or the contained object itself. | |||
union _Storage | |||
{ | |||
constexpr _Storage() : _M_ptr{nullptr} {} | |||
// Prevent trivial copies of this type, buffer might hold a non-POD. | |||
_Storage(const _Storage&) = delete; | |||
_Storage& operator=(const _Storage&) = delete; | |||
void* _M_ptr; | |||
aligned_storage<sizeof(_M_ptr), alignof(void*)>::type _M_buffer; | |||
}; | |||
template<typename _Tp, typename _Safe = is_nothrow_move_constructible<_Tp>, | |||
bool _Fits = (sizeof(_Tp) <= sizeof(_Storage)) | |||
&& (alignof(_Tp) <= alignof(_Storage))> | |||
using _Internal = std::integral_constant<bool, _Safe::value && _Fits>; | |||
template<typename _Tp> | |||
struct _Manager_internal; // uses small-object optimization | |||
template<typename _Tp> | |||
struct _Manager_external; // creates contained object on the heap | |||
template<typename _Tp> | |||
using _Manager = conditional_t<_Internal<_Tp>::value, | |||
_Manager_internal<_Tp>, | |||
_Manager_external<_Tp>>; | |||
template<typename _Tp, typename _VTp = decay_t<_Tp>> | |||
using _Decay_if_not_any = enable_if_t<!is_same_v<_VTp, any>, _VTp>; | |||
/// Emplace with an object created from @p __args as the contained object. | |||
template <typename _Tp, typename... _Args, | |||
typename _Mgr = _Manager<_Tp>> | |||
void __do_emplace(_Args&&... __args) | |||
{ | |||
reset(); | |||
_Mgr::_S_create(_M_storage, std::forward<_Args>(__args)...); | |||
_M_manager = &_Mgr::_S_manage; | |||
} | |||
/// Emplace with an object created from @p __il and @p __args as | |||
/// the contained object. | |||
template <typename _Tp, typename _Up, typename... _Args, | |||
typename _Mgr = _Manager<_Tp>> | |||
void __do_emplace(initializer_list<_Up> __il, _Args&&... __args) | |||
{ | |||
reset(); | |||
_Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...); | |||
_M_manager = &_Mgr::_S_manage; | |||
} | |||
template <typename _Res, typename _Tp, typename... _Args> | |||
using __any_constructible | |||
= enable_if<__and_<is_copy_constructible<_Tp>, | |||
is_constructible<_Tp, _Args...>>::value, | |||
_Res>; | |||
template <typename _Tp, typename... _Args> | |||
using __any_constructible_t | |||
= typename __any_constructible<bool, _Tp, _Args...>::type; | |||
template<typename _VTp, typename... _Args> | |||
using __emplace_t | |||
= typename __any_constructible<_VTp&, _VTp, _Args...>::type; | |||
public: | |||
// construct/destruct | |||
/// Default constructor, creates an empty object. | |||
constexpr any() noexcept : _M_manager(nullptr) { } | |||
/// Copy constructor, copies the state of @p __other | |||
any(const any& __other) | |||
{ | |||
if (!__other.has_value()) | |||
_M_manager = nullptr; | |||
else | |||
{ | |||
_Arg __arg; | |||
__arg._M_any = this; | |||
__other._M_manager(_Op_clone, &__other, &__arg); | |||
} | |||
} | |||
/** | |||
* @brief Move constructor, transfer the state from @p __other | |||
* | |||
* @post @c !__other.has_value() (this postcondition is a GNU extension) | |||
*/ | |||
any(any&& __other) noexcept | |||
{ | |||
if (!__other.has_value()) | |||
_M_manager = nullptr; | |||
else | |||
{ | |||
_Arg __arg; | |||
__arg._M_any = this; | |||
__other._M_manager(_Op_xfer, &__other, &__arg); | |||
} | |||
} | |||
/// Construct with a copy of @p __value as the contained object. | |||
template <typename _Tp, typename _VTp = _Decay_if_not_any<_Tp>, | |||
typename _Mgr = _Manager<_VTp>, | |||
enable_if_t<is_copy_constructible<_VTp>::value | |||
&& !__is_in_place_type<_VTp>::value, bool> = true> | |||
any(_Tp&& __value) | |||
: _M_manager(&_Mgr::_S_manage) | |||
{ | |||
_Mgr::_S_create(_M_storage, std::forward<_Tp>(__value)); | |||
} | |||
/// Construct with an object created from @p __args as the contained object. | |||
template <typename _Tp, typename... _Args, typename _VTp = decay_t<_Tp>, | |||
typename _Mgr = _Manager<_VTp>, | |||
__any_constructible_t<_VTp, _Args&&...> = false> | |||
explicit | |||
any(in_place_type_t<_Tp>, _Args&&... __args) | |||
: _M_manager(&_Mgr::_S_manage) | |||
{ | |||
_Mgr::_S_create(_M_storage, std::forward<_Args>(__args)...); | |||
} | |||
/// Construct with an object created from @p __il and @p __args as | |||
/// the contained object. | |||
template <typename _Tp, typename _Up, typename... _Args, | |||
typename _VTp = decay_t<_Tp>, typename _Mgr = _Manager<_VTp>, | |||
__any_constructible_t<_VTp, initializer_list<_Up>, | |||
_Args&&...> = false> | |||
explicit | |||
any(in_place_type_t<_Tp>, initializer_list<_Up> __il, _Args&&... __args) | |||
: _M_manager(&_Mgr::_S_manage) | |||
{ | |||
_Mgr::_S_create(_M_storage, __il, std::forward<_Args>(__args)...); | |||
} | |||
/// Destructor, calls @c reset() | |||
~any() { reset(); } | |||
// assignments | |||
/// Copy the state of another object. | |||
any& | |||
operator=(const any& __rhs) | |||
{ | |||
*this = any(__rhs); | |||
return *this; | |||
} | |||
/** | |||
* @brief Move assignment operator | |||
* | |||
* @post @c !__rhs.has_value() (not guaranteed for other implementations) | |||
*/ | |||
any& | |||
operator=(any&& __rhs) noexcept | |||
{ | |||
if (!__rhs.has_value()) | |||
reset(); | |||
else if (this != &__rhs) | |||
{ | |||
reset(); | |||
_Arg __arg; | |||
__arg._M_any = this; | |||
__rhs._M_manager(_Op_xfer, &__rhs, &__arg); | |||
} | |||
return *this; | |||
} | |||
/// Store a copy of @p __rhs as the contained object. | |||
template<typename _Tp> | |||
enable_if_t<is_copy_constructible<_Decay_if_not_any<_Tp>>::value, any&> | |||
operator=(_Tp&& __rhs) | |||
{ | |||
*this = any(std::forward<_Tp>(__rhs)); | |||
return *this; | |||
} | |||
/// Emplace with an object created from @p __args as the contained object. | |||
template <typename _Tp, typename... _Args> | |||
__emplace_t<decay_t<_Tp>, _Args...> | |||
emplace(_Args&&... __args) | |||
{ | |||
using _VTp = decay_t<_Tp>; | |||
__do_emplace<_VTp>(std::forward<_Args>(__args)...); | |||
any::_Arg __arg; | |||
this->_M_manager(any::_Op_access, this, &__arg); | |||
return *static_cast<_VTp*>(__arg._M_obj); | |||
} | |||
/// Emplace with an object created from @p __il and @p __args as | |||
/// the contained object. | |||
template <typename _Tp, typename _Up, typename... _Args> | |||
__emplace_t<decay_t<_Tp>, initializer_list<_Up>, _Args&&...> | |||
emplace(initializer_list<_Up> __il, _Args&&... __args) | |||
{ | |||
using _VTp = decay_t<_Tp>; | |||
__do_emplace<_VTp, _Up>(__il, std::forward<_Args>(__args)...); | |||
any::_Arg __arg; | |||
this->_M_manager(any::_Op_access, this, &__arg); | |||
return *static_cast<_VTp*>(__arg._M_obj); | |||
} | |||
// modifiers | |||
/// If not empty, destroy the contained object. | |||
void reset() noexcept | |||
{ | |||
if (has_value()) | |||
{ | |||
_M_manager(_Op_destroy, this, nullptr); | |||
_M_manager = nullptr; | |||
} | |||
} | |||
/// Exchange state with another object. | |||
void swap(any& __rhs) noexcept | |||
{ | |||
if (!has_value() && !__rhs.has_value()) | |||
return; | |||
if (has_value() && __rhs.has_value()) | |||
{ | |||
if (this == &__rhs) | |||
return; | |||
any __tmp; | |||
_Arg __arg; | |||
__arg._M_any = &__tmp; | |||
__rhs._M_manager(_Op_xfer, &__rhs, &__arg); | |||
__arg._M_any = &__rhs; | |||
_M_manager(_Op_xfer, this, &__arg); | |||
__arg._M_any = this; | |||
__tmp._M_manager(_Op_xfer, &__tmp, &__arg); | |||
} | |||
else | |||
{ | |||
any* __empty = !has_value() ? this : &__rhs; | |||
any* __full = !has_value() ? &__rhs : this; | |||
_Arg __arg; | |||
__arg._M_any = __empty; | |||
__full->_M_manager(_Op_xfer, __full, &__arg); | |||
} | |||
} | |||
// observers | |||
/// Reports whether there is a contained object or not. | |||
bool has_value() const noexcept { return _M_manager != nullptr; } | |||
#if __cpp_rtti | |||
/// The @c typeid of the contained object, or @c typeid(void) if empty. | |||
const type_info& type() const noexcept | |||
{ | |||
if (!has_value()) | |||
return typeid(void); | |||
_Arg __arg; | |||
_M_manager(_Op_get_type_info, this, &__arg); | |||
return *__arg._M_typeinfo; | |||
} | |||
#endif | |||
template<typename _Tp> | |||
static constexpr bool __is_valid_cast() | |||
{ return __or_<is_reference<_Tp>, is_copy_constructible<_Tp>>::value; } | |||
private: | |||
enum _Op { | |||
_Op_access, _Op_get_type_info, _Op_clone, _Op_destroy, _Op_xfer | |||
}; | |||
union _Arg | |||
{ | |||
void* _M_obj; | |||
const std::type_info* _M_typeinfo; | |||
any* _M_any; | |||
}; | |||
void (*_M_manager)(_Op, const any*, _Arg*); | |||
_Storage _M_storage; | |||
template<typename _Tp> | |||
friend void* __any_caster(const any* __any); | |||
// Manage in-place contained object. | |||
template<typename _Tp> | |||
struct _Manager_internal | |||
{ | |||
static void | |||
_S_manage(_Op __which, const any* __anyp, _Arg* __arg); | |||
template<typename _Up> | |||
static void | |||
_S_create(_Storage& __storage, _Up&& __value) | |||
{ | |||
void* __addr = &__storage._M_buffer; | |||
::new (__addr) _Tp(std::forward<_Up>(__value)); | |||
} | |||
template<typename... _Args> | |||
static void | |||
_S_create(_Storage& __storage, _Args&&... __args) | |||
{ | |||
void* __addr = &__storage._M_buffer; | |||
::new (__addr) _Tp(std::forward<_Args>(__args)...); | |||
} | |||
}; | |||
// Manage external contained object. | |||
template<typename _Tp> | |||
struct _Manager_external | |||
{ | |||
static void | |||
_S_manage(_Op __which, const any* __anyp, _Arg* __arg); | |||
template<typename _Up> | |||
static void | |||
_S_create(_Storage& __storage, _Up&& __value) | |||
{ | |||
__storage._M_ptr = new _Tp(std::forward<_Up>(__value)); | |||
} | |||
template<typename... _Args> | |||
static void | |||
_S_create(_Storage& __storage, _Args&&... __args) | |||
{ | |||
__storage._M_ptr = new _Tp(std::forward<_Args>(__args)...); | |||
} | |||
}; | |||
}; | |||
/// Exchange the states of two @c any objects. | |||
inline void swap(any& __x, any& __y) noexcept { __x.swap(__y); } | |||
/// Create an any holding a @c _Tp constructed from @c __args. | |||
template <typename _Tp, typename... _Args> | |||
any make_any(_Args&&... __args) | |||
{ | |||
return any(in_place_type<_Tp>, std::forward<_Args>(__args)...); | |||
} | |||
/// Create an any holding a @c _Tp constructed from @c __il and @c __args. | |||
template <typename _Tp, typename _Up, typename... _Args> | |||
any make_any(initializer_list<_Up> __il, _Args&&... __args) | |||
{ | |||
return any(in_place_type<_Tp>, __il, std::forward<_Args>(__args)...); | |||
} | |||
/** | |||
* @brief Access the contained object. | |||
* | |||
* @tparam _ValueType A const-reference or CopyConstructible type. | |||
* @param __any The object to access. | |||
* @return The contained object. | |||
* @throw bad_any_cast If <code> | |||
* __any.type() != typeid(remove_reference_t<_ValueType>) | |||
* </code> | |||
*/ | |||
template<typename _ValueType> | |||
inline _ValueType any_cast(const any& __any) | |||
{ | |||
using _Up = __remove_cvref_t<_ValueType>; | |||
static_assert(any::__is_valid_cast<_ValueType>(), | |||
"Template argument must be a reference or CopyConstructible type"); | |||
static_assert(is_constructible_v<_ValueType, const _Up&>, | |||
"Template argument must be constructible from a const value."); | |||
auto __p = any_cast<_Up>(&__any); | |||
if (__p) | |||
return static_cast<_ValueType>(*__p); | |||
__throw_bad_any_cast(); | |||
} | |||
/** | |||
* @brief Access the contained object. | |||
* | |||
* @tparam _ValueType A reference or CopyConstructible type. | |||
* @param __any The object to access. | |||
* @return The contained object. | |||
* @throw bad_any_cast If <code> | |||
* __any.type() != typeid(remove_reference_t<_ValueType>) | |||
* </code> | |||
* | |||
* @{ | |||
*/ | |||
template<typename _ValueType> | |||
inline _ValueType any_cast(any& __any) | |||
{ | |||
using _Up = __remove_cvref_t<_ValueType>; | |||
static_assert(any::__is_valid_cast<_ValueType>(), | |||
"Template argument must be a reference or CopyConstructible type"); | |||
static_assert(is_constructible_v<_ValueType, _Up&>, | |||
"Template argument must be constructible from an lvalue."); | |||
auto __p = any_cast<_Up>(&__any); | |||
if (__p) | |||
return static_cast<_ValueType>(*__p); | |||
__throw_bad_any_cast(); | |||
} | |||
template<typename _ValueType> | |||
inline _ValueType any_cast(any&& __any) | |||
{ | |||
using _Up = __remove_cvref_t<_ValueType>; | |||
static_assert(any::__is_valid_cast<_ValueType>(), | |||
"Template argument must be a reference or CopyConstructible type"); | |||
static_assert(is_constructible_v<_ValueType, _Up>, | |||
"Template argument must be constructible from an rvalue."); | |||
auto __p = any_cast<_Up>(&__any); | |||
if (__p) | |||
return static_cast<_ValueType>(std::move(*__p)); | |||
__throw_bad_any_cast(); | |||
} | |||
// @} | |||
/// @cond undocumented | |||
template<typename _Tp> | |||
void* __any_caster(const any* __any) | |||
{ | |||
// any_cast<T> returns non-null if __any->type() == typeid(T) and | |||
// typeid(T) ignores cv-qualifiers so remove them: | |||
using _Up = remove_cv_t<_Tp>; | |||
// The contained value has a decayed type, so if decay_t<U> is not U, | |||
// then it's not possible to have a contained value of type U: | |||
if constexpr (!is_same_v<decay_t<_Up>, _Up>) | |||
return nullptr; | |||
// Only copy constructible types can be used for contained values: | |||
else if constexpr (!is_copy_constructible_v<_Up>) | |||
return nullptr; | |||
// First try comparing function addresses, which works without RTTI | |||
else if (__any->_M_manager == &any::_Manager<_Up>::_S_manage | |||
#if __cpp_rtti | |||
|| __any->type() == typeid(_Tp) | |||
#endif | |||
) | |||
{ | |||
any::_Arg __arg; | |||
__any->_M_manager(any::_Op_access, __any, &__arg); | |||
return __arg._M_obj; | |||
} | |||
return nullptr; | |||
} | |||
/// @endcond | |||
/** | |||
* @brief Access the contained object. | |||
* | |||
* @tparam _ValueType The type of the contained object. | |||
* @param __any A pointer to the object to access. | |||
* @return The address of the contained object if <code> | |||
* __any != nullptr && __any.type() == typeid(_ValueType) | |||
* </code>, otherwise a null pointer. | |||
* | |||
* @{ | |||
*/ | |||
template<typename _ValueType> | |||
inline const _ValueType* any_cast(const any* __any) noexcept | |||
{ | |||
if constexpr (is_object_v<_ValueType>) | |||
if (__any) | |||
return static_cast<_ValueType*>(__any_caster<_ValueType>(__any)); | |||
return nullptr; | |||
} | |||
template<typename _ValueType> | |||
inline _ValueType* any_cast(any* __any) noexcept | |||
{ | |||
if constexpr (is_object_v<_ValueType>) | |||
if (__any) | |||
return static_cast<_ValueType*>(__any_caster<_ValueType>(__any)); | |||
return nullptr; | |||
} | |||
// @} | |||
template<typename _Tp> | |||
void | |||
any::_Manager_internal<_Tp>:: | |||
_S_manage(_Op __which, const any* __any, _Arg* __arg) | |||
{ | |||
// The contained object is in _M_storage._M_buffer | |||
auto __ptr = reinterpret_cast<const _Tp*>(&__any->_M_storage._M_buffer); | |||
switch (__which) | |||
{ | |||
case _Op_access: | |||
__arg->_M_obj = const_cast<_Tp*>(__ptr); | |||
break; | |||
case _Op_get_type_info: | |||
#if __cpp_rtti | |||
__arg->_M_typeinfo = &typeid(_Tp); | |||
#endif | |||
break; | |||
case _Op_clone: | |||
::new(&__arg->_M_any->_M_storage._M_buffer) _Tp(*__ptr); | |||
__arg->_M_any->_M_manager = __any->_M_manager; | |||
break; | |||
case _Op_destroy: | |||
__ptr->~_Tp(); | |||
break; | |||
case _Op_xfer: | |||
::new(&__arg->_M_any->_M_storage._M_buffer) _Tp | |||
(std::move(*const_cast<_Tp*>(__ptr))); | |||
__ptr->~_Tp(); | |||
__arg->_M_any->_M_manager = __any->_M_manager; | |||
const_cast<any*>(__any)->_M_manager = nullptr; | |||
break; | |||
} | |||
} | |||
template<typename _Tp> | |||
void | |||
any::_Manager_external<_Tp>:: | |||
_S_manage(_Op __which, const any* __any, _Arg* __arg) | |||
{ | |||
// The contained object is *_M_storage._M_ptr | |||
auto __ptr = static_cast<const _Tp*>(__any->_M_storage._M_ptr); | |||
switch (__which) | |||
{ | |||
case _Op_access: | |||
__arg->_M_obj = const_cast<_Tp*>(__ptr); | |||
break; | |||
case _Op_get_type_info: | |||
#if __cpp_rtti | |||
__arg->_M_typeinfo = &typeid(_Tp); | |||
#endif | |||
break; | |||
case _Op_clone: | |||
__arg->_M_any->_M_storage._M_ptr = new _Tp(*__ptr); | |||
__arg->_M_any->_M_manager = __any->_M_manager; | |||
break; | |||
case _Op_destroy: | |||
delete __ptr; | |||
break; | |||
case _Op_xfer: | |||
__arg->_M_any->_M_storage._M_ptr = __any->_M_storage._M_ptr; | |||
__arg->_M_any->_M_manager = __any->_M_manager; | |||
const_cast<any*>(__any)->_M_manager = nullptr; | |||
break; | |||
} | |||
} | |||
/// @} | |||
namespace __detail::__variant | |||
{ | |||
template<typename> struct _Never_valueless_alt; // see <variant> | |||
// Provide the strong exception-safety guarantee when emplacing an | |||
// any into a variant. | |||
template<> | |||
struct _Never_valueless_alt<std::any> | |||
: std::true_type | |||
{ }; | |||
} // namespace __detail::__variant | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace std | |||
#endif // C++17 | |||
#endif // _GLIBCXX_ANY |
@@ -0,0 +1,40 @@ | |||
// Low-level type for atomic operations -*- C++ -*- | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file atomic_word.h | |||
* This file is a GNU extension to the Standard C++ Library. | |||
*/ | |||
#ifndef _GLIBCXX_ATOMIC_WORD_H | |||
#define _GLIBCXX_ATOMIC_WORD_H 1 | |||
typedef int _Atomic_word; | |||
// This is a memory order acquire fence. | |||
#define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE) | |||
// This is a memory order release fence. | |||
#define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE) | |||
#endif |
@@ -0,0 +1,135 @@ | |||
// Wrapper of C-language FILE struct -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
// | |||
// ISO C++ 14882: 27.8 File-based streams | |||
// | |||
/** @file bits/basic_file.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ios} | |||
*/ | |||
#ifndef _GLIBCXX_BASIC_FILE_STDIO_H | |||
#define _GLIBCXX_BASIC_FILE_STDIO_H 1 | |||
#pragma GCC system_header | |||
#include <bits/c++config.h> | |||
#include <bits/c++io.h> // for __c_lock and __c_file | |||
#include <bits/move.h> // for swap | |||
#include <ios> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
// Generic declaration. | |||
template<typename _CharT> | |||
class __basic_file; | |||
// Specialization. | |||
template<> | |||
class __basic_file<char> | |||
{ | |||
// Underlying data source/sink. | |||
__c_file* _M_cfile; | |||
// True iff we opened _M_cfile, and thus must close it ourselves. | |||
bool _M_cfile_created; | |||
public: | |||
__basic_file(__c_lock* __lock = 0) throw (); | |||
#if __cplusplus >= 201103L | |||
__basic_file(__basic_file&& __rv, __c_lock* = 0) noexcept | |||
: _M_cfile(__rv._M_cfile), _M_cfile_created(__rv._M_cfile_created) | |||
{ | |||
__rv._M_cfile = nullptr; | |||
__rv._M_cfile_created = false; | |||
} | |||
__basic_file& operator=(const __basic_file&) = delete; | |||
__basic_file& operator=(__basic_file&&) = delete; | |||
void | |||
swap(__basic_file& __f) noexcept | |||
{ | |||
std::swap(_M_cfile, __f._M_cfile); | |||
std::swap(_M_cfile_created, __f._M_cfile_created); | |||
} | |||
#endif | |||
__basic_file* | |||
open(const char* __name, ios_base::openmode __mode, int __prot = 0664); | |||
#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T | |||
__basic_file* | |||
open(const wchar_t* __name, ios_base::openmode __mode); | |||
#endif | |||
__basic_file* | |||
sys_open(__c_file* __file, ios_base::openmode); | |||
__basic_file* | |||
sys_open(int __fd, ios_base::openmode __mode) throw (); | |||
__basic_file* | |||
close(); | |||
_GLIBCXX_PURE bool | |||
is_open() const throw (); | |||
_GLIBCXX_PURE int | |||
fd() throw (); | |||
_GLIBCXX_PURE __c_file* | |||
file() throw (); | |||
~__basic_file(); | |||
streamsize | |||
xsputn(const char* __s, streamsize __n); | |||
streamsize | |||
xsputn_2(const char* __s1, streamsize __n1, | |||
const char* __s2, streamsize __n2); | |||
streamsize | |||
xsgetn(char* __s, streamsize __n); | |||
streamoff | |||
seekoff(streamoff __off, ios_base::seekdir __way) throw (); | |||
int | |||
sync(); | |||
streamsize | |||
showmanyc(); | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,59 @@ | |||
// Base to std::allocator -*- C++ -*- | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++allocator.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{memory} | |||
*/ | |||
#ifndef _GLIBCXX_CXX_ALLOCATOR_H | |||
#define _GLIBCXX_CXX_ALLOCATOR_H 1 | |||
#include <ext/new_allocator.h> | |||
#if __cplusplus >= 201103L | |||
namespace std | |||
{ | |||
/** | |||
* @brief An alias to the base class for std::allocator. | |||
* | |||
* Used to set the std::allocator base class to | |||
* __gnu_cxx::new_allocator. | |||
* | |||
* @ingroup allocators | |||
* @tparam _Tp Type of allocated object. | |||
*/ | |||
template<typename _Tp> | |||
using __allocator_base = __gnu_cxx::new_allocator<_Tp>; | |||
} | |||
#else | |||
// Define new_allocator as the base class to std::allocator. | |||
# define __allocator_base __gnu_cxx::new_allocator | |||
#endif | |||
#if defined(__SANITIZE_ADDRESS__) && !defined(_GLIBCXX_SANITIZE_STD_ALLOCATOR) | |||
# define _GLIBCXX_SANITIZE_STD_ALLOCATOR 1 | |||
#endif | |||
#endif |
@@ -0,0 +1,50 @@ | |||
// Underlying io library details -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++io.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ios} | |||
*/ | |||
// c_io_stdio.h - Defines for using "C" stdio.h | |||
#ifndef _GLIBCXX_CXX_IO_H | |||
#define _GLIBCXX_CXX_IO_H 1 | |||
#include <cstdio> | |||
#include <bits/gthr.h> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
typedef __gthread_mutex_t __c_lock; | |||
// for basic_file.h | |||
typedef FILE __c_file; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,92 @@ | |||
// Wrapper for underlying C-language localization -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++locale.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.8 Standard locale categories. | |||
// | |||
// Written by Benjamin Kosnik <bkoz@redhat.com> | |||
#ifndef _GLIBCXX_CXX_LOCALE_H | |||
#define _GLIBCXX_CXX_LOCALE_H 1 | |||
#pragma GCC system_header | |||
#include <clocale> | |||
#define _GLIBCXX_NUM_CATEGORIES 0 | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
typedef int* __c_locale; | |||
// Convert numeric value of type double and long double to string and | |||
// return length of string. If vsnprintf is available use it, otherwise | |||
// fall back to the unsafe vsprintf which, in general, can be dangerous | |||
// and should be avoided. | |||
inline int | |||
__convert_from_v(const __c_locale&, char* __out, | |||
const int __size __attribute__((__unused__)), | |||
const char* __fmt, ...) | |||
{ | |||
char* __old = std::setlocale(LC_NUMERIC, 0); | |||
char* __sav = 0; | |||
if (__builtin_strcmp(__old, "C")) | |||
{ | |||
const size_t __len = __builtin_strlen(__old) + 1; | |||
__sav = new char[__len]; | |||
__builtin_memcpy(__sav, __old, __len); | |||
std::setlocale(LC_NUMERIC, "C"); | |||
} | |||
__builtin_va_list __args; | |||
__builtin_va_start(__args, __fmt); | |||
#if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF | |||
const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); | |||
#else | |||
const int __ret = __builtin_vsprintf(__out, __fmt, __args); | |||
#endif | |||
__builtin_va_end(__args); | |||
if (__sav) | |||
{ | |||
std::setlocale(LC_NUMERIC, __sav); | |||
delete [] __sav; | |||
} | |||
return __ret; | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,40 @@ | |||
// Specific definitions for generic platforms -*- C++ -*- | |||
// Copyright (C) 2015-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/cpu_defines.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{iosfwd} | |||
*/ | |||
#ifndef _GLIBCXX_CPU_DEFINES | |||
#define _GLIBCXX_CPU_DEFINES 1 | |||
// Integer divide instructions don't trap on ARM. | |||
#ifdef __ARM_ARCH_EXT_IDIV__ | |||
#define __glibcxx_integral_traps false | |||
#else | |||
#define __glibcxx_integral_traps true | |||
#endif | |||
#endif |
@@ -0,0 +1,61 @@ | |||
// Locale support -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
// | |||
// ISO C++ 14882: 22.1 Locales | |||
// | |||
// Information as gleaned from /usr/include/ctype.h | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
/// @brief Base class for ctype. | |||
struct ctype_base | |||
{ | |||
// Non-standard typedefs. | |||
typedef const int* __to_type; | |||
// NB: Offsets into ctype<char>::_M_table force a particular size | |||
// on the mask type. Because of this, we don't use an enum. | |||
typedef char mask; | |||
static const mask upper = _U; | |||
static const mask lower = _L; | |||
static const mask alpha = _U | _L; | |||
static const mask digit = _N; | |||
static const mask xdigit = _X | _N; | |||
static const mask space = _S; | |||
static const mask print = _P | _U | _L | _N | _B; | |||
static const mask graph = _P | _U | _L | _N; | |||
static const mask cntrl = _C; | |||
static const mask punct = _P; | |||
static const mask alnum = _U | _L | _N; | |||
#if __cplusplus >= 201103L | |||
static const mask blank = space; | |||
#endif | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,74 @@ | |||
// Locale support -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/ctype_inline.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.1 Locales | |||
// | |||
// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) | |||
// functions go in ctype.cc | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
bool | |||
ctype<char>:: | |||
is(mask __m, char __c) const | |||
{ return _M_table[static_cast<unsigned char>(__c)] & __m; } | |||
const char* | |||
ctype<char>:: | |||
is(const char* __low, const char* __high, mask* __vec) const | |||
{ | |||
while (__low < __high) | |||
*__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; | |||
return __high; | |||
} | |||
const char* | |||
ctype<char>:: | |||
scan_is(mask __m, const char* __low, const char* __high) const | |||
{ | |||
while (__low < __high && !this->is(__m, *__low)) | |||
++__low; | |||
return __low; | |||
} | |||
const char* | |||
ctype<char>:: | |||
scan_not(mask __m, const char* __low, const char* __high) const | |||
{ | |||
while (__low < __high && this->is(__m, *__low) != 0) | |||
++__low; | |||
return __low; | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,82 @@ | |||
// Control various target specific ABI tweaks. ARM version. | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/cxxabi_tweaks.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{cxxabi.h} | |||
*/ | |||
#ifndef _CXXABI_TWEAKS_H | |||
#define _CXXABI_TWEAKS_H 1 | |||
#ifdef __cplusplus | |||
namespace __cxxabiv1 | |||
{ | |||
extern "C" | |||
{ | |||
#endif | |||
#ifdef __ARM_EABI__ | |||
// The ARM EABI uses the least significant bit of a 32-bit | |||
// guard variable. */ | |||
#define _GLIBCXX_GUARD_TEST(x) ((*(x) & 1) != 0) | |||
#define _GLIBCXX_GUARD_SET(x) *(x) = 1 | |||
#define _GLIBCXX_GUARD_BIT 1 | |||
#define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||
#define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||
typedef int __guard; | |||
// We also want the element size in array cookies. | |||
#define _GLIBCXX_ELTSIZE_IN_COOKIE 1 | |||
// __cxa_vec_ctor should return a pointer to the array. | |||
typedef void * __cxa_vec_ctor_return_type; | |||
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return x | |||
// Constructors and destructors return the "this" pointer. | |||
typedef void * __cxa_cdtor_return_type; | |||
#else // __ARM_EABI__ | |||
// The generic ABI uses the first byte of a 64-bit guard variable. | |||
#define _GLIBCXX_GUARD_TEST(x) (*(char *) (x) != 0) | |||
#define _GLIBCXX_GUARD_SET(x) *(char *) (x) = 1 | |||
#define _GLIBCXX_GUARD_BIT __guard_test_bit (0, 1) | |||
#define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||
#define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||
__extension__ typedef int __guard __attribute__((mode (__DI__))); | |||
// __cxa_vec_ctor has void return type. | |||
typedef void __cxa_vec_ctor_return_type; | |||
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return | |||
// Constructors and destructors do not return a value. | |||
typedef void __cxa_cdtor_return_type; | |||
#endif //!__ARM_EABI__ | |||
#ifdef __cplusplus | |||
} | |||
} // namespace __cxxabiv1 | |||
#endif | |||
#endif |
@@ -0,0 +1,178 @@ | |||
// Specific definitions for generic platforms -*- C++ -*- | |||
// Copyright (C) 2007-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/error_constants.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{system_error} | |||
*/ | |||
#ifndef _GLIBCXX_ERROR_CONSTANTS | |||
#define _GLIBCXX_ERROR_CONSTANTS 1 | |||
#include <bits/c++config.h> | |||
#include <cerrno> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
enum class errc | |||
{ | |||
address_family_not_supported = EAFNOSUPPORT, | |||
address_in_use = EADDRINUSE, | |||
address_not_available = EADDRNOTAVAIL, | |||
already_connected = EISCONN, | |||
argument_list_too_long = E2BIG, | |||
argument_out_of_domain = EDOM, | |||
bad_address = EFAULT, | |||
bad_file_descriptor = EBADF, | |||
#ifdef _GLIBCXX_HAVE_EBADMSG | |||
bad_message = EBADMSG, | |||
#endif | |||
broken_pipe = EPIPE, | |||
connection_aborted = ECONNABORTED, | |||
connection_already_in_progress = EALREADY, | |||
connection_refused = ECONNREFUSED, | |||
connection_reset = ECONNRESET, | |||
cross_device_link = EXDEV, | |||
destination_address_required = EDESTADDRREQ, | |||
device_or_resource_busy = EBUSY, | |||
directory_not_empty = ENOTEMPTY, | |||
executable_format_error = ENOEXEC, | |||
file_exists = EEXIST, | |||
file_too_large = EFBIG, | |||
filename_too_long = ENAMETOOLONG, | |||
function_not_supported = ENOSYS, | |||
host_unreachable = EHOSTUNREACH, | |||
#ifdef _GLIBCXX_HAVE_EIDRM | |||
identifier_removed = EIDRM, | |||
#endif | |||
illegal_byte_sequence = EILSEQ, | |||
inappropriate_io_control_operation = ENOTTY, | |||
interrupted = EINTR, | |||
invalid_argument = EINVAL, | |||
invalid_seek = ESPIPE, | |||
io_error = EIO, | |||
is_a_directory = EISDIR, | |||
message_size = EMSGSIZE, | |||
network_down = ENETDOWN, | |||
network_reset = ENETRESET, | |||
network_unreachable = ENETUNREACH, | |||
no_buffer_space = ENOBUFS, | |||
no_child_process = ECHILD, | |||
#ifdef _GLIBCXX_HAVE_ENOLINK | |||
no_link = ENOLINK, | |||
#endif | |||
no_lock_available = ENOLCK, | |||
#ifdef _GLIBCXX_HAVE_ENODATA | |||
no_message_available = ENODATA, | |||
#endif | |||
no_message = ENOMSG, | |||
no_protocol_option = ENOPROTOOPT, | |||
no_space_on_device = ENOSPC, | |||
#ifdef _GLIBCXX_HAVE_ENOSR | |||
no_stream_resources = ENOSR, | |||
#endif | |||
no_such_device_or_address = ENXIO, | |||
no_such_device = ENODEV, | |||
no_such_file_or_directory = ENOENT, | |||
no_such_process = ESRCH, | |||
not_a_directory = ENOTDIR, | |||
not_a_socket = ENOTSOCK, | |||
#ifdef _GLIBCXX_HAVE_ENOSTR | |||
not_a_stream = ENOSTR, | |||
#endif | |||
not_connected = ENOTCONN, | |||
not_enough_memory = ENOMEM, | |||
#ifdef _GLIBCXX_HAVE_ENOTSUP | |||
not_supported = ENOTSUP, | |||
#endif | |||
#ifdef _GLIBCXX_HAVE_ECANCELED | |||
operation_canceled = ECANCELED, | |||
#endif | |||
operation_in_progress = EINPROGRESS, | |||
operation_not_permitted = EPERM, | |||
operation_not_supported = EOPNOTSUPP, | |||
operation_would_block = EWOULDBLOCK, | |||
#ifdef _GLIBCXX_HAVE_EOWNERDEAD | |||
owner_dead = EOWNERDEAD, | |||
#endif | |||
permission_denied = EACCES, | |||
#ifdef _GLIBCXX_HAVE_EPROTO | |||
protocol_error = EPROTO, | |||
#endif | |||
protocol_not_supported = EPROTONOSUPPORT, | |||
read_only_file_system = EROFS, | |||
resource_deadlock_would_occur = EDEADLK, | |||
resource_unavailable_try_again = EAGAIN, | |||
result_out_of_range = ERANGE, | |||
#ifdef _GLIBCXX_HAVE_ENOTRECOVERABLE | |||
state_not_recoverable = ENOTRECOVERABLE, | |||
#endif | |||
#ifdef _GLIBCXX_HAVE_ETIME | |||
stream_timeout = ETIME, | |||
#endif | |||
#ifdef _GLIBCXX_HAVE_ETXTBSY | |||
text_file_busy = ETXTBSY, | |||
#endif | |||
timed_out = ETIMEDOUT, | |||
too_many_files_open_in_system = ENFILE, | |||
too_many_files_open = EMFILE, | |||
too_many_links = EMLINK, | |||
too_many_symbolic_link_levels = ELOOP, | |||
#ifdef _GLIBCXX_HAVE_EOVERFLOW | |||
value_too_large = EOVERFLOW, | |||
#endif | |||
wrong_protocol_type = EPROTOTYPE | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,83 @@ | |||
// C++ includes used for precompiling extensions -*- C++ -*- | |||
// Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file extc++.h | |||
* This is an implementation file for a precompiled header. | |||
*/ | |||
#if __cplusplus < 201103L | |||
#include <bits/stdtr1c++.h> | |||
#else | |||
#include <bits/stdc++.h> | |||
#endif | |||
#include <ext/algorithm> | |||
#if __cplusplus >= 201103L | |||
# include <ext/aligned_buffer.h> | |||
#endif | |||
#include <ext/alloc_traits.h> | |||
#include <ext/atomicity.h> | |||
#include <ext/bitmap_allocator.h> | |||
#include <ext/cast.h> | |||
#if __cplusplus >= 201103L | |||
# include <ext/cmath> | |||
#endif | |||
#include <ext/concurrence.h> | |||
#include <ext/debug_allocator.h> | |||
#include <ext/extptr_allocator.h> | |||
#include <ext/functional> | |||
#include <ext/iterator> | |||
#include <ext/malloc_allocator.h> | |||
#include <ext/memory> | |||
#include <ext/mt_allocator.h> | |||
#include <ext/new_allocator.h> | |||
#include <ext/numeric> | |||
#include <ext/numeric_traits.h> | |||
#include <ext/pod_char_traits.h> | |||
#include <ext/pointer.h> | |||
#include <ext/pool_allocator.h> | |||
#if __cplusplus >= 201103L | |||
# include <ext/random> | |||
#endif | |||
#include <ext/rb_tree> | |||
#include <ext/rope> | |||
#include <ext/slist> | |||
#include <ext/stdio_filebuf.h> | |||
#include <ext/stdio_sync_filebuf.h> | |||
#include <ext/throw_allocator.h> | |||
#include <ext/typelist.h> | |||
#include <ext/type_traits.h> | |||
#include <ext/vstring.h> | |||
#include <ext/pb_ds/assoc_container.hpp> | |||
#include <ext/pb_ds/priority_queue.hpp> | |||
#include <ext/pb_ds/exception.hpp> | |||
#include <ext/pb_ds/hash_policy.hpp> | |||
#include <ext/pb_ds/list_update_policy.hpp> | |||
#include <ext/pb_ds/tree_policy.hpp> | |||
#include <ext/pb_ds/trie_policy.hpp> | |||
#ifdef _GLIBCXX_HAVE_ICONV | |||
#include <ext/codecvt_specializations.h> | |||
#include <ext/enc_filebuf.h> | |||
#endif |
@@ -0,0 +1,298 @@ | |||
/* Threads compatibility routines for libgcc2 and libobjc. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||
#define _GLIBCXX_GCC_GTHR_SINGLE_H | |||
/* Just provide compatibility for mutex handling. */ | |||
typedef int __gthread_key_t; | |||
typedef int __gthread_once_t; | |||
typedef int __gthread_mutex_t; | |||
typedef int __gthread_recursive_mutex_t; | |||
#define __GTHREAD_ONCE_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||
#define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||
#ifdef _LIBOBJC | |||
/* Thread local storage for a single thread */ | |||
static void *thread_local_storage = NULL; | |||
/* Backend initialization functions */ | |||
/* Initialize the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_init_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Close the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_close_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Backend thread functions */ | |||
/* Create a new thread of execution. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return NULL; | |||
} | |||
/* Set the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Return the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_get_priority (void) | |||
{ | |||
return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||
} | |||
/* Yield our process time to another thread. */ | |||
static inline void | |||
__gthread_objc_thread_yield (void) | |||
{ | |||
return; | |||
} | |||
/* Terminate the current thread. */ | |||
static inline int | |||
__gthread_objc_thread_exit (void) | |||
{ | |||
/* No thread support available */ | |||
/* Should we really exit the program */ | |||
/* exit (&__objc_thread_exit_status); */ | |||
return -1; | |||
} | |||
/* Returns an integer value which uniquely describes a thread. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_id (void) | |||
{ | |||
/* No thread support, use 1. */ | |||
return (objc_thread_t) 1; | |||
} | |||
/* Sets the thread's local storage pointer. */ | |||
static inline int | |||
__gthread_objc_thread_set_data (void *value) | |||
{ | |||
thread_local_storage = value; | |||
return 0; | |||
} | |||
/* Returns the thread's local storage pointer. */ | |||
static inline void * | |||
__gthread_objc_thread_get_data (void) | |||
{ | |||
return thread_local_storage; | |||
} | |||
/* Backend mutex functions */ | |||
/* Allocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Try to grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Unlock the mutex */ | |||
static inline int | |||
__gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Backend condition mutex functions */ | |||
/* Allocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wait on the condition */ | |||
static inline int | |||
__gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||
objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up all threads waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up one thread waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
#else /* _LIBOBJC */ | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int _GLIBCXX_UNUSED | |||
__gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static int _GLIBCXX_UNUSED | |||
__gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline void * | |||
__gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_lock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_trylock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_unlock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_destroy (__mutex); | |||
} | |||
#endif /* _LIBOBJC */ | |||
#undef _GLIBCXX_UNUSED | |||
#endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ |
@@ -0,0 +1,890 @@ | |||
/* Threads compatibility routines for libgcc2 and libobjc. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_POSIX_H | |||
#define _GLIBCXX_GCC_GTHR_POSIX_H | |||
/* POSIX threads specific definitions. | |||
Easy, since the interface is just one-to-one mapping. */ | |||
#define __GTHREADS 1 | |||
#define __GTHREADS_CXX0X 1 | |||
#include <pthread.h> | |||
#if ((defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)) \ | |||
|| !defined(_GTHREAD_USE_MUTEX_TIMEDLOCK)) | |||
# include <unistd.h> | |||
# if defined(_POSIX_TIMEOUTS) && _POSIX_TIMEOUTS >= 0 | |||
# define _GTHREAD_USE_MUTEX_TIMEDLOCK 1 | |||
# else | |||
# define _GTHREAD_USE_MUTEX_TIMEDLOCK 0 | |||
# endif | |||
#endif | |||
typedef pthread_t __gthread_t; | |||
typedef pthread_key_t __gthread_key_t; | |||
typedef pthread_once_t __gthread_once_t; | |||
typedef pthread_mutex_t __gthread_mutex_t; | |||
typedef pthread_mutex_t __gthread_recursive_mutex_t; | |||
typedef pthread_cond_t __gthread_cond_t; | |||
typedef struct timespec __gthread_time_t; | |||
/* POSIX like conditional variables are supported. Please look at comments | |||
in gthr.h for details. */ | |||
#define __GTHREAD_HAS_COND 1 | |||
#define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER | |||
#define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function | |||
#define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT | |||
#if defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER | |||
#elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP | |||
#else | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||
#endif | |||
#define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER | |||
#define __GTHREAD_TIME_INIT {0,0} | |||
#ifdef _GTHREAD_USE_MUTEX_INIT_FUNC | |||
# undef __GTHREAD_MUTEX_INIT | |||
#endif | |||
#ifdef _GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC | |||
# undef __GTHREAD_RECURSIVE_MUTEX_INIT | |||
# undef __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||
# define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||
#endif | |||
#ifdef _GTHREAD_USE_COND_INIT_FUNC | |||
# undef __GTHREAD_COND_INIT | |||
# define __GTHREAD_COND_INIT_FUNCTION __gthread_cond_init_function | |||
#endif | |||
#if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||
# ifndef __gthrw_pragma | |||
# define __gthrw_pragma(pragma) | |||
# endif | |||
# define __gthrw2(name,name2,type) \ | |||
static __typeof(type) name \ | |||
__attribute__ ((__weakref__(#name2), __copy__ (type))); \ | |||
__gthrw_pragma(weak type) | |||
# define __gthrw_(name) __gthrw_ ## name | |||
#else | |||
# define __gthrw2(name,name2,type) | |||
# define __gthrw_(name) name | |||
#endif | |||
/* Typically, __gthrw_foo is a weak reference to symbol foo. */ | |||
#define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name) | |||
__gthrw(pthread_once) | |||
__gthrw(pthread_getspecific) | |||
__gthrw(pthread_setspecific) | |||
__gthrw(pthread_create) | |||
__gthrw(pthread_join) | |||
__gthrw(pthread_equal) | |||
__gthrw(pthread_self) | |||
__gthrw(pthread_detach) | |||
#ifndef __BIONIC__ | |||
__gthrw(pthread_cancel) | |||
#endif | |||
__gthrw(sched_yield) | |||
__gthrw(pthread_mutex_lock) | |||
__gthrw(pthread_mutex_trylock) | |||
#if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||
__gthrw(pthread_mutex_timedlock) | |||
#endif | |||
__gthrw(pthread_mutex_unlock) | |||
__gthrw(pthread_mutex_init) | |||
__gthrw(pthread_mutex_destroy) | |||
__gthrw(pthread_cond_init) | |||
__gthrw(pthread_cond_broadcast) | |||
__gthrw(pthread_cond_signal) | |||
__gthrw(pthread_cond_wait) | |||
__gthrw(pthread_cond_timedwait) | |||
__gthrw(pthread_cond_destroy) | |||
__gthrw(pthread_key_create) | |||
__gthrw(pthread_key_delete) | |||
__gthrw(pthread_mutexattr_init) | |||
__gthrw(pthread_mutexattr_settype) | |||
__gthrw(pthread_mutexattr_destroy) | |||
#if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK) | |||
/* Objective-C. */ | |||
__gthrw(pthread_exit) | |||
#ifdef _POSIX_PRIORITY_SCHEDULING | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
__gthrw(sched_get_priority_max) | |||
__gthrw(sched_get_priority_min) | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _POSIX_PRIORITY_SCHEDULING */ | |||
__gthrw(pthread_attr_destroy) | |||
__gthrw(pthread_attr_init) | |||
__gthrw(pthread_attr_setdetachstate) | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
__gthrw(pthread_getschedparam) | |||
__gthrw(pthread_setschedparam) | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _LIBOBJC || _LIBOBJC_WEAK */ | |||
#if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||
/* On Solaris 2.6 up to 9, the libc exposes a POSIX threads interface even if | |||
-pthreads is not specified. The functions are dummies and most return an | |||
error value. However pthread_once returns 0 without invoking the routine | |||
it is passed so we cannot pretend that the interface is active if -pthreads | |||
is not specified. On Solaris 2.5.1, the interface is not exposed at all so | |||
we need to play the usual game with weak symbols. On Solaris 10 and up, a | |||
working interface is always exposed. On FreeBSD 6 and later, libc also | |||
exposes a dummy POSIX threads interface, similar to what Solaris 2.6 up | |||
to 9 does. FreeBSD >= 700014 even provides a pthread_cancel stub in libc, | |||
which means the alternate __gthread_active_p below cannot be used there. */ | |||
#if defined(__FreeBSD__) || (defined(__sun) && defined(__svr4__)) | |||
static volatile int __gthread_active = -1; | |||
static void | |||
__gthread_trigger (void) | |||
{ | |||
__gthread_active = 1; | |||
} | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER; | |||
static pthread_once_t __gthread_active_once = PTHREAD_ONCE_INIT; | |||
/* Avoid reading __gthread_active twice on the main code path. */ | |||
int __gthread_active_latest_value = __gthread_active; | |||
/* This test is not protected to avoid taking a lock on the main code | |||
path so every update of __gthread_active in a threaded program must | |||
be atomic with regard to the result of the test. */ | |||
if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||
{ | |||
if (__gthrw_(pthread_once)) | |||
{ | |||
/* If this really is a threaded program, then we must ensure that | |||
__gthread_active has been set to 1 before exiting this block. */ | |||
__gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); | |||
__gthrw_(pthread_once) (&__gthread_active_once, __gthread_trigger); | |||
__gthrw_(pthread_mutex_unlock) (&__gthread_active_mutex); | |||
} | |||
/* Make sure we'll never enter this block again. */ | |||
if (__gthread_active < 0) | |||
__gthread_active = 0; | |||
__gthread_active_latest_value = __gthread_active; | |||
} | |||
return __gthread_active_latest_value != 0; | |||
} | |||
#else /* neither FreeBSD nor Solaris */ | |||
/* For a program to be multi-threaded the only thing that it certainly must | |||
be using is pthread_create. However, there may be other libraries that | |||
intercept pthread_create with their own definitions to wrap pthreads | |||
functionality for some purpose. In those cases, pthread_create being | |||
defined might not necessarily mean that libpthread is actually linked | |||
in. | |||
For the GNU C library, we can use a known internal name. This is always | |||
available in the ABI, but no other library would define it. That is | |||
ideal, since any public pthread function might be intercepted just as | |||
pthread_create might be. __pthread_key_create is an "internal" | |||
implementation symbol, but it is part of the public exported ABI. Also, | |||
it's among the symbols that the static libpthread.a always links in | |||
whenever pthread_create is used, so there is no danger of a false | |||
negative result in any statically-linked, multi-threaded program. | |||
For others, we choose pthread_cancel as a function that seems unlikely | |||
to be redefined by an interceptor library. The bionic (Android) C | |||
library does not provide pthread_cancel, so we do use pthread_create | |||
there (and interceptor libraries lose). */ | |||
#ifdef __GLIBC__ | |||
__gthrw2(__gthrw_(__pthread_key_create), | |||
__pthread_key_create, | |||
pthread_key_create) | |||
# define GTHR_ACTIVE_PROXY __gthrw_(__pthread_key_create) | |||
#elif defined (__BIONIC__) | |||
# define GTHR_ACTIVE_PROXY __gthrw_(pthread_create) | |||
#else | |||
# define GTHR_ACTIVE_PROXY __gthrw_(pthread_cancel) | |||
#endif | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
static void *const __gthread_active_ptr | |||
= __extension__ (void *) >HR_ACTIVE_PROXY; | |||
return __gthread_active_ptr != 0; | |||
} | |||
#endif /* FreeBSD or Solaris */ | |||
#else /* not __GXX_WEAK__ */ | |||
/* Similar to Solaris, HP-UX 11 for PA-RISC provides stubs for pthread | |||
calls in shared flavors of the HP-UX C library. Most of the stubs | |||
have no functionality. The details are described in the "libc cumulative | |||
patch" for each subversion of HP-UX 11. There are two special interfaces | |||
provided for checking whether an application is linked to a shared pthread | |||
library or not. However, these interfaces aren't available in early | |||
libpthread libraries. We also need a test that works for archive | |||
libraries. We can't use pthread_once as some libc versions call the | |||
init function. We also can't use pthread_create or pthread_attr_init | |||
as these create a thread and thereby prevent changing the default stack | |||
size. The function pthread_default_stacksize_np is available in both | |||
the archive and shared versions of libpthread. It can be used to | |||
determine the default pthread stack size. There is a stub in some | |||
shared libc versions which returns a zero size if pthreads are not | |||
active. We provide an equivalent stub to handle cases where libc | |||
doesn't provide one. */ | |||
#if defined(__hppa__) && defined(__hpux__) | |||
static volatile int __gthread_active = -1; | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
/* Avoid reading __gthread_active twice on the main code path. */ | |||
int __gthread_active_latest_value = __gthread_active; | |||
size_t __s; | |||
if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||
{ | |||
pthread_default_stacksize_np (0, &__s); | |||
__gthread_active = __s ? 1 : 0; | |||
__gthread_active_latest_value = __gthread_active; | |||
} | |||
return __gthread_active_latest_value != 0; | |||
} | |||
#else /* not hppa-hpux */ | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
return 1; | |||
} | |||
#endif /* hppa-hpux */ | |||
#endif /* __GXX_WEAK__ */ | |||
#ifdef _LIBOBJC | |||
/* This is the config.h file in libobjc/ */ | |||
#include <config.h> | |||
#ifdef HAVE_SCHED_H | |||
# include <sched.h> | |||
#endif | |||
/* Key structure for maintaining thread specific storage */ | |||
static pthread_key_t _objc_thread_storage; | |||
static pthread_attr_t _objc_thread_attribs; | |||
/* Thread local storage for a single thread */ | |||
static void *thread_local_storage = NULL; | |||
/* Backend initialization functions */ | |||
/* Initialize the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_init_thread_system (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
/* Initialize the thread storage key. */ | |||
if (__gthrw_(pthread_key_create) (&_objc_thread_storage, NULL) == 0) | |||
{ | |||
/* The normal default detach state for threads is | |||
* PTHREAD_CREATE_JOINABLE which causes threads to not die | |||
* when you think they should. */ | |||
if (__gthrw_(pthread_attr_init) (&_objc_thread_attribs) == 0 | |||
&& __gthrw_(pthread_attr_setdetachstate) (&_objc_thread_attribs, | |||
PTHREAD_CREATE_DETACHED) == 0) | |||
return 0; | |||
} | |||
} | |||
return -1; | |||
} | |||
/* Close the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_close_thread_system (void) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_key_delete) (_objc_thread_storage) == 0 | |||
&& __gthrw_(pthread_attr_destroy) (&_objc_thread_attribs) == 0) | |||
return 0; | |||
return -1; | |||
} | |||
/* Backend thread functions */ | |||
/* Create a new thread of execution. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_detach (void (*func)(void *), void *arg) | |||
{ | |||
objc_thread_t thread_id; | |||
pthread_t new_thread_handle; | |||
if (!__gthread_active_p ()) | |||
return NULL; | |||
if (!(__gthrw_(pthread_create) (&new_thread_handle, &_objc_thread_attribs, | |||
(void *) func, arg))) | |||
thread_id = (objc_thread_t) new_thread_handle; | |||
else | |||
thread_id = NULL; | |||
return thread_id; | |||
} | |||
/* Set the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_set_priority (int priority) | |||
{ | |||
if (!__gthread_active_p ()) | |||
return -1; | |||
else | |||
{ | |||
#ifdef _POSIX_PRIORITY_SCHEDULING | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
pthread_t thread_id = __gthrw_(pthread_self) (); | |||
int policy; | |||
struct sched_param params; | |||
int priority_min, priority_max; | |||
if (__gthrw_(pthread_getschedparam) (thread_id, &policy, ¶ms) == 0) | |||
{ | |||
if ((priority_max = __gthrw_(sched_get_priority_max) (policy)) == -1) | |||
return -1; | |||
if ((priority_min = __gthrw_(sched_get_priority_min) (policy)) == -1) | |||
return -1; | |||
if (priority > priority_max) | |||
priority = priority_max; | |||
else if (priority < priority_min) | |||
priority = priority_min; | |||
params.sched_priority = priority; | |||
/* | |||
* The solaris 7 and several other man pages incorrectly state that | |||
* this should be a pointer to policy but pthread.h is universally | |||
* at odds with this. | |||
*/ | |||
if (__gthrw_(pthread_setschedparam) (thread_id, policy, ¶ms) == 0) | |||
return 0; | |||
} | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _POSIX_PRIORITY_SCHEDULING */ | |||
return -1; | |||
} | |||
} | |||
/* Return the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_get_priority (void) | |||
{ | |||
#ifdef _POSIX_PRIORITY_SCHEDULING | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
if (__gthread_active_p ()) | |||
{ | |||
int policy; | |||
struct sched_param params; | |||
if (__gthrw_(pthread_getschedparam) (__gthrw_(pthread_self) (), &policy, ¶ms) == 0) | |||
return params.sched_priority; | |||
else | |||
return -1; | |||
} | |||
else | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _POSIX_PRIORITY_SCHEDULING */ | |||
return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||
} | |||
/* Yield our process time to another thread. */ | |||
static inline void | |||
__gthread_objc_thread_yield (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
__gthrw_(sched_yield) (); | |||
} | |||
/* Terminate the current thread. */ | |||
static inline int | |||
__gthread_objc_thread_exit (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
/* exit the thread */ | |||
__gthrw_(pthread_exit) (&__objc_thread_exit_status); | |||
/* Failed if we reached here */ | |||
return -1; | |||
} | |||
/* Returns an integer value which uniquely describes a thread. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_id (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
return (objc_thread_t) __gthrw_(pthread_self) (); | |||
else | |||
return (objc_thread_t) 1; | |||
} | |||
/* Sets the thread's local storage pointer. */ | |||
static inline int | |||
__gthread_objc_thread_set_data (void *value) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_setspecific) (_objc_thread_storage, value); | |||
else | |||
{ | |||
thread_local_storage = value; | |||
return 0; | |||
} | |||
} | |||
/* Returns the thread's local storage pointer. */ | |||
static inline void * | |||
__gthread_objc_thread_get_data (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_getspecific) (_objc_thread_storage); | |||
else | |||
return thread_local_storage; | |||
} | |||
/* Backend mutex functions */ | |||
/* Allocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_allocate (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
mutex->backend = objc_malloc (sizeof (pthread_mutex_t)); | |||
if (__gthrw_(pthread_mutex_init) ((pthread_mutex_t *) mutex->backend, NULL)) | |||
{ | |||
objc_free (mutex->backend); | |||
mutex->backend = NULL; | |||
return -1; | |||
} | |||
} | |||
return 0; | |||
} | |||
/* Deallocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_deallocate (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
int count; | |||
/* | |||
* Posix Threads specifically require that the thread be unlocked | |||
* for __gthrw_(pthread_mutex_destroy) to work. | |||
*/ | |||
do | |||
{ | |||
count = __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend); | |||
if (count < 0) | |||
return -1; | |||
} | |||
while (count); | |||
if (__gthrw_(pthread_mutex_destroy) ((pthread_mutex_t *) mutex->backend)) | |||
return -1; | |||
objc_free (mutex->backend); | |||
mutex->backend = NULL; | |||
} | |||
return 0; | |||
} | |||
/* Grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_lock (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_mutex_lock) ((pthread_mutex_t *) mutex->backend) != 0) | |||
{ | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
/* Try to grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_trylock (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_mutex_trylock) ((pthread_mutex_t *) mutex->backend) != 0) | |||
{ | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
/* Unlock the mutex */ | |||
static inline int | |||
__gthread_objc_mutex_unlock (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend) != 0) | |||
{ | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
/* Backend condition mutex functions */ | |||
/* Allocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_allocate (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
condition->backend = objc_malloc (sizeof (pthread_cond_t)); | |||
if (__gthrw_(pthread_cond_init) ((pthread_cond_t *) condition->backend, NULL)) | |||
{ | |||
objc_free (condition->backend); | |||
condition->backend = NULL; | |||
return -1; | |||
} | |||
} | |||
return 0; | |||
} | |||
/* Deallocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_deallocate (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
if (__gthrw_(pthread_cond_destroy) ((pthread_cond_t *) condition->backend)) | |||
return -1; | |||
objc_free (condition->backend); | |||
condition->backend = NULL; | |||
} | |||
return 0; | |||
} | |||
/* Wait on the condition */ | |||
static inline int | |||
__gthread_objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_cond_wait) ((pthread_cond_t *) condition->backend, | |||
(pthread_mutex_t *) mutex->backend); | |||
else | |||
return 0; | |||
} | |||
/* Wake up all threads waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_broadcast (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_cond_broadcast) ((pthread_cond_t *) condition->backend); | |||
else | |||
return 0; | |||
} | |||
/* Wake up one thread waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_signal (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_cond_signal) ((pthread_cond_t *) condition->backend); | |||
else | |||
return 0; | |||
} | |||
#else /* _LIBOBJC */ | |||
static inline int | |||
__gthread_create (__gthread_t *__threadid, void *(*__func) (void*), | |||
void *__args) | |||
{ | |||
return __gthrw_(pthread_create) (__threadid, NULL, __func, __args); | |||
} | |||
static inline int | |||
__gthread_join (__gthread_t __threadid, void **__value_ptr) | |||
{ | |||
return __gthrw_(pthread_join) (__threadid, __value_ptr); | |||
} | |||
static inline int | |||
__gthread_detach (__gthread_t __threadid) | |||
{ | |||
return __gthrw_(pthread_detach) (__threadid); | |||
} | |||
static inline int | |||
__gthread_equal (__gthread_t __t1, __gthread_t __t2) | |||
{ | |||
return __gthrw_(pthread_equal) (__t1, __t2); | |||
} | |||
static inline __gthread_t | |||
__gthread_self (void) | |||
{ | |||
return __gthrw_(pthread_self) (); | |||
} | |||
static inline int | |||
__gthread_yield (void) | |||
{ | |||
return __gthrw_(sched_yield) (); | |||
} | |||
static inline int | |||
__gthread_once (__gthread_once_t *__once, void (*__func) (void)) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_once) (__once, __func); | |||
else | |||
return -1; | |||
} | |||
static inline int | |||
__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) | |||
{ | |||
return __gthrw_(pthread_key_create) (__key, __dtor); | |||
} | |||
static inline int | |||
__gthread_key_delete (__gthread_key_t __key) | |||
{ | |||
return __gthrw_(pthread_key_delete) (__key); | |||
} | |||
static inline void * | |||
__gthread_getspecific (__gthread_key_t __key) | |||
{ | |||
return __gthrw_(pthread_getspecific) (__key); | |||
} | |||
static inline int | |||
__gthread_setspecific (__gthread_key_t __key, const void *__ptr) | |||
{ | |||
return __gthrw_(pthread_setspecific) (__key, __ptr); | |||
} | |||
static inline void | |||
__gthread_mutex_init_function (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
__gthrw_(pthread_mutex_init) (__mutex, NULL); | |||
} | |||
static inline int | |||
__gthread_mutex_destroy (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_destroy) (__mutex); | |||
else | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_lock (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_lock) (__mutex); | |||
else | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_trylock (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_trylock) (__mutex); | |||
else | |||
return 0; | |||
} | |||
#if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||
static inline int | |||
__gthread_mutex_timedlock (__gthread_mutex_t *__mutex, | |||
const __gthread_time_t *__abs_timeout) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_timedlock) (__mutex, __abs_timeout); | |||
else | |||
return 0; | |||
} | |||
#endif | |||
static inline int | |||
__gthread_mutex_unlock (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_unlock) (__mutex); | |||
else | |||
return 0; | |||
} | |||
#if !defined( PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) \ | |||
|| defined(_GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC) | |||
static inline int | |||
__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
pthread_mutexattr_t __attr; | |||
int __r; | |||
__r = __gthrw_(pthread_mutexattr_init) (&__attr); | |||
if (!__r) | |||
__r = __gthrw_(pthread_mutexattr_settype) (&__attr, | |||
PTHREAD_MUTEX_RECURSIVE); | |||
if (!__r) | |||
__r = __gthrw_(pthread_mutex_init) (__mutex, &__attr); | |||
if (!__r) | |||
__r = __gthrw_(pthread_mutexattr_destroy) (&__attr); | |||
return __r; | |||
} | |||
return 0; | |||
} | |||
#endif | |||
static inline int | |||
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_lock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_trylock (__mutex); | |||
} | |||
#if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||
static inline int | |||
__gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex, | |||
const __gthread_time_t *__abs_timeout) | |||
{ | |||
return __gthread_mutex_timedlock (__mutex, __abs_timeout); | |||
} | |||
#endif | |||
static inline int | |||
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_unlock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_destroy (__mutex); | |||
} | |||
#ifdef _GTHREAD_USE_COND_INIT_FUNC | |||
static inline void | |||
__gthread_cond_init_function (__gthread_cond_t *__cond) | |||
{ | |||
if (__gthread_active_p ()) | |||
__gthrw_(pthread_cond_init) (__cond, NULL); | |||
} | |||
#endif | |||
static inline int | |||
__gthread_cond_broadcast (__gthread_cond_t *__cond) | |||
{ | |||
return __gthrw_(pthread_cond_broadcast) (__cond); | |||
} | |||
static inline int | |||
__gthread_cond_signal (__gthread_cond_t *__cond) | |||
{ | |||
return __gthrw_(pthread_cond_signal) (__cond); | |||
} | |||
static inline int | |||
__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex) | |||
{ | |||
return __gthrw_(pthread_cond_wait) (__cond, __mutex); | |||
} | |||
static inline int | |||
__gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex, | |||
const __gthread_time_t *__abs_timeout) | |||
{ | |||
return __gthrw_(pthread_cond_timedwait) (__cond, __mutex, __abs_timeout); | |||
} | |||
static inline int | |||
__gthread_cond_wait_recursive (__gthread_cond_t *__cond, | |||
__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_cond_wait (__cond, __mutex); | |||
} | |||
static inline int | |||
__gthread_cond_destroy (__gthread_cond_t* __cond) | |||
{ | |||
return __gthrw_(pthread_cond_destroy) (__cond); | |||
} | |||
#endif /* _LIBOBJC */ | |||
#endif /* ! _GLIBCXX_GCC_GTHR_POSIX_H */ |
@@ -0,0 +1,298 @@ | |||
/* Threads compatibility routines for libgcc2 and libobjc. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||
#define _GLIBCXX_GCC_GTHR_SINGLE_H | |||
/* Just provide compatibility for mutex handling. */ | |||
typedef int __gthread_key_t; | |||
typedef int __gthread_once_t; | |||
typedef int __gthread_mutex_t; | |||
typedef int __gthread_recursive_mutex_t; | |||
#define __GTHREAD_ONCE_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||
#define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||
#ifdef _LIBOBJC | |||
/* Thread local storage for a single thread */ | |||
static void *thread_local_storage = NULL; | |||
/* Backend initialization functions */ | |||
/* Initialize the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_init_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Close the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_close_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Backend thread functions */ | |||
/* Create a new thread of execution. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return NULL; | |||
} | |||
/* Set the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Return the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_get_priority (void) | |||
{ | |||
return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||
} | |||
/* Yield our process time to another thread. */ | |||
static inline void | |||
__gthread_objc_thread_yield (void) | |||
{ | |||
return; | |||
} | |||
/* Terminate the current thread. */ | |||
static inline int | |||
__gthread_objc_thread_exit (void) | |||
{ | |||
/* No thread support available */ | |||
/* Should we really exit the program */ | |||
/* exit (&__objc_thread_exit_status); */ | |||
return -1; | |||
} | |||
/* Returns an integer value which uniquely describes a thread. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_id (void) | |||
{ | |||
/* No thread support, use 1. */ | |||
return (objc_thread_t) 1; | |||
} | |||
/* Sets the thread's local storage pointer. */ | |||
static inline int | |||
__gthread_objc_thread_set_data (void *value) | |||
{ | |||
thread_local_storage = value; | |||
return 0; | |||
} | |||
/* Returns the thread's local storage pointer. */ | |||
static inline void * | |||
__gthread_objc_thread_get_data (void) | |||
{ | |||
return thread_local_storage; | |||
} | |||
/* Backend mutex functions */ | |||
/* Allocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Try to grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Unlock the mutex */ | |||
static inline int | |||
__gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Backend condition mutex functions */ | |||
/* Allocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wait on the condition */ | |||
static inline int | |||
__gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||
objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up all threads waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up one thread waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
#else /* _LIBOBJC */ | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int _GLIBCXX_UNUSED | |||
__gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static int _GLIBCXX_UNUSED | |||
__gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline void * | |||
__gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_lock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_trylock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_unlock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_destroy (__mutex); | |||
} | |||
#endif /* _LIBOBJC */ | |||
#undef _GLIBCXX_UNUSED | |||
#endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ |
@@ -0,0 +1,154 @@ | |||
/* Threads compatibility routines for libgcc2. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_H | |||
#define _GLIBCXX_GCC_GTHR_H | |||
#ifndef _GLIBCXX_HIDE_EXPORTS | |||
#pragma GCC visibility push(default) | |||
#endif | |||
/* If this file is compiled with threads support, it must | |||
#define __GTHREADS 1 | |||
to indicate that threads support is present. Also it has define | |||
function | |||
int __gthread_active_p () | |||
that returns 1 if thread system is active, 0 if not. | |||
The threads interface must define the following types: | |||
__gthread_key_t | |||
__gthread_once_t | |||
__gthread_mutex_t | |||
__gthread_recursive_mutex_t | |||
The threads interface must define the following macros: | |||
__GTHREAD_ONCE_INIT | |||
to initialize __gthread_once_t | |||
__GTHREAD_MUTEX_INIT | |||
to initialize __gthread_mutex_t to get a fast | |||
non-recursive mutex. | |||
__GTHREAD_MUTEX_INIT_FUNCTION | |||
to initialize __gthread_mutex_t to get a fast | |||
non-recursive mutex. | |||
Define this to a function which looks like this: | |||
void __GTHREAD_MUTEX_INIT_FUNCTION (__gthread_mutex_t *) | |||
Some systems can't initialize a mutex without a | |||
function call. Don't define __GTHREAD_MUTEX_INIT in this case. | |||
__GTHREAD_RECURSIVE_MUTEX_INIT | |||
__GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||
as above, but for a recursive mutex. | |||
The threads interface must define the following static functions: | |||
int __gthread_once (__gthread_once_t *once, void (*func) ()) | |||
int __gthread_key_create (__gthread_key_t *keyp, void (*dtor) (void *)) | |||
int __gthread_key_delete (__gthread_key_t key) | |||
void *__gthread_getspecific (__gthread_key_t key) | |||
int __gthread_setspecific (__gthread_key_t key, const void *ptr) | |||
int __gthread_mutex_destroy (__gthread_mutex_t *mutex); | |||
int __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *mutex); | |||
int __gthread_mutex_lock (__gthread_mutex_t *mutex); | |||
int __gthread_mutex_trylock (__gthread_mutex_t *mutex); | |||
int __gthread_mutex_unlock (__gthread_mutex_t *mutex); | |||
int __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex); | |||
int __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex); | |||
int __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex); | |||
The following are supported in POSIX threads only. They are required to | |||
fix a deadlock in static initialization inside libsupc++. The header file | |||
gthr-posix.h defines a symbol __GTHREAD_HAS_COND to signify that these extra | |||
features are supported. | |||
Types: | |||
__gthread_cond_t | |||
Macros: | |||
__GTHREAD_COND_INIT | |||
__GTHREAD_COND_INIT_FUNCTION | |||
Interface: | |||
int __gthread_cond_broadcast (__gthread_cond_t *cond); | |||
int __gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex); | |||
int __gthread_cond_wait_recursive (__gthread_cond_t *cond, | |||
__gthread_recursive_mutex_t *mutex); | |||
All functions returning int should return zero on success or the error | |||
number. If the operation is not supported, -1 is returned. | |||
If the following are also defined, you should | |||
#define __GTHREADS_CXX0X 1 | |||
to enable the c++0x thread library. | |||
Types: | |||
__gthread_t | |||
__gthread_time_t | |||
Interface: | |||
int __gthread_create (__gthread_t *thread, void *(*func) (void*), | |||
void *args); | |||
int __gthread_join (__gthread_t thread, void **value_ptr); | |||
int __gthread_detach (__gthread_t thread); | |||
int __gthread_equal (__gthread_t t1, __gthread_t t2); | |||
__gthread_t __gthread_self (void); | |||
int __gthread_yield (void); | |||
int __gthread_mutex_timedlock (__gthread_mutex_t *m, | |||
const __gthread_time_t *abs_timeout); | |||
int __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *m, | |||
const __gthread_time_t *abs_time); | |||
int __gthread_cond_signal (__gthread_cond_t *cond); | |||
int __gthread_cond_timedwait (__gthread_cond_t *cond, | |||
__gthread_mutex_t *mutex, | |||
const __gthread_time_t *abs_timeout); | |||
*/ | |||
#if __GXX_WEAK__ | |||
/* The pe-coff weak support isn't fully compatible to ELF's weak. | |||
For static libraries it might would work, but as we need to deal | |||
with shared versions too, we disable it for mingw-targets. */ | |||
#ifdef __MINGW32__ | |||
#undef _GLIBCXX_GTHREAD_USE_WEAK | |||
#define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||
#endif | |||
#ifndef _GLIBCXX_GTHREAD_USE_WEAK | |||
#define _GLIBCXX_GTHREAD_USE_WEAK 1 | |||
#endif | |||
#endif | |||
#include <bits/gthr-default.h> | |||
#ifndef _GLIBCXX_HIDE_EXPORTS | |||
#pragma GCC visibility pop | |||
#endif | |||
#endif /* ! _GLIBCXX_GCC_GTHR_H */ |
@@ -0,0 +1,92 @@ | |||
// std::messages implementation details, generic version -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/messages_members.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.2.7.1.2 messages virtual functions | |||
// | |||
// Written by Benjamin Kosnik <bkoz@redhat.com> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
// Non-virtual member functions. | |||
template<typename _CharT> | |||
messages<_CharT>::messages(size_t __refs) | |||
: facet(__refs) | |||
{ _M_c_locale_messages = _S_get_c_locale(); } | |||
template<typename _CharT> | |||
messages<_CharT>::messages(__c_locale, const char*, size_t __refs) | |||
: facet(__refs) | |||
{ _M_c_locale_messages = _S_get_c_locale(); } | |||
template<typename _CharT> | |||
typename messages<_CharT>::catalog | |||
messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, | |||
const char*) const | |||
{ return this->do_open(__s, __loc); } | |||
// Virtual member functions. | |||
template<typename _CharT> | |||
messages<_CharT>::~messages() | |||
{ _S_destroy_c_locale(_M_c_locale_messages); } | |||
template<typename _CharT> | |||
typename messages<_CharT>::catalog | |||
messages<_CharT>::do_open(const basic_string<char>&, const locale&) const | |||
{ return 0; } | |||
template<typename _CharT> | |||
typename messages<_CharT>::string_type | |||
messages<_CharT>::do_get(catalog, int, int, | |||
const string_type& __dfault) const | |||
{ return __dfault; } | |||
template<typename _CharT> | |||
void | |||
messages<_CharT>::do_close(catalog) const | |||
{ } | |||
// messages_byname | |||
template<typename _CharT> | |||
messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) | |||
: messages<_CharT>(__refs) | |||
{ | |||
if (__builtin_strcmp(__s, "C") != 0 | |||
&& __builtin_strcmp(__s, "POSIX") != 0) | |||
{ | |||
this->_S_destroy_c_locale(this->_M_c_locale_messages); | |||
this->_S_create_c_locale(this->_M_c_locale_messages, __s); | |||
} | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,38 @@ | |||
// Optimizations for random number handling, generic version -*- C++ -*- | |||
// Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/opt_random.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{random} | |||
*/ | |||
#ifndef _BITS_OPT_RANDOM_H | |||
#define _BITS_OPT_RANDOM_H 1 | |||
#pragma GCC system_header | |||
#endif // _BITS_OPT_RANDOM_H |
@@ -0,0 +1,61 @@ | |||
// Specific definitions for newlib -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/os_defines.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{iosfwd} | |||
*/ | |||
#ifndef _GLIBCXX_OS_DEFINES | |||
#define _GLIBCXX_OS_DEFINES 1 | |||
// System-specific #define, typedefs, corrections, etc, go here. This | |||
// file will come before all others. | |||
#ifdef __CYGWIN__ | |||
#define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||
#if defined (_GLIBCXX_DLL) | |||
#define _GLIBCXX_PSEUDO_VISIBILITY_default __attribute__ ((__dllimport__)) | |||
#else | |||
#define _GLIBCXX_PSEUDO_VISIBILITY_default | |||
#endif | |||
#define _GLIBCXX_PSEUDO_VISIBILITY_hidden | |||
#define _GLIBCXX_PSEUDO_VISIBILITY(V) _GLIBCXX_PSEUDO_VISIBILITY_ ## V | |||
// See libstdc++/20806. | |||
#define _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM 1 | |||
// Enable use of GetModuleHandleEx (requires Windows XP/2003) in | |||
// __cxa_thread_atexit to prevent modules from being unloaded before | |||
// their dtors are called | |||
#define _GLIBCXX_THREAD_ATEXIT_WIN32 1 | |||
// See libstdc++/69506 | |||
#define _GLIBCXX_USE_WEAK_REF 0 | |||
#endif | |||
#endif |
@@ -0,0 +1,146 @@ | |||
// C++ includes used for precompiling -*- C++ -*- | |||
// Copyright (C) 2003-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file stdc++.h | |||
* This is an implementation file for a precompiled header. | |||
*/ | |||
// 17.4.1.2 Headers | |||
// C | |||
#ifndef _GLIBCXX_NO_ASSERT | |||
#include <cassert> | |||
#endif | |||
#include <cctype> | |||
#include <cerrno> | |||
#include <cfloat> | |||
#include <ciso646> | |||
#include <climits> | |||
#include <clocale> | |||
#include <cmath> | |||
#include <csetjmp> | |||
#include <csignal> | |||
#include <cstdarg> | |||
#include <cstddef> | |||
#include <cstdio> | |||
#include <cstdlib> | |||
#include <cstring> | |||
#include <ctime> | |||
#include <cwchar> | |||
#include <cwctype> | |||
#if __cplusplus >= 201103L | |||
#include <ccomplex> | |||
#include <cfenv> | |||
#include <cinttypes> | |||
#include <cstdalign> | |||
#include <cstdbool> | |||
#include <cstdint> | |||
#include <ctgmath> | |||
#include <cuchar> | |||
#endif | |||
// C++ | |||
#include <algorithm> | |||
#include <bitset> | |||
#include <complex> | |||
#include <deque> | |||
#include <exception> | |||
#include <fstream> | |||
#include <functional> | |||
#include <iomanip> | |||
#include <ios> | |||
#include <iosfwd> | |||
#include <iostream> | |||
#include <istream> | |||
#include <iterator> | |||
#include <limits> | |||
#include <list> | |||
#include <locale> | |||
#include <map> | |||
#include <memory> | |||
#include <new> | |||
#include <numeric> | |||
#include <ostream> | |||
#include <queue> | |||
#include <set> | |||
#include <sstream> | |||
#include <stack> | |||
#include <stdexcept> | |||
#include <streambuf> | |||
#include <string> | |||
#include <typeinfo> | |||
#include <utility> | |||
#include <valarray> | |||
#include <vector> | |||
#if __cplusplus >= 201103L | |||
#include <array> | |||
#include <atomic> | |||
#include <chrono> | |||
#include <codecvt> | |||
#include <condition_variable> | |||
#include <forward_list> | |||
#include <future> | |||
#include <initializer_list> | |||
#include <mutex> | |||
#include <random> | |||
#include <ratio> | |||
#include <regex> | |||
#include <scoped_allocator> | |||
#include <system_error> | |||
#include <thread> | |||
#include <tuple> | |||
#include <typeindex> | |||
#include <type_traits> | |||
#include <unordered_map> | |||
#include <unordered_set> | |||
#endif | |||
#if __cplusplus >= 201402L | |||
#include <shared_mutex> | |||
#endif | |||
#if __cplusplus >= 201703L | |||
#include <any> | |||
#include <charconv> | |||
// #include <execution> | |||
#include <filesystem> | |||
#include <optional> | |||
#include <memory_resource> | |||
#include <string_view> | |||
#include <variant> | |||
#endif | |||
#if __cplusplus > 201703L | |||
#include <bit> | |||
#include <compare> | |||
#include <concepts> | |||
#include <numbers> | |||
#include <ranges> | |||
#include <span> | |||
#include <stop_token> | |||
// #include <syncstream> | |||
#include <version> | |||
#endif |
@@ -0,0 +1,53 @@ | |||
// C++ includes used for precompiling TR1 -*- C++ -*- | |||
// Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file stdtr1c++.h | |||
* This is an implementation file for a precompiled header. | |||
*/ | |||
#include <bits/stdc++.h> | |||
#include <tr1/array> | |||
#include <tr1/cctype> | |||
#include <tr1/cfenv> | |||
#include <tr1/cfloat> | |||
#include <tr1/cinttypes> | |||
#include <tr1/climits> | |||
#include <tr1/cmath> | |||
#include <tr1/complex> | |||
#include <tr1/cstdarg> | |||
#include <tr1/cstdbool> | |||
#include <tr1/cstdint> | |||
#include <tr1/cstdio> | |||
#include <tr1/cstdlib> | |||
#include <tr1/ctgmath> | |||
#include <tr1/ctime> | |||
#include <tr1/cwchar> | |||
#include <tr1/cwctype> | |||
#include <tr1/functional> | |||
#include <tr1/random> | |||
#include <tr1/tuple> | |||
#include <tr1/unordered_map> | |||
#include <tr1/unordered_set> | |||
#include <tr1/utility> |
@@ -0,0 +1,92 @@ | |||
// std::time_get, std::time_put implementation, generic version -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/time_members.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.2.5.1.2 - time_get functions | |||
// ISO C++ 14882: 22.2.5.3.2 - time_put functions | |||
// | |||
// Written by Benjamin Kosnik <bkoz@redhat.com> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
template<typename _CharT> | |||
__timepunct<_CharT>::__timepunct(size_t __refs) | |||
: facet(__refs), _M_data(0) | |||
{ | |||
_M_name_timepunct = _S_get_c_name(); | |||
_M_initialize_timepunct(); | |||
} | |||
template<typename _CharT> | |||
__timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) | |||
: facet(__refs), _M_data(__cache) | |||
{ | |||
_M_name_timepunct = _S_get_c_name(); | |||
_M_initialize_timepunct(); | |||
} | |||
template<typename _CharT> | |||
__timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, | |||
size_t __refs) | |||
: facet(__refs), _M_data(0) | |||
{ | |||
if (__builtin_strcmp(__s, _S_get_c_name()) != 0) | |||
{ | |||
const size_t __len = __builtin_strlen(__s) + 1; | |||
char* __tmp = new char[__len]; | |||
__builtin_memcpy(__tmp, __s, __len); | |||
_M_name_timepunct = __tmp; | |||
} | |||
else | |||
_M_name_timepunct = _S_get_c_name(); | |||
__try | |||
{ _M_initialize_timepunct(__cloc); } | |||
__catch(...) | |||
{ | |||
if (_M_name_timepunct != _S_get_c_name()) | |||
delete [] _M_name_timepunct; | |||
__throw_exception_again; | |||
} | |||
} | |||
template<typename _CharT> | |||
__timepunct<_CharT>::~__timepunct() | |||
{ | |||
if (_M_name_timepunct != _S_get_c_name()) | |||
delete [] _M_name_timepunct; | |||
delete _M_data; | |||
_S_destroy_c_locale(_M_c_locale_timepunct); | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,38 @@ | |||
// Optimizations for random number extensions, generic version -*- C++ -*- | |||
// Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file ext/opt_random.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ext/random} | |||
*/ | |||
#ifndef _EXT_OPT_RANDOM_H | |||
#define _EXT_OPT_RANDOM_H 1 | |||
#pragma GCC system_header | |||
#endif // _EXT_OPT_RANDOM_H |
@@ -0,0 +1,40 @@ | |||
// Low-level type for atomic operations -*- C++ -*- | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file atomic_word.h | |||
* This file is a GNU extension to the Standard C++ Library. | |||
*/ | |||
#ifndef _GLIBCXX_ATOMIC_WORD_H | |||
#define _GLIBCXX_ATOMIC_WORD_H 1 | |||
typedef int _Atomic_word; | |||
// This is a memory order acquire fence. | |||
#define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE) | |||
// This is a memory order release fence. | |||
#define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE) | |||
#endif |
@@ -0,0 +1,135 @@ | |||
// Wrapper of C-language FILE struct -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
// | |||
// ISO C++ 14882: 27.8 File-based streams | |||
// | |||
/** @file bits/basic_file.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ios} | |||
*/ | |||
#ifndef _GLIBCXX_BASIC_FILE_STDIO_H | |||
#define _GLIBCXX_BASIC_FILE_STDIO_H 1 | |||
#pragma GCC system_header | |||
#include <bits/c++config.h> | |||
#include <bits/c++io.h> // for __c_lock and __c_file | |||
#include <bits/move.h> // for swap | |||
#include <ios> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
// Generic declaration. | |||
template<typename _CharT> | |||
class __basic_file; | |||
// Specialization. | |||
template<> | |||
class __basic_file<char> | |||
{ | |||
// Underlying data source/sink. | |||
__c_file* _M_cfile; | |||
// True iff we opened _M_cfile, and thus must close it ourselves. | |||
bool _M_cfile_created; | |||
public: | |||
__basic_file(__c_lock* __lock = 0) throw (); | |||
#if __cplusplus >= 201103L | |||
__basic_file(__basic_file&& __rv, __c_lock* = 0) noexcept | |||
: _M_cfile(__rv._M_cfile), _M_cfile_created(__rv._M_cfile_created) | |||
{ | |||
__rv._M_cfile = nullptr; | |||
__rv._M_cfile_created = false; | |||
} | |||
__basic_file& operator=(const __basic_file&) = delete; | |||
__basic_file& operator=(__basic_file&&) = delete; | |||
void | |||
swap(__basic_file& __f) noexcept | |||
{ | |||
std::swap(_M_cfile, __f._M_cfile); | |||
std::swap(_M_cfile_created, __f._M_cfile_created); | |||
} | |||
#endif | |||
__basic_file* | |||
open(const char* __name, ios_base::openmode __mode, int __prot = 0664); | |||
#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T | |||
__basic_file* | |||
open(const wchar_t* __name, ios_base::openmode __mode); | |||
#endif | |||
__basic_file* | |||
sys_open(__c_file* __file, ios_base::openmode); | |||
__basic_file* | |||
sys_open(int __fd, ios_base::openmode __mode) throw (); | |||
__basic_file* | |||
close(); | |||
_GLIBCXX_PURE bool | |||
is_open() const throw (); | |||
_GLIBCXX_PURE int | |||
fd() throw (); | |||
_GLIBCXX_PURE __c_file* | |||
file() throw (); | |||
~__basic_file(); | |||
streamsize | |||
xsputn(const char* __s, streamsize __n); | |||
streamsize | |||
xsputn_2(const char* __s1, streamsize __n1, | |||
const char* __s2, streamsize __n2); | |||
streamsize | |||
xsgetn(char* __s, streamsize __n); | |||
streamoff | |||
seekoff(streamoff __off, ios_base::seekdir __way) throw (); | |||
int | |||
sync(); | |||
streamsize | |||
showmanyc(); | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,59 @@ | |||
// Base to std::allocator -*- C++ -*- | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++allocator.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{memory} | |||
*/ | |||
#ifndef _GLIBCXX_CXX_ALLOCATOR_H | |||
#define _GLIBCXX_CXX_ALLOCATOR_H 1 | |||
#include <ext/new_allocator.h> | |||
#if __cplusplus >= 201103L | |||
namespace std | |||
{ | |||
/** | |||
* @brief An alias to the base class for std::allocator. | |||
* | |||
* Used to set the std::allocator base class to | |||
* __gnu_cxx::new_allocator. | |||
* | |||
* @ingroup allocators | |||
* @tparam _Tp Type of allocated object. | |||
*/ | |||
template<typename _Tp> | |||
using __allocator_base = __gnu_cxx::new_allocator<_Tp>; | |||
} | |||
#else | |||
// Define new_allocator as the base class to std::allocator. | |||
# define __allocator_base __gnu_cxx::new_allocator | |||
#endif | |||
#if defined(__SANITIZE_ADDRESS__) && !defined(_GLIBCXX_SANITIZE_STD_ALLOCATOR) | |||
# define _GLIBCXX_SANITIZE_STD_ALLOCATOR 1 | |||
#endif | |||
#endif |
@@ -0,0 +1,50 @@ | |||
// Underlying io library details -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++io.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ios} | |||
*/ | |||
// c_io_stdio.h - Defines for using "C" stdio.h | |||
#ifndef _GLIBCXX_CXX_IO_H | |||
#define _GLIBCXX_CXX_IO_H 1 | |||
#include <cstdio> | |||
#include <bits/gthr.h> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
typedef __gthread_mutex_t __c_lock; | |||
// for basic_file.h | |||
typedef FILE __c_file; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,92 @@ | |||
// Wrapper for underlying C-language localization -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++locale.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.8 Standard locale categories. | |||
// | |||
// Written by Benjamin Kosnik <bkoz@redhat.com> | |||
#ifndef _GLIBCXX_CXX_LOCALE_H | |||
#define _GLIBCXX_CXX_LOCALE_H 1 | |||
#pragma GCC system_header | |||
#include <clocale> | |||
#define _GLIBCXX_NUM_CATEGORIES 0 | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
typedef int* __c_locale; | |||
// Convert numeric value of type double and long double to string and | |||
// return length of string. If vsnprintf is available use it, otherwise | |||
// fall back to the unsafe vsprintf which, in general, can be dangerous | |||
// and should be avoided. | |||
inline int | |||
__convert_from_v(const __c_locale&, char* __out, | |||
const int __size __attribute__((__unused__)), | |||
const char* __fmt, ...) | |||
{ | |||
char* __old = std::setlocale(LC_NUMERIC, 0); | |||
char* __sav = 0; | |||
if (__builtin_strcmp(__old, "C")) | |||
{ | |||
const size_t __len = __builtin_strlen(__old) + 1; | |||
__sav = new char[__len]; | |||
__builtin_memcpy(__sav, __old, __len); | |||
std::setlocale(LC_NUMERIC, "C"); | |||
} | |||
__builtin_va_list __args; | |||
__builtin_va_start(__args, __fmt); | |||
#if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF | |||
const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); | |||
#else | |||
const int __ret = __builtin_vsprintf(__out, __fmt, __args); | |||
#endif | |||
__builtin_va_end(__args); | |||
if (__sav) | |||
{ | |||
std::setlocale(LC_NUMERIC, __sav); | |||
delete [] __sav; | |||
} | |||
return __ret; | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,40 @@ | |||
// Specific definitions for generic platforms -*- C++ -*- | |||
// Copyright (C) 2015-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/cpu_defines.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{iosfwd} | |||
*/ | |||
#ifndef _GLIBCXX_CPU_DEFINES | |||
#define _GLIBCXX_CPU_DEFINES 1 | |||
// Integer divide instructions don't trap on ARM. | |||
#ifdef __ARM_ARCH_EXT_IDIV__ | |||
#define __glibcxx_integral_traps false | |||
#else | |||
#define __glibcxx_integral_traps true | |||
#endif | |||
#endif |
@@ -0,0 +1,61 @@ | |||
// Locale support -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
// | |||
// ISO C++ 14882: 22.1 Locales | |||
// | |||
// Information as gleaned from /usr/include/ctype.h | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
/// @brief Base class for ctype. | |||
struct ctype_base | |||
{ | |||
// Non-standard typedefs. | |||
typedef const int* __to_type; | |||
// NB: Offsets into ctype<char>::_M_table force a particular size | |||
// on the mask type. Because of this, we don't use an enum. | |||
typedef char mask; | |||
static const mask upper = _U; | |||
static const mask lower = _L; | |||
static const mask alpha = _U | _L; | |||
static const mask digit = _N; | |||
static const mask xdigit = _X | _N; | |||
static const mask space = _S; | |||
static const mask print = _P | _U | _L | _N | _B; | |||
static const mask graph = _P | _U | _L | _N; | |||
static const mask cntrl = _C; | |||
static const mask punct = _P; | |||
static const mask alnum = _U | _L | _N; | |||
#if __cplusplus >= 201103L | |||
static const mask blank = space; | |||
#endif | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,74 @@ | |||
// Locale support -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/ctype_inline.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.1 Locales | |||
// | |||
// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) | |||
// functions go in ctype.cc | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
bool | |||
ctype<char>:: | |||
is(mask __m, char __c) const | |||
{ return _M_table[static_cast<unsigned char>(__c)] & __m; } | |||
const char* | |||
ctype<char>:: | |||
is(const char* __low, const char* __high, mask* __vec) const | |||
{ | |||
while (__low < __high) | |||
*__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; | |||
return __high; | |||
} | |||
const char* | |||
ctype<char>:: | |||
scan_is(mask __m, const char* __low, const char* __high) const | |||
{ | |||
while (__low < __high && !this->is(__m, *__low)) | |||
++__low; | |||
return __low; | |||
} | |||
const char* | |||
ctype<char>:: | |||
scan_not(mask __m, const char* __low, const char* __high) const | |||
{ | |||
while (__low < __high && this->is(__m, *__low) != 0) | |||
++__low; | |||
return __low; | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,82 @@ | |||
// Control various target specific ABI tweaks. ARM version. | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/cxxabi_tweaks.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{cxxabi.h} | |||
*/ | |||
#ifndef _CXXABI_TWEAKS_H | |||
#define _CXXABI_TWEAKS_H 1 | |||
#ifdef __cplusplus | |||
namespace __cxxabiv1 | |||
{ | |||
extern "C" | |||
{ | |||
#endif | |||
#ifdef __ARM_EABI__ | |||
// The ARM EABI uses the least significant bit of a 32-bit | |||
// guard variable. */ | |||
#define _GLIBCXX_GUARD_TEST(x) ((*(x) & 1) != 0) | |||
#define _GLIBCXX_GUARD_SET(x) *(x) = 1 | |||
#define _GLIBCXX_GUARD_BIT 1 | |||
#define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||
#define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||
typedef int __guard; | |||
// We also want the element size in array cookies. | |||
#define _GLIBCXX_ELTSIZE_IN_COOKIE 1 | |||
// __cxa_vec_ctor should return a pointer to the array. | |||
typedef void * __cxa_vec_ctor_return_type; | |||
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return x | |||
// Constructors and destructors return the "this" pointer. | |||
typedef void * __cxa_cdtor_return_type; | |||
#else // __ARM_EABI__ | |||
// The generic ABI uses the first byte of a 64-bit guard variable. | |||
#define _GLIBCXX_GUARD_TEST(x) (*(char *) (x) != 0) | |||
#define _GLIBCXX_GUARD_SET(x) *(char *) (x) = 1 | |||
#define _GLIBCXX_GUARD_BIT __guard_test_bit (0, 1) | |||
#define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||
#define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||
__extension__ typedef int __guard __attribute__((mode (__DI__))); | |||
// __cxa_vec_ctor has void return type. | |||
typedef void __cxa_vec_ctor_return_type; | |||
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return | |||
// Constructors and destructors do not return a value. | |||
typedef void __cxa_cdtor_return_type; | |||
#endif //!__ARM_EABI__ | |||
#ifdef __cplusplus | |||
} | |||
} // namespace __cxxabiv1 | |||
#endif | |||
#endif |
@@ -0,0 +1,178 @@ | |||
// Specific definitions for generic platforms -*- C++ -*- | |||
// Copyright (C) 2007-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/error_constants.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{system_error} | |||
*/ | |||
#ifndef _GLIBCXX_ERROR_CONSTANTS | |||
#define _GLIBCXX_ERROR_CONSTANTS 1 | |||
#include <bits/c++config.h> | |||
#include <cerrno> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
enum class errc | |||
{ | |||
address_family_not_supported = EAFNOSUPPORT, | |||
address_in_use = EADDRINUSE, | |||
address_not_available = EADDRNOTAVAIL, | |||
already_connected = EISCONN, | |||
argument_list_too_long = E2BIG, | |||
argument_out_of_domain = EDOM, | |||
bad_address = EFAULT, | |||
bad_file_descriptor = EBADF, | |||
#ifdef _GLIBCXX_HAVE_EBADMSG | |||
bad_message = EBADMSG, | |||
#endif | |||
broken_pipe = EPIPE, | |||
connection_aborted = ECONNABORTED, | |||
connection_already_in_progress = EALREADY, | |||
connection_refused = ECONNREFUSED, | |||
connection_reset = ECONNRESET, | |||
cross_device_link = EXDEV, | |||
destination_address_required = EDESTADDRREQ, | |||
device_or_resource_busy = EBUSY, | |||
directory_not_empty = ENOTEMPTY, | |||
executable_format_error = ENOEXEC, | |||
file_exists = EEXIST, | |||
file_too_large = EFBIG, | |||
filename_too_long = ENAMETOOLONG, | |||
function_not_supported = ENOSYS, | |||
host_unreachable = EHOSTUNREACH, | |||
#ifdef _GLIBCXX_HAVE_EIDRM | |||
identifier_removed = EIDRM, | |||
#endif | |||
illegal_byte_sequence = EILSEQ, | |||
inappropriate_io_control_operation = ENOTTY, | |||
interrupted = EINTR, | |||
invalid_argument = EINVAL, | |||
invalid_seek = ESPIPE, | |||
io_error = EIO, | |||
is_a_directory = EISDIR, | |||
message_size = EMSGSIZE, | |||
network_down = ENETDOWN, | |||
network_reset = ENETRESET, | |||
network_unreachable = ENETUNREACH, | |||
no_buffer_space = ENOBUFS, | |||
no_child_process = ECHILD, | |||
#ifdef _GLIBCXX_HAVE_ENOLINK | |||
no_link = ENOLINK, | |||
#endif | |||
no_lock_available = ENOLCK, | |||
#ifdef _GLIBCXX_HAVE_ENODATA | |||
no_message_available = ENODATA, | |||
#endif | |||
no_message = ENOMSG, | |||
no_protocol_option = ENOPROTOOPT, | |||
no_space_on_device = ENOSPC, | |||
#ifdef _GLIBCXX_HAVE_ENOSR | |||
no_stream_resources = ENOSR, | |||
#endif | |||
no_such_device_or_address = ENXIO, | |||
no_such_device = ENODEV, | |||
no_such_file_or_directory = ENOENT, | |||
no_such_process = ESRCH, | |||
not_a_directory = ENOTDIR, | |||
not_a_socket = ENOTSOCK, | |||
#ifdef _GLIBCXX_HAVE_ENOSTR | |||
not_a_stream = ENOSTR, | |||
#endif | |||
not_connected = ENOTCONN, | |||
not_enough_memory = ENOMEM, | |||
#ifdef _GLIBCXX_HAVE_ENOTSUP | |||
not_supported = ENOTSUP, | |||
#endif | |||
#ifdef _GLIBCXX_HAVE_ECANCELED | |||
operation_canceled = ECANCELED, | |||
#endif | |||
operation_in_progress = EINPROGRESS, | |||
operation_not_permitted = EPERM, | |||
operation_not_supported = EOPNOTSUPP, | |||
operation_would_block = EWOULDBLOCK, | |||
#ifdef _GLIBCXX_HAVE_EOWNERDEAD | |||
owner_dead = EOWNERDEAD, | |||
#endif | |||
permission_denied = EACCES, | |||
#ifdef _GLIBCXX_HAVE_EPROTO | |||
protocol_error = EPROTO, | |||
#endif | |||
protocol_not_supported = EPROTONOSUPPORT, | |||
read_only_file_system = EROFS, | |||
resource_deadlock_would_occur = EDEADLK, | |||
resource_unavailable_try_again = EAGAIN, | |||
result_out_of_range = ERANGE, | |||
#ifdef _GLIBCXX_HAVE_ENOTRECOVERABLE | |||
state_not_recoverable = ENOTRECOVERABLE, | |||
#endif | |||
#ifdef _GLIBCXX_HAVE_ETIME | |||
stream_timeout = ETIME, | |||
#endif | |||
#ifdef _GLIBCXX_HAVE_ETXTBSY | |||
text_file_busy = ETXTBSY, | |||
#endif | |||
timed_out = ETIMEDOUT, | |||
too_many_files_open_in_system = ENFILE, | |||
too_many_files_open = EMFILE, | |||
too_many_links = EMLINK, | |||
too_many_symbolic_link_levels = ELOOP, | |||
#ifdef _GLIBCXX_HAVE_EOVERFLOW | |||
value_too_large = EOVERFLOW, | |||
#endif | |||
wrong_protocol_type = EPROTOTYPE | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,83 @@ | |||
// C++ includes used for precompiling extensions -*- C++ -*- | |||
// Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file extc++.h | |||
* This is an implementation file for a precompiled header. | |||
*/ | |||
#if __cplusplus < 201103L | |||
#include <bits/stdtr1c++.h> | |||
#else | |||
#include <bits/stdc++.h> | |||
#endif | |||
#include <ext/algorithm> | |||
#if __cplusplus >= 201103L | |||
# include <ext/aligned_buffer.h> | |||
#endif | |||
#include <ext/alloc_traits.h> | |||
#include <ext/atomicity.h> | |||
#include <ext/bitmap_allocator.h> | |||
#include <ext/cast.h> | |||
#if __cplusplus >= 201103L | |||
# include <ext/cmath> | |||
#endif | |||
#include <ext/concurrence.h> | |||
#include <ext/debug_allocator.h> | |||
#include <ext/extptr_allocator.h> | |||
#include <ext/functional> | |||
#include <ext/iterator> | |||
#include <ext/malloc_allocator.h> | |||
#include <ext/memory> | |||
#include <ext/mt_allocator.h> | |||
#include <ext/new_allocator.h> | |||
#include <ext/numeric> | |||
#include <ext/numeric_traits.h> | |||
#include <ext/pod_char_traits.h> | |||
#include <ext/pointer.h> | |||
#include <ext/pool_allocator.h> | |||
#if __cplusplus >= 201103L | |||
# include <ext/random> | |||
#endif | |||
#include <ext/rb_tree> | |||
#include <ext/rope> | |||
#include <ext/slist> | |||
#include <ext/stdio_filebuf.h> | |||
#include <ext/stdio_sync_filebuf.h> | |||
#include <ext/throw_allocator.h> | |||
#include <ext/typelist.h> | |||
#include <ext/type_traits.h> | |||
#include <ext/vstring.h> | |||
#include <ext/pb_ds/assoc_container.hpp> | |||
#include <ext/pb_ds/priority_queue.hpp> | |||
#include <ext/pb_ds/exception.hpp> | |||
#include <ext/pb_ds/hash_policy.hpp> | |||
#include <ext/pb_ds/list_update_policy.hpp> | |||
#include <ext/pb_ds/tree_policy.hpp> | |||
#include <ext/pb_ds/trie_policy.hpp> | |||
#ifdef _GLIBCXX_HAVE_ICONV | |||
#include <ext/codecvt_specializations.h> | |||
#include <ext/enc_filebuf.h> | |||
#endif |
@@ -0,0 +1,298 @@ | |||
/* Threads compatibility routines for libgcc2 and libobjc. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||
#define _GLIBCXX_GCC_GTHR_SINGLE_H | |||
/* Just provide compatibility for mutex handling. */ | |||
typedef int __gthread_key_t; | |||
typedef int __gthread_once_t; | |||
typedef int __gthread_mutex_t; | |||
typedef int __gthread_recursive_mutex_t; | |||
#define __GTHREAD_ONCE_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||
#define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||
#ifdef _LIBOBJC | |||
/* Thread local storage for a single thread */ | |||
static void *thread_local_storage = NULL; | |||
/* Backend initialization functions */ | |||
/* Initialize the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_init_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Close the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_close_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Backend thread functions */ | |||
/* Create a new thread of execution. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return NULL; | |||
} | |||
/* Set the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Return the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_get_priority (void) | |||
{ | |||
return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||
} | |||
/* Yield our process time to another thread. */ | |||
static inline void | |||
__gthread_objc_thread_yield (void) | |||
{ | |||
return; | |||
} | |||
/* Terminate the current thread. */ | |||
static inline int | |||
__gthread_objc_thread_exit (void) | |||
{ | |||
/* No thread support available */ | |||
/* Should we really exit the program */ | |||
/* exit (&__objc_thread_exit_status); */ | |||
return -1; | |||
} | |||
/* Returns an integer value which uniquely describes a thread. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_id (void) | |||
{ | |||
/* No thread support, use 1. */ | |||
return (objc_thread_t) 1; | |||
} | |||
/* Sets the thread's local storage pointer. */ | |||
static inline int | |||
__gthread_objc_thread_set_data (void *value) | |||
{ | |||
thread_local_storage = value; | |||
return 0; | |||
} | |||
/* Returns the thread's local storage pointer. */ | |||
static inline void * | |||
__gthread_objc_thread_get_data (void) | |||
{ | |||
return thread_local_storage; | |||
} | |||
/* Backend mutex functions */ | |||
/* Allocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Try to grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Unlock the mutex */ | |||
static inline int | |||
__gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Backend condition mutex functions */ | |||
/* Allocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wait on the condition */ | |||
static inline int | |||
__gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||
objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up all threads waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up one thread waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
#else /* _LIBOBJC */ | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int _GLIBCXX_UNUSED | |||
__gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static int _GLIBCXX_UNUSED | |||
__gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline void * | |||
__gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_lock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_trylock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_unlock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_destroy (__mutex); | |||
} | |||
#endif /* _LIBOBJC */ | |||
#undef _GLIBCXX_UNUSED | |||
#endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ |
@@ -0,0 +1,890 @@ | |||
/* Threads compatibility routines for libgcc2 and libobjc. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_POSIX_H | |||
#define _GLIBCXX_GCC_GTHR_POSIX_H | |||
/* POSIX threads specific definitions. | |||
Easy, since the interface is just one-to-one mapping. */ | |||
#define __GTHREADS 1 | |||
#define __GTHREADS_CXX0X 1 | |||
#include <pthread.h> | |||
#if ((defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)) \ | |||
|| !defined(_GTHREAD_USE_MUTEX_TIMEDLOCK)) | |||
# include <unistd.h> | |||
# if defined(_POSIX_TIMEOUTS) && _POSIX_TIMEOUTS >= 0 | |||
# define _GTHREAD_USE_MUTEX_TIMEDLOCK 1 | |||
# else | |||
# define _GTHREAD_USE_MUTEX_TIMEDLOCK 0 | |||
# endif | |||
#endif | |||
typedef pthread_t __gthread_t; | |||
typedef pthread_key_t __gthread_key_t; | |||
typedef pthread_once_t __gthread_once_t; | |||
typedef pthread_mutex_t __gthread_mutex_t; | |||
typedef pthread_mutex_t __gthread_recursive_mutex_t; | |||
typedef pthread_cond_t __gthread_cond_t; | |||
typedef struct timespec __gthread_time_t; | |||
/* POSIX like conditional variables are supported. Please look at comments | |||
in gthr.h for details. */ | |||
#define __GTHREAD_HAS_COND 1 | |||
#define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER | |||
#define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function | |||
#define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT | |||
#if defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER | |||
#elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP | |||
#else | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||
#endif | |||
#define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER | |||
#define __GTHREAD_TIME_INIT {0,0} | |||
#ifdef _GTHREAD_USE_MUTEX_INIT_FUNC | |||
# undef __GTHREAD_MUTEX_INIT | |||
#endif | |||
#ifdef _GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC | |||
# undef __GTHREAD_RECURSIVE_MUTEX_INIT | |||
# undef __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||
# define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||
#endif | |||
#ifdef _GTHREAD_USE_COND_INIT_FUNC | |||
# undef __GTHREAD_COND_INIT | |||
# define __GTHREAD_COND_INIT_FUNCTION __gthread_cond_init_function | |||
#endif | |||
#if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||
# ifndef __gthrw_pragma | |||
# define __gthrw_pragma(pragma) | |||
# endif | |||
# define __gthrw2(name,name2,type) \ | |||
static __typeof(type) name \ | |||
__attribute__ ((__weakref__(#name2), __copy__ (type))); \ | |||
__gthrw_pragma(weak type) | |||
# define __gthrw_(name) __gthrw_ ## name | |||
#else | |||
# define __gthrw2(name,name2,type) | |||
# define __gthrw_(name) name | |||
#endif | |||
/* Typically, __gthrw_foo is a weak reference to symbol foo. */ | |||
#define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name) | |||
__gthrw(pthread_once) | |||
__gthrw(pthread_getspecific) | |||
__gthrw(pthread_setspecific) | |||
__gthrw(pthread_create) | |||
__gthrw(pthread_join) | |||
__gthrw(pthread_equal) | |||
__gthrw(pthread_self) | |||
__gthrw(pthread_detach) | |||
#ifndef __BIONIC__ | |||
__gthrw(pthread_cancel) | |||
#endif | |||
__gthrw(sched_yield) | |||
__gthrw(pthread_mutex_lock) | |||
__gthrw(pthread_mutex_trylock) | |||
#if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||
__gthrw(pthread_mutex_timedlock) | |||
#endif | |||
__gthrw(pthread_mutex_unlock) | |||
__gthrw(pthread_mutex_init) | |||
__gthrw(pthread_mutex_destroy) | |||
__gthrw(pthread_cond_init) | |||
__gthrw(pthread_cond_broadcast) | |||
__gthrw(pthread_cond_signal) | |||
__gthrw(pthread_cond_wait) | |||
__gthrw(pthread_cond_timedwait) | |||
__gthrw(pthread_cond_destroy) | |||
__gthrw(pthread_key_create) | |||
__gthrw(pthread_key_delete) | |||
__gthrw(pthread_mutexattr_init) | |||
__gthrw(pthread_mutexattr_settype) | |||
__gthrw(pthread_mutexattr_destroy) | |||
#if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK) | |||
/* Objective-C. */ | |||
__gthrw(pthread_exit) | |||
#ifdef _POSIX_PRIORITY_SCHEDULING | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
__gthrw(sched_get_priority_max) | |||
__gthrw(sched_get_priority_min) | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _POSIX_PRIORITY_SCHEDULING */ | |||
__gthrw(pthread_attr_destroy) | |||
__gthrw(pthread_attr_init) | |||
__gthrw(pthread_attr_setdetachstate) | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
__gthrw(pthread_getschedparam) | |||
__gthrw(pthread_setschedparam) | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _LIBOBJC || _LIBOBJC_WEAK */ | |||
#if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||
/* On Solaris 2.6 up to 9, the libc exposes a POSIX threads interface even if | |||
-pthreads is not specified. The functions are dummies and most return an | |||
error value. However pthread_once returns 0 without invoking the routine | |||
it is passed so we cannot pretend that the interface is active if -pthreads | |||
is not specified. On Solaris 2.5.1, the interface is not exposed at all so | |||
we need to play the usual game with weak symbols. On Solaris 10 and up, a | |||
working interface is always exposed. On FreeBSD 6 and later, libc also | |||
exposes a dummy POSIX threads interface, similar to what Solaris 2.6 up | |||
to 9 does. FreeBSD >= 700014 even provides a pthread_cancel stub in libc, | |||
which means the alternate __gthread_active_p below cannot be used there. */ | |||
#if defined(__FreeBSD__) || (defined(__sun) && defined(__svr4__)) | |||
static volatile int __gthread_active = -1; | |||
static void | |||
__gthread_trigger (void) | |||
{ | |||
__gthread_active = 1; | |||
} | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER; | |||
static pthread_once_t __gthread_active_once = PTHREAD_ONCE_INIT; | |||
/* Avoid reading __gthread_active twice on the main code path. */ | |||
int __gthread_active_latest_value = __gthread_active; | |||
/* This test is not protected to avoid taking a lock on the main code | |||
path so every update of __gthread_active in a threaded program must | |||
be atomic with regard to the result of the test. */ | |||
if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||
{ | |||
if (__gthrw_(pthread_once)) | |||
{ | |||
/* If this really is a threaded program, then we must ensure that | |||
__gthread_active has been set to 1 before exiting this block. */ | |||
__gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); | |||
__gthrw_(pthread_once) (&__gthread_active_once, __gthread_trigger); | |||
__gthrw_(pthread_mutex_unlock) (&__gthread_active_mutex); | |||
} | |||
/* Make sure we'll never enter this block again. */ | |||
if (__gthread_active < 0) | |||
__gthread_active = 0; | |||
__gthread_active_latest_value = __gthread_active; | |||
} | |||
return __gthread_active_latest_value != 0; | |||
} | |||
#else /* neither FreeBSD nor Solaris */ | |||
/* For a program to be multi-threaded the only thing that it certainly must | |||
be using is pthread_create. However, there may be other libraries that | |||
intercept pthread_create with their own definitions to wrap pthreads | |||
functionality for some purpose. In those cases, pthread_create being | |||
defined might not necessarily mean that libpthread is actually linked | |||
in. | |||
For the GNU C library, we can use a known internal name. This is always | |||
available in the ABI, but no other library would define it. That is | |||
ideal, since any public pthread function might be intercepted just as | |||
pthread_create might be. __pthread_key_create is an "internal" | |||
implementation symbol, but it is part of the public exported ABI. Also, | |||
it's among the symbols that the static libpthread.a always links in | |||
whenever pthread_create is used, so there is no danger of a false | |||
negative result in any statically-linked, multi-threaded program. | |||
For others, we choose pthread_cancel as a function that seems unlikely | |||
to be redefined by an interceptor library. The bionic (Android) C | |||
library does not provide pthread_cancel, so we do use pthread_create | |||
there (and interceptor libraries lose). */ | |||
#ifdef __GLIBC__ | |||
__gthrw2(__gthrw_(__pthread_key_create), | |||
__pthread_key_create, | |||
pthread_key_create) | |||
# define GTHR_ACTIVE_PROXY __gthrw_(__pthread_key_create) | |||
#elif defined (__BIONIC__) | |||
# define GTHR_ACTIVE_PROXY __gthrw_(pthread_create) | |||
#else | |||
# define GTHR_ACTIVE_PROXY __gthrw_(pthread_cancel) | |||
#endif | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
static void *const __gthread_active_ptr | |||
= __extension__ (void *) >HR_ACTIVE_PROXY; | |||
return __gthread_active_ptr != 0; | |||
} | |||
#endif /* FreeBSD or Solaris */ | |||
#else /* not __GXX_WEAK__ */ | |||
/* Similar to Solaris, HP-UX 11 for PA-RISC provides stubs for pthread | |||
calls in shared flavors of the HP-UX C library. Most of the stubs | |||
have no functionality. The details are described in the "libc cumulative | |||
patch" for each subversion of HP-UX 11. There are two special interfaces | |||
provided for checking whether an application is linked to a shared pthread | |||
library or not. However, these interfaces aren't available in early | |||
libpthread libraries. We also need a test that works for archive | |||
libraries. We can't use pthread_once as some libc versions call the | |||
init function. We also can't use pthread_create or pthread_attr_init | |||
as these create a thread and thereby prevent changing the default stack | |||
size. The function pthread_default_stacksize_np is available in both | |||
the archive and shared versions of libpthread. It can be used to | |||
determine the default pthread stack size. There is a stub in some | |||
shared libc versions which returns a zero size if pthreads are not | |||
active. We provide an equivalent stub to handle cases where libc | |||
doesn't provide one. */ | |||
#if defined(__hppa__) && defined(__hpux__) | |||
static volatile int __gthread_active = -1; | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
/* Avoid reading __gthread_active twice on the main code path. */ | |||
int __gthread_active_latest_value = __gthread_active; | |||
size_t __s; | |||
if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||
{ | |||
pthread_default_stacksize_np (0, &__s); | |||
__gthread_active = __s ? 1 : 0; | |||
__gthread_active_latest_value = __gthread_active; | |||
} | |||
return __gthread_active_latest_value != 0; | |||
} | |||
#else /* not hppa-hpux */ | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
return 1; | |||
} | |||
#endif /* hppa-hpux */ | |||
#endif /* __GXX_WEAK__ */ | |||
#ifdef _LIBOBJC | |||
/* This is the config.h file in libobjc/ */ | |||
#include <config.h> | |||
#ifdef HAVE_SCHED_H | |||
# include <sched.h> | |||
#endif | |||
/* Key structure for maintaining thread specific storage */ | |||
static pthread_key_t _objc_thread_storage; | |||
static pthread_attr_t _objc_thread_attribs; | |||
/* Thread local storage for a single thread */ | |||
static void *thread_local_storage = NULL; | |||
/* Backend initialization functions */ | |||
/* Initialize the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_init_thread_system (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
/* Initialize the thread storage key. */ | |||
if (__gthrw_(pthread_key_create) (&_objc_thread_storage, NULL) == 0) | |||
{ | |||
/* The normal default detach state for threads is | |||
* PTHREAD_CREATE_JOINABLE which causes threads to not die | |||
* when you think they should. */ | |||
if (__gthrw_(pthread_attr_init) (&_objc_thread_attribs) == 0 | |||
&& __gthrw_(pthread_attr_setdetachstate) (&_objc_thread_attribs, | |||
PTHREAD_CREATE_DETACHED) == 0) | |||
return 0; | |||
} | |||
} | |||
return -1; | |||
} | |||
/* Close the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_close_thread_system (void) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_key_delete) (_objc_thread_storage) == 0 | |||
&& __gthrw_(pthread_attr_destroy) (&_objc_thread_attribs) == 0) | |||
return 0; | |||
return -1; | |||
} | |||
/* Backend thread functions */ | |||
/* Create a new thread of execution. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_detach (void (*func)(void *), void *arg) | |||
{ | |||
objc_thread_t thread_id; | |||
pthread_t new_thread_handle; | |||
if (!__gthread_active_p ()) | |||
return NULL; | |||
if (!(__gthrw_(pthread_create) (&new_thread_handle, &_objc_thread_attribs, | |||
(void *) func, arg))) | |||
thread_id = (objc_thread_t) new_thread_handle; | |||
else | |||
thread_id = NULL; | |||
return thread_id; | |||
} | |||
/* Set the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_set_priority (int priority) | |||
{ | |||
if (!__gthread_active_p ()) | |||
return -1; | |||
else | |||
{ | |||
#ifdef _POSIX_PRIORITY_SCHEDULING | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
pthread_t thread_id = __gthrw_(pthread_self) (); | |||
int policy; | |||
struct sched_param params; | |||
int priority_min, priority_max; | |||
if (__gthrw_(pthread_getschedparam) (thread_id, &policy, ¶ms) == 0) | |||
{ | |||
if ((priority_max = __gthrw_(sched_get_priority_max) (policy)) == -1) | |||
return -1; | |||
if ((priority_min = __gthrw_(sched_get_priority_min) (policy)) == -1) | |||
return -1; | |||
if (priority > priority_max) | |||
priority = priority_max; | |||
else if (priority < priority_min) | |||
priority = priority_min; | |||
params.sched_priority = priority; | |||
/* | |||
* The solaris 7 and several other man pages incorrectly state that | |||
* this should be a pointer to policy but pthread.h is universally | |||
* at odds with this. | |||
*/ | |||
if (__gthrw_(pthread_setschedparam) (thread_id, policy, ¶ms) == 0) | |||
return 0; | |||
} | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _POSIX_PRIORITY_SCHEDULING */ | |||
return -1; | |||
} | |||
} | |||
/* Return the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_get_priority (void) | |||
{ | |||
#ifdef _POSIX_PRIORITY_SCHEDULING | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
if (__gthread_active_p ()) | |||
{ | |||
int policy; | |||
struct sched_param params; | |||
if (__gthrw_(pthread_getschedparam) (__gthrw_(pthread_self) (), &policy, ¶ms) == 0) | |||
return params.sched_priority; | |||
else | |||
return -1; | |||
} | |||
else | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _POSIX_PRIORITY_SCHEDULING */ | |||
return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||
} | |||
/* Yield our process time to another thread. */ | |||
static inline void | |||
__gthread_objc_thread_yield (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
__gthrw_(sched_yield) (); | |||
} | |||
/* Terminate the current thread. */ | |||
static inline int | |||
__gthread_objc_thread_exit (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
/* exit the thread */ | |||
__gthrw_(pthread_exit) (&__objc_thread_exit_status); | |||
/* Failed if we reached here */ | |||
return -1; | |||
} | |||
/* Returns an integer value which uniquely describes a thread. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_id (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
return (objc_thread_t) __gthrw_(pthread_self) (); | |||
else | |||
return (objc_thread_t) 1; | |||
} | |||
/* Sets the thread's local storage pointer. */ | |||
static inline int | |||
__gthread_objc_thread_set_data (void *value) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_setspecific) (_objc_thread_storage, value); | |||
else | |||
{ | |||
thread_local_storage = value; | |||
return 0; | |||
} | |||
} | |||
/* Returns the thread's local storage pointer. */ | |||
static inline void * | |||
__gthread_objc_thread_get_data (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_getspecific) (_objc_thread_storage); | |||
else | |||
return thread_local_storage; | |||
} | |||
/* Backend mutex functions */ | |||
/* Allocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_allocate (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
mutex->backend = objc_malloc (sizeof (pthread_mutex_t)); | |||
if (__gthrw_(pthread_mutex_init) ((pthread_mutex_t *) mutex->backend, NULL)) | |||
{ | |||
objc_free (mutex->backend); | |||
mutex->backend = NULL; | |||
return -1; | |||
} | |||
} | |||
return 0; | |||
} | |||
/* Deallocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_deallocate (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
int count; | |||
/* | |||
* Posix Threads specifically require that the thread be unlocked | |||
* for __gthrw_(pthread_mutex_destroy) to work. | |||
*/ | |||
do | |||
{ | |||
count = __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend); | |||
if (count < 0) | |||
return -1; | |||
} | |||
while (count); | |||
if (__gthrw_(pthread_mutex_destroy) ((pthread_mutex_t *) mutex->backend)) | |||
return -1; | |||
objc_free (mutex->backend); | |||
mutex->backend = NULL; | |||
} | |||
return 0; | |||
} | |||
/* Grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_lock (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_mutex_lock) ((pthread_mutex_t *) mutex->backend) != 0) | |||
{ | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
/* Try to grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_trylock (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_mutex_trylock) ((pthread_mutex_t *) mutex->backend) != 0) | |||
{ | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
/* Unlock the mutex */ | |||
static inline int | |||
__gthread_objc_mutex_unlock (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend) != 0) | |||
{ | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
/* Backend condition mutex functions */ | |||
/* Allocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_allocate (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
condition->backend = objc_malloc (sizeof (pthread_cond_t)); | |||
if (__gthrw_(pthread_cond_init) ((pthread_cond_t *) condition->backend, NULL)) | |||
{ | |||
objc_free (condition->backend); | |||
condition->backend = NULL; | |||
return -1; | |||
} | |||
} | |||
return 0; | |||
} | |||
/* Deallocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_deallocate (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
if (__gthrw_(pthread_cond_destroy) ((pthread_cond_t *) condition->backend)) | |||
return -1; | |||
objc_free (condition->backend); | |||
condition->backend = NULL; | |||
} | |||
return 0; | |||
} | |||
/* Wait on the condition */ | |||
static inline int | |||
__gthread_objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_cond_wait) ((pthread_cond_t *) condition->backend, | |||
(pthread_mutex_t *) mutex->backend); | |||
else | |||
return 0; | |||
} | |||
/* Wake up all threads waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_broadcast (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_cond_broadcast) ((pthread_cond_t *) condition->backend); | |||
else | |||
return 0; | |||
} | |||
/* Wake up one thread waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_signal (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_cond_signal) ((pthread_cond_t *) condition->backend); | |||
else | |||
return 0; | |||
} | |||
#else /* _LIBOBJC */ | |||
static inline int | |||
__gthread_create (__gthread_t *__threadid, void *(*__func) (void*), | |||
void *__args) | |||
{ | |||
return __gthrw_(pthread_create) (__threadid, NULL, __func, __args); | |||
} | |||
static inline int | |||
__gthread_join (__gthread_t __threadid, void **__value_ptr) | |||
{ | |||
return __gthrw_(pthread_join) (__threadid, __value_ptr); | |||
} | |||
static inline int | |||
__gthread_detach (__gthread_t __threadid) | |||
{ | |||
return __gthrw_(pthread_detach) (__threadid); | |||
} | |||
static inline int | |||
__gthread_equal (__gthread_t __t1, __gthread_t __t2) | |||
{ | |||
return __gthrw_(pthread_equal) (__t1, __t2); | |||
} | |||
static inline __gthread_t | |||
__gthread_self (void) | |||
{ | |||
return __gthrw_(pthread_self) (); | |||
} | |||
static inline int | |||
__gthread_yield (void) | |||
{ | |||
return __gthrw_(sched_yield) (); | |||
} | |||
static inline int | |||
__gthread_once (__gthread_once_t *__once, void (*__func) (void)) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_once) (__once, __func); | |||
else | |||
return -1; | |||
} | |||
static inline int | |||
__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) | |||
{ | |||
return __gthrw_(pthread_key_create) (__key, __dtor); | |||
} | |||
static inline int | |||
__gthread_key_delete (__gthread_key_t __key) | |||
{ | |||
return __gthrw_(pthread_key_delete) (__key); | |||
} | |||
static inline void * | |||
__gthread_getspecific (__gthread_key_t __key) | |||
{ | |||
return __gthrw_(pthread_getspecific) (__key); | |||
} | |||
static inline int | |||
__gthread_setspecific (__gthread_key_t __key, const void *__ptr) | |||
{ | |||
return __gthrw_(pthread_setspecific) (__key, __ptr); | |||
} | |||
static inline void | |||
__gthread_mutex_init_function (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
__gthrw_(pthread_mutex_init) (__mutex, NULL); | |||
} | |||
static inline int | |||
__gthread_mutex_destroy (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_destroy) (__mutex); | |||
else | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_lock (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_lock) (__mutex); | |||
else | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_trylock (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_trylock) (__mutex); | |||
else | |||
return 0; | |||
} | |||
#if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||
static inline int | |||
__gthread_mutex_timedlock (__gthread_mutex_t *__mutex, | |||
const __gthread_time_t *__abs_timeout) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_timedlock) (__mutex, __abs_timeout); | |||
else | |||
return 0; | |||
} | |||
#endif | |||
static inline int | |||
__gthread_mutex_unlock (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_unlock) (__mutex); | |||
else | |||
return 0; | |||
} | |||
#if !defined( PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) \ | |||
|| defined(_GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC) | |||
static inline int | |||
__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
pthread_mutexattr_t __attr; | |||
int __r; | |||
__r = __gthrw_(pthread_mutexattr_init) (&__attr); | |||
if (!__r) | |||
__r = __gthrw_(pthread_mutexattr_settype) (&__attr, | |||
PTHREAD_MUTEX_RECURSIVE); | |||
if (!__r) | |||
__r = __gthrw_(pthread_mutex_init) (__mutex, &__attr); | |||
if (!__r) | |||
__r = __gthrw_(pthread_mutexattr_destroy) (&__attr); | |||
return __r; | |||
} | |||
return 0; | |||
} | |||
#endif | |||
static inline int | |||
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_lock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_trylock (__mutex); | |||
} | |||
#if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||
static inline int | |||
__gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex, | |||
const __gthread_time_t *__abs_timeout) | |||
{ | |||
return __gthread_mutex_timedlock (__mutex, __abs_timeout); | |||
} | |||
#endif | |||
static inline int | |||
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_unlock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_destroy (__mutex); | |||
} | |||
#ifdef _GTHREAD_USE_COND_INIT_FUNC | |||
static inline void | |||
__gthread_cond_init_function (__gthread_cond_t *__cond) | |||
{ | |||
if (__gthread_active_p ()) | |||
__gthrw_(pthread_cond_init) (__cond, NULL); | |||
} | |||
#endif | |||
static inline int | |||
__gthread_cond_broadcast (__gthread_cond_t *__cond) | |||
{ | |||
return __gthrw_(pthread_cond_broadcast) (__cond); | |||
} | |||
static inline int | |||
__gthread_cond_signal (__gthread_cond_t *__cond) | |||
{ | |||
return __gthrw_(pthread_cond_signal) (__cond); | |||
} | |||
static inline int | |||
__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex) | |||
{ | |||
return __gthrw_(pthread_cond_wait) (__cond, __mutex); | |||
} | |||
static inline int | |||
__gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex, | |||
const __gthread_time_t *__abs_timeout) | |||
{ | |||
return __gthrw_(pthread_cond_timedwait) (__cond, __mutex, __abs_timeout); | |||
} | |||
static inline int | |||
__gthread_cond_wait_recursive (__gthread_cond_t *__cond, | |||
__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_cond_wait (__cond, __mutex); | |||
} | |||
static inline int | |||
__gthread_cond_destroy (__gthread_cond_t* __cond) | |||
{ | |||
return __gthrw_(pthread_cond_destroy) (__cond); | |||
} | |||
#endif /* _LIBOBJC */ | |||
#endif /* ! _GLIBCXX_GCC_GTHR_POSIX_H */ |
@@ -0,0 +1,298 @@ | |||
/* Threads compatibility routines for libgcc2 and libobjc. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||
#define _GLIBCXX_GCC_GTHR_SINGLE_H | |||
/* Just provide compatibility for mutex handling. */ | |||
typedef int __gthread_key_t; | |||
typedef int __gthread_once_t; | |||
typedef int __gthread_mutex_t; | |||
typedef int __gthread_recursive_mutex_t; | |||
#define __GTHREAD_ONCE_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||
#define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||
#ifdef _LIBOBJC | |||
/* Thread local storage for a single thread */ | |||
static void *thread_local_storage = NULL; | |||
/* Backend initialization functions */ | |||
/* Initialize the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_init_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Close the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_close_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Backend thread functions */ | |||
/* Create a new thread of execution. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return NULL; | |||
} | |||
/* Set the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Return the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_get_priority (void) | |||
{ | |||
return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||
} | |||
/* Yield our process time to another thread. */ | |||
static inline void | |||
__gthread_objc_thread_yield (void) | |||
{ | |||
return; | |||
} | |||
/* Terminate the current thread. */ | |||
static inline int | |||
__gthread_objc_thread_exit (void) | |||
{ | |||
/* No thread support available */ | |||
/* Should we really exit the program */ | |||
/* exit (&__objc_thread_exit_status); */ | |||
return -1; | |||
} | |||
/* Returns an integer value which uniquely describes a thread. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_id (void) | |||
{ | |||
/* No thread support, use 1. */ | |||
return (objc_thread_t) 1; | |||
} | |||
/* Sets the thread's local storage pointer. */ | |||
static inline int | |||
__gthread_objc_thread_set_data (void *value) | |||
{ | |||
thread_local_storage = value; | |||
return 0; | |||
} | |||
/* Returns the thread's local storage pointer. */ | |||
static inline void * | |||
__gthread_objc_thread_get_data (void) | |||
{ | |||
return thread_local_storage; | |||
} | |||
/* Backend mutex functions */ | |||
/* Allocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Try to grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Unlock the mutex */ | |||
static inline int | |||
__gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Backend condition mutex functions */ | |||
/* Allocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wait on the condition */ | |||
static inline int | |||
__gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||
objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up all threads waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up one thread waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
#else /* _LIBOBJC */ | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int _GLIBCXX_UNUSED | |||
__gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static int _GLIBCXX_UNUSED | |||
__gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline void * | |||
__gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_lock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_trylock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_unlock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_destroy (__mutex); | |||
} | |||
#endif /* _LIBOBJC */ | |||
#undef _GLIBCXX_UNUSED | |||
#endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ |
@@ -0,0 +1,154 @@ | |||
/* Threads compatibility routines for libgcc2. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_H | |||
#define _GLIBCXX_GCC_GTHR_H | |||
#ifndef _GLIBCXX_HIDE_EXPORTS | |||
#pragma GCC visibility push(default) | |||
#endif | |||
/* If this file is compiled with threads support, it must | |||
#define __GTHREADS 1 | |||
to indicate that threads support is present. Also it has define | |||
function | |||
int __gthread_active_p () | |||
that returns 1 if thread system is active, 0 if not. | |||
The threads interface must define the following types: | |||
__gthread_key_t | |||
__gthread_once_t | |||
__gthread_mutex_t | |||
__gthread_recursive_mutex_t | |||
The threads interface must define the following macros: | |||
__GTHREAD_ONCE_INIT | |||
to initialize __gthread_once_t | |||
__GTHREAD_MUTEX_INIT | |||
to initialize __gthread_mutex_t to get a fast | |||
non-recursive mutex. | |||
__GTHREAD_MUTEX_INIT_FUNCTION | |||
to initialize __gthread_mutex_t to get a fast | |||
non-recursive mutex. | |||
Define this to a function which looks like this: | |||
void __GTHREAD_MUTEX_INIT_FUNCTION (__gthread_mutex_t *) | |||
Some systems can't initialize a mutex without a | |||
function call. Don't define __GTHREAD_MUTEX_INIT in this case. | |||
__GTHREAD_RECURSIVE_MUTEX_INIT | |||
__GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||
as above, but for a recursive mutex. | |||
The threads interface must define the following static functions: | |||
int __gthread_once (__gthread_once_t *once, void (*func) ()) | |||
int __gthread_key_create (__gthread_key_t *keyp, void (*dtor) (void *)) | |||
int __gthread_key_delete (__gthread_key_t key) | |||
void *__gthread_getspecific (__gthread_key_t key) | |||
int __gthread_setspecific (__gthread_key_t key, const void *ptr) | |||
int __gthread_mutex_destroy (__gthread_mutex_t *mutex); | |||
int __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *mutex); | |||
int __gthread_mutex_lock (__gthread_mutex_t *mutex); | |||
int __gthread_mutex_trylock (__gthread_mutex_t *mutex); | |||
int __gthread_mutex_unlock (__gthread_mutex_t *mutex); | |||
int __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex); | |||
int __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex); | |||
int __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex); | |||
The following are supported in POSIX threads only. They are required to | |||
fix a deadlock in static initialization inside libsupc++. The header file | |||
gthr-posix.h defines a symbol __GTHREAD_HAS_COND to signify that these extra | |||
features are supported. | |||
Types: | |||
__gthread_cond_t | |||
Macros: | |||
__GTHREAD_COND_INIT | |||
__GTHREAD_COND_INIT_FUNCTION | |||
Interface: | |||
int __gthread_cond_broadcast (__gthread_cond_t *cond); | |||
int __gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex); | |||
int __gthread_cond_wait_recursive (__gthread_cond_t *cond, | |||
__gthread_recursive_mutex_t *mutex); | |||
All functions returning int should return zero on success or the error | |||
number. If the operation is not supported, -1 is returned. | |||
If the following are also defined, you should | |||
#define __GTHREADS_CXX0X 1 | |||
to enable the c++0x thread library. | |||
Types: | |||
__gthread_t | |||
__gthread_time_t | |||
Interface: | |||
int __gthread_create (__gthread_t *thread, void *(*func) (void*), | |||
void *args); | |||
int __gthread_join (__gthread_t thread, void **value_ptr); | |||
int __gthread_detach (__gthread_t thread); | |||
int __gthread_equal (__gthread_t t1, __gthread_t t2); | |||
__gthread_t __gthread_self (void); | |||
int __gthread_yield (void); | |||
int __gthread_mutex_timedlock (__gthread_mutex_t *m, | |||
const __gthread_time_t *abs_timeout); | |||
int __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *m, | |||
const __gthread_time_t *abs_time); | |||
int __gthread_cond_signal (__gthread_cond_t *cond); | |||
int __gthread_cond_timedwait (__gthread_cond_t *cond, | |||
__gthread_mutex_t *mutex, | |||
const __gthread_time_t *abs_timeout); | |||
*/ | |||
#if __GXX_WEAK__ | |||
/* The pe-coff weak support isn't fully compatible to ELF's weak. | |||
For static libraries it might would work, but as we need to deal | |||
with shared versions too, we disable it for mingw-targets. */ | |||
#ifdef __MINGW32__ | |||
#undef _GLIBCXX_GTHREAD_USE_WEAK | |||
#define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||
#endif | |||
#ifndef _GLIBCXX_GTHREAD_USE_WEAK | |||
#define _GLIBCXX_GTHREAD_USE_WEAK 1 | |||
#endif | |||
#endif | |||
#include <bits/gthr-default.h> | |||
#ifndef _GLIBCXX_HIDE_EXPORTS | |||
#pragma GCC visibility pop | |||
#endif | |||
#endif /* ! _GLIBCXX_GCC_GTHR_H */ |
@@ -0,0 +1,92 @@ | |||
// std::messages implementation details, generic version -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/messages_members.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.2.7.1.2 messages virtual functions | |||
// | |||
// Written by Benjamin Kosnik <bkoz@redhat.com> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
// Non-virtual member functions. | |||
template<typename _CharT> | |||
messages<_CharT>::messages(size_t __refs) | |||
: facet(__refs) | |||
{ _M_c_locale_messages = _S_get_c_locale(); } | |||
template<typename _CharT> | |||
messages<_CharT>::messages(__c_locale, const char*, size_t __refs) | |||
: facet(__refs) | |||
{ _M_c_locale_messages = _S_get_c_locale(); } | |||
template<typename _CharT> | |||
typename messages<_CharT>::catalog | |||
messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, | |||
const char*) const | |||
{ return this->do_open(__s, __loc); } | |||
// Virtual member functions. | |||
template<typename _CharT> | |||
messages<_CharT>::~messages() | |||
{ _S_destroy_c_locale(_M_c_locale_messages); } | |||
template<typename _CharT> | |||
typename messages<_CharT>::catalog | |||
messages<_CharT>::do_open(const basic_string<char>&, const locale&) const | |||
{ return 0; } | |||
template<typename _CharT> | |||
typename messages<_CharT>::string_type | |||
messages<_CharT>::do_get(catalog, int, int, | |||
const string_type& __dfault) const | |||
{ return __dfault; } | |||
template<typename _CharT> | |||
void | |||
messages<_CharT>::do_close(catalog) const | |||
{ } | |||
// messages_byname | |||
template<typename _CharT> | |||
messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) | |||
: messages<_CharT>(__refs) | |||
{ | |||
if (__builtin_strcmp(__s, "C") != 0 | |||
&& __builtin_strcmp(__s, "POSIX") != 0) | |||
{ | |||
this->_S_destroy_c_locale(this->_M_c_locale_messages); | |||
this->_S_create_c_locale(this->_M_c_locale_messages, __s); | |||
} | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,38 @@ | |||
// Optimizations for random number handling, generic version -*- C++ -*- | |||
// Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/opt_random.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{random} | |||
*/ | |||
#ifndef _BITS_OPT_RANDOM_H | |||
#define _BITS_OPT_RANDOM_H 1 | |||
#pragma GCC system_header | |||
#endif // _BITS_OPT_RANDOM_H |
@@ -0,0 +1,61 @@ | |||
// Specific definitions for newlib -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/os_defines.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{iosfwd} | |||
*/ | |||
#ifndef _GLIBCXX_OS_DEFINES | |||
#define _GLIBCXX_OS_DEFINES 1 | |||
// System-specific #define, typedefs, corrections, etc, go here. This | |||
// file will come before all others. | |||
#ifdef __CYGWIN__ | |||
#define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||
#if defined (_GLIBCXX_DLL) | |||
#define _GLIBCXX_PSEUDO_VISIBILITY_default __attribute__ ((__dllimport__)) | |||
#else | |||
#define _GLIBCXX_PSEUDO_VISIBILITY_default | |||
#endif | |||
#define _GLIBCXX_PSEUDO_VISIBILITY_hidden | |||
#define _GLIBCXX_PSEUDO_VISIBILITY(V) _GLIBCXX_PSEUDO_VISIBILITY_ ## V | |||
// See libstdc++/20806. | |||
#define _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM 1 | |||
// Enable use of GetModuleHandleEx (requires Windows XP/2003) in | |||
// __cxa_thread_atexit to prevent modules from being unloaded before | |||
// their dtors are called | |||
#define _GLIBCXX_THREAD_ATEXIT_WIN32 1 | |||
// See libstdc++/69506 | |||
#define _GLIBCXX_USE_WEAK_REF 0 | |||
#endif | |||
#endif |
@@ -0,0 +1,146 @@ | |||
// C++ includes used for precompiling -*- C++ -*- | |||
// Copyright (C) 2003-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file stdc++.h | |||
* This is an implementation file for a precompiled header. | |||
*/ | |||
// 17.4.1.2 Headers | |||
// C | |||
#ifndef _GLIBCXX_NO_ASSERT | |||
#include <cassert> | |||
#endif | |||
#include <cctype> | |||
#include <cerrno> | |||
#include <cfloat> | |||
#include <ciso646> | |||
#include <climits> | |||
#include <clocale> | |||
#include <cmath> | |||
#include <csetjmp> | |||
#include <csignal> | |||
#include <cstdarg> | |||
#include <cstddef> | |||
#include <cstdio> | |||
#include <cstdlib> | |||
#include <cstring> | |||
#include <ctime> | |||
#include <cwchar> | |||
#include <cwctype> | |||
#if __cplusplus >= 201103L | |||
#include <ccomplex> | |||
#include <cfenv> | |||
#include <cinttypes> | |||
#include <cstdalign> | |||
#include <cstdbool> | |||
#include <cstdint> | |||
#include <ctgmath> | |||
#include <cuchar> | |||
#endif | |||
// C++ | |||
#include <algorithm> | |||
#include <bitset> | |||
#include <complex> | |||
#include <deque> | |||
#include <exception> | |||
#include <fstream> | |||
#include <functional> | |||
#include <iomanip> | |||
#include <ios> | |||
#include <iosfwd> | |||
#include <iostream> | |||
#include <istream> | |||
#include <iterator> | |||
#include <limits> | |||
#include <list> | |||
#include <locale> | |||
#include <map> | |||
#include <memory> | |||
#include <new> | |||
#include <numeric> | |||
#include <ostream> | |||
#include <queue> | |||
#include <set> | |||
#include <sstream> | |||
#include <stack> | |||
#include <stdexcept> | |||
#include <streambuf> | |||
#include <string> | |||
#include <typeinfo> | |||
#include <utility> | |||
#include <valarray> | |||
#include <vector> | |||
#if __cplusplus >= 201103L | |||
#include <array> | |||
#include <atomic> | |||
#include <chrono> | |||
#include <codecvt> | |||
#include <condition_variable> | |||
#include <forward_list> | |||
#include <future> | |||
#include <initializer_list> | |||
#include <mutex> | |||
#include <random> | |||
#include <ratio> | |||
#include <regex> | |||
#include <scoped_allocator> | |||
#include <system_error> | |||
#include <thread> | |||
#include <tuple> | |||
#include <typeindex> | |||
#include <type_traits> | |||
#include <unordered_map> | |||
#include <unordered_set> | |||
#endif | |||
#if __cplusplus >= 201402L | |||
#include <shared_mutex> | |||
#endif | |||
#if __cplusplus >= 201703L | |||
#include <any> | |||
#include <charconv> | |||
// #include <execution> | |||
#include <filesystem> | |||
#include <optional> | |||
#include <memory_resource> | |||
#include <string_view> | |||
#include <variant> | |||
#endif | |||
#if __cplusplus > 201703L | |||
#include <bit> | |||
#include <compare> | |||
#include <concepts> | |||
#include <numbers> | |||
#include <ranges> | |||
#include <span> | |||
#include <stop_token> | |||
// #include <syncstream> | |||
#include <version> | |||
#endif |
@@ -0,0 +1,53 @@ | |||
// C++ includes used for precompiling TR1 -*- C++ -*- | |||
// Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file stdtr1c++.h | |||
* This is an implementation file for a precompiled header. | |||
*/ | |||
#include <bits/stdc++.h> | |||
#include <tr1/array> | |||
#include <tr1/cctype> | |||
#include <tr1/cfenv> | |||
#include <tr1/cfloat> | |||
#include <tr1/cinttypes> | |||
#include <tr1/climits> | |||
#include <tr1/cmath> | |||
#include <tr1/complex> | |||
#include <tr1/cstdarg> | |||
#include <tr1/cstdbool> | |||
#include <tr1/cstdint> | |||
#include <tr1/cstdio> | |||
#include <tr1/cstdlib> | |||
#include <tr1/ctgmath> | |||
#include <tr1/ctime> | |||
#include <tr1/cwchar> | |||
#include <tr1/cwctype> | |||
#include <tr1/functional> | |||
#include <tr1/random> | |||
#include <tr1/tuple> | |||
#include <tr1/unordered_map> | |||
#include <tr1/unordered_set> | |||
#include <tr1/utility> |
@@ -0,0 +1,92 @@ | |||
// std::time_get, std::time_put implementation, generic version -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/time_members.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.2.5.1.2 - time_get functions | |||
// ISO C++ 14882: 22.2.5.3.2 - time_put functions | |||
// | |||
// Written by Benjamin Kosnik <bkoz@redhat.com> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
template<typename _CharT> | |||
__timepunct<_CharT>::__timepunct(size_t __refs) | |||
: facet(__refs), _M_data(0) | |||
{ | |||
_M_name_timepunct = _S_get_c_name(); | |||
_M_initialize_timepunct(); | |||
} | |||
template<typename _CharT> | |||
__timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) | |||
: facet(__refs), _M_data(__cache) | |||
{ | |||
_M_name_timepunct = _S_get_c_name(); | |||
_M_initialize_timepunct(); | |||
} | |||
template<typename _CharT> | |||
__timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, | |||
size_t __refs) | |||
: facet(__refs), _M_data(0) | |||
{ | |||
if (__builtin_strcmp(__s, _S_get_c_name()) != 0) | |||
{ | |||
const size_t __len = __builtin_strlen(__s) + 1; | |||
char* __tmp = new char[__len]; | |||
__builtin_memcpy(__tmp, __s, __len); | |||
_M_name_timepunct = __tmp; | |||
} | |||
else | |||
_M_name_timepunct = _S_get_c_name(); | |||
__try | |||
{ _M_initialize_timepunct(__cloc); } | |||
__catch(...) | |||
{ | |||
if (_M_name_timepunct != _S_get_c_name()) | |||
delete [] _M_name_timepunct; | |||
__throw_exception_again; | |||
} | |||
} | |||
template<typename _CharT> | |||
__timepunct<_CharT>::~__timepunct() | |||
{ | |||
if (_M_name_timepunct != _S_get_c_name()) | |||
delete [] _M_name_timepunct; | |||
delete _M_data; | |||
_S_destroy_c_locale(_M_c_locale_timepunct); | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,38 @@ | |||
// Optimizations for random number extensions, generic version -*- C++ -*- | |||
// Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file ext/opt_random.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ext/random} | |||
*/ | |||
#ifndef _EXT_OPT_RANDOM_H | |||
#define _EXT_OPT_RANDOM_H 1 | |||
#pragma GCC system_header | |||
#endif // _EXT_OPT_RANDOM_H |
@@ -0,0 +1,40 @@ | |||
// Low-level type for atomic operations -*- C++ -*- | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file atomic_word.h | |||
* This file is a GNU extension to the Standard C++ Library. | |||
*/ | |||
#ifndef _GLIBCXX_ATOMIC_WORD_H | |||
#define _GLIBCXX_ATOMIC_WORD_H 1 | |||
typedef int _Atomic_word; | |||
// This is a memory order acquire fence. | |||
#define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE) | |||
// This is a memory order release fence. | |||
#define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE) | |||
#endif |
@@ -0,0 +1,135 @@ | |||
// Wrapper of C-language FILE struct -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
// | |||
// ISO C++ 14882: 27.8 File-based streams | |||
// | |||
/** @file bits/basic_file.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ios} | |||
*/ | |||
#ifndef _GLIBCXX_BASIC_FILE_STDIO_H | |||
#define _GLIBCXX_BASIC_FILE_STDIO_H 1 | |||
#pragma GCC system_header | |||
#include <bits/c++config.h> | |||
#include <bits/c++io.h> // for __c_lock and __c_file | |||
#include <bits/move.h> // for swap | |||
#include <ios> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
// Generic declaration. | |||
template<typename _CharT> | |||
class __basic_file; | |||
// Specialization. | |||
template<> | |||
class __basic_file<char> | |||
{ | |||
// Underlying data source/sink. | |||
__c_file* _M_cfile; | |||
// True iff we opened _M_cfile, and thus must close it ourselves. | |||
bool _M_cfile_created; | |||
public: | |||
__basic_file(__c_lock* __lock = 0) throw (); | |||
#if __cplusplus >= 201103L | |||
__basic_file(__basic_file&& __rv, __c_lock* = 0) noexcept | |||
: _M_cfile(__rv._M_cfile), _M_cfile_created(__rv._M_cfile_created) | |||
{ | |||
__rv._M_cfile = nullptr; | |||
__rv._M_cfile_created = false; | |||
} | |||
__basic_file& operator=(const __basic_file&) = delete; | |||
__basic_file& operator=(__basic_file&&) = delete; | |||
void | |||
swap(__basic_file& __f) noexcept | |||
{ | |||
std::swap(_M_cfile, __f._M_cfile); | |||
std::swap(_M_cfile_created, __f._M_cfile_created); | |||
} | |||
#endif | |||
__basic_file* | |||
open(const char* __name, ios_base::openmode __mode, int __prot = 0664); | |||
#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T | |||
__basic_file* | |||
open(const wchar_t* __name, ios_base::openmode __mode); | |||
#endif | |||
__basic_file* | |||
sys_open(__c_file* __file, ios_base::openmode); | |||
__basic_file* | |||
sys_open(int __fd, ios_base::openmode __mode) throw (); | |||
__basic_file* | |||
close(); | |||
_GLIBCXX_PURE bool | |||
is_open() const throw (); | |||
_GLIBCXX_PURE int | |||
fd() throw (); | |||
_GLIBCXX_PURE __c_file* | |||
file() throw (); | |||
~__basic_file(); | |||
streamsize | |||
xsputn(const char* __s, streamsize __n); | |||
streamsize | |||
xsputn_2(const char* __s1, streamsize __n1, | |||
const char* __s2, streamsize __n2); | |||
streamsize | |||
xsgetn(char* __s, streamsize __n); | |||
streamoff | |||
seekoff(streamoff __off, ios_base::seekdir __way) throw (); | |||
int | |||
sync(); | |||
streamsize | |||
showmanyc(); | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,59 @@ | |||
// Base to std::allocator -*- C++ -*- | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++allocator.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{memory} | |||
*/ | |||
#ifndef _GLIBCXX_CXX_ALLOCATOR_H | |||
#define _GLIBCXX_CXX_ALLOCATOR_H 1 | |||
#include <ext/new_allocator.h> | |||
#if __cplusplus >= 201103L | |||
namespace std | |||
{ | |||
/** | |||
* @brief An alias to the base class for std::allocator. | |||
* | |||
* Used to set the std::allocator base class to | |||
* __gnu_cxx::new_allocator. | |||
* | |||
* @ingroup allocators | |||
* @tparam _Tp Type of allocated object. | |||
*/ | |||
template<typename _Tp> | |||
using __allocator_base = __gnu_cxx::new_allocator<_Tp>; | |||
} | |||
#else | |||
// Define new_allocator as the base class to std::allocator. | |||
# define __allocator_base __gnu_cxx::new_allocator | |||
#endif | |||
#if defined(__SANITIZE_ADDRESS__) && !defined(_GLIBCXX_SANITIZE_STD_ALLOCATOR) | |||
# define _GLIBCXX_SANITIZE_STD_ALLOCATOR 1 | |||
#endif | |||
#endif |
@@ -0,0 +1,50 @@ | |||
// Underlying io library details -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++io.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ios} | |||
*/ | |||
// c_io_stdio.h - Defines for using "C" stdio.h | |||
#ifndef _GLIBCXX_CXX_IO_H | |||
#define _GLIBCXX_CXX_IO_H 1 | |||
#include <cstdio> | |||
#include <bits/gthr.h> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
typedef __gthread_mutex_t __c_lock; | |||
// for basic_file.h | |||
typedef FILE __c_file; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,92 @@ | |||
// Wrapper for underlying C-language localization -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++locale.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.8 Standard locale categories. | |||
// | |||
// Written by Benjamin Kosnik <bkoz@redhat.com> | |||
#ifndef _GLIBCXX_CXX_LOCALE_H | |||
#define _GLIBCXX_CXX_LOCALE_H 1 | |||
#pragma GCC system_header | |||
#include <clocale> | |||
#define _GLIBCXX_NUM_CATEGORIES 0 | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
typedef int* __c_locale; | |||
// Convert numeric value of type double and long double to string and | |||
// return length of string. If vsnprintf is available use it, otherwise | |||
// fall back to the unsafe vsprintf which, in general, can be dangerous | |||
// and should be avoided. | |||
inline int | |||
__convert_from_v(const __c_locale&, char* __out, | |||
const int __size __attribute__((__unused__)), | |||
const char* __fmt, ...) | |||
{ | |||
char* __old = std::setlocale(LC_NUMERIC, 0); | |||
char* __sav = 0; | |||
if (__builtin_strcmp(__old, "C")) | |||
{ | |||
const size_t __len = __builtin_strlen(__old) + 1; | |||
__sav = new char[__len]; | |||
__builtin_memcpy(__sav, __old, __len); | |||
std::setlocale(LC_NUMERIC, "C"); | |||
} | |||
__builtin_va_list __args; | |||
__builtin_va_start(__args, __fmt); | |||
#if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF | |||
const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); | |||
#else | |||
const int __ret = __builtin_vsprintf(__out, __fmt, __args); | |||
#endif | |||
__builtin_va_end(__args); | |||
if (__sav) | |||
{ | |||
std::setlocale(LC_NUMERIC, __sav); | |||
delete [] __sav; | |||
} | |||
return __ret; | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,40 @@ | |||
// Specific definitions for generic platforms -*- C++ -*- | |||
// Copyright (C) 2015-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/cpu_defines.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{iosfwd} | |||
*/ | |||
#ifndef _GLIBCXX_CPU_DEFINES | |||
#define _GLIBCXX_CPU_DEFINES 1 | |||
// Integer divide instructions don't trap on ARM. | |||
#ifdef __ARM_ARCH_EXT_IDIV__ | |||
#define __glibcxx_integral_traps false | |||
#else | |||
#define __glibcxx_integral_traps true | |||
#endif | |||
#endif |
@@ -0,0 +1,61 @@ | |||
// Locale support -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
// | |||
// ISO C++ 14882: 22.1 Locales | |||
// | |||
// Information as gleaned from /usr/include/ctype.h | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
/// @brief Base class for ctype. | |||
struct ctype_base | |||
{ | |||
// Non-standard typedefs. | |||
typedef const int* __to_type; | |||
// NB: Offsets into ctype<char>::_M_table force a particular size | |||
// on the mask type. Because of this, we don't use an enum. | |||
typedef char mask; | |||
static const mask upper = _U; | |||
static const mask lower = _L; | |||
static const mask alpha = _U | _L; | |||
static const mask digit = _N; | |||
static const mask xdigit = _X | _N; | |||
static const mask space = _S; | |||
static const mask print = _P | _U | _L | _N | _B; | |||
static const mask graph = _P | _U | _L | _N; | |||
static const mask cntrl = _C; | |||
static const mask punct = _P; | |||
static const mask alnum = _U | _L | _N; | |||
#if __cplusplus >= 201103L | |||
static const mask blank = space; | |||
#endif | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,74 @@ | |||
// Locale support -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/ctype_inline.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.1 Locales | |||
// | |||
// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) | |||
// functions go in ctype.cc | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
bool | |||
ctype<char>:: | |||
is(mask __m, char __c) const | |||
{ return _M_table[static_cast<unsigned char>(__c)] & __m; } | |||
const char* | |||
ctype<char>:: | |||
is(const char* __low, const char* __high, mask* __vec) const | |||
{ | |||
while (__low < __high) | |||
*__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; | |||
return __high; | |||
} | |||
const char* | |||
ctype<char>:: | |||
scan_is(mask __m, const char* __low, const char* __high) const | |||
{ | |||
while (__low < __high && !this->is(__m, *__low)) | |||
++__low; | |||
return __low; | |||
} | |||
const char* | |||
ctype<char>:: | |||
scan_not(mask __m, const char* __low, const char* __high) const | |||
{ | |||
while (__low < __high && this->is(__m, *__low) != 0) | |||
++__low; | |||
return __low; | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,82 @@ | |||
// Control various target specific ABI tweaks. ARM version. | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/cxxabi_tweaks.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{cxxabi.h} | |||
*/ | |||
#ifndef _CXXABI_TWEAKS_H | |||
#define _CXXABI_TWEAKS_H 1 | |||
#ifdef __cplusplus | |||
namespace __cxxabiv1 | |||
{ | |||
extern "C" | |||
{ | |||
#endif | |||
#ifdef __ARM_EABI__ | |||
// The ARM EABI uses the least significant bit of a 32-bit | |||
// guard variable. */ | |||
#define _GLIBCXX_GUARD_TEST(x) ((*(x) & 1) != 0) | |||
#define _GLIBCXX_GUARD_SET(x) *(x) = 1 | |||
#define _GLIBCXX_GUARD_BIT 1 | |||
#define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||
#define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||
typedef int __guard; | |||
// We also want the element size in array cookies. | |||
#define _GLIBCXX_ELTSIZE_IN_COOKIE 1 | |||
// __cxa_vec_ctor should return a pointer to the array. | |||
typedef void * __cxa_vec_ctor_return_type; | |||
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return x | |||
// Constructors and destructors return the "this" pointer. | |||
typedef void * __cxa_cdtor_return_type; | |||
#else // __ARM_EABI__ | |||
// The generic ABI uses the first byte of a 64-bit guard variable. | |||
#define _GLIBCXX_GUARD_TEST(x) (*(char *) (x) != 0) | |||
#define _GLIBCXX_GUARD_SET(x) *(char *) (x) = 1 | |||
#define _GLIBCXX_GUARD_BIT __guard_test_bit (0, 1) | |||
#define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||
#define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||
__extension__ typedef int __guard __attribute__((mode (__DI__))); | |||
// __cxa_vec_ctor has void return type. | |||
typedef void __cxa_vec_ctor_return_type; | |||
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return | |||
// Constructors and destructors do not return a value. | |||
typedef void __cxa_cdtor_return_type; | |||
#endif //!__ARM_EABI__ | |||
#ifdef __cplusplus | |||
} | |||
} // namespace __cxxabiv1 | |||
#endif | |||
#endif |
@@ -0,0 +1,178 @@ | |||
// Specific definitions for generic platforms -*- C++ -*- | |||
// Copyright (C) 2007-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/error_constants.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{system_error} | |||
*/ | |||
#ifndef _GLIBCXX_ERROR_CONSTANTS | |||
#define _GLIBCXX_ERROR_CONSTANTS 1 | |||
#include <bits/c++config.h> | |||
#include <cerrno> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
enum class errc | |||
{ | |||
address_family_not_supported = EAFNOSUPPORT, | |||
address_in_use = EADDRINUSE, | |||
address_not_available = EADDRNOTAVAIL, | |||
already_connected = EISCONN, | |||
argument_list_too_long = E2BIG, | |||
argument_out_of_domain = EDOM, | |||
bad_address = EFAULT, | |||
bad_file_descriptor = EBADF, | |||
#ifdef _GLIBCXX_HAVE_EBADMSG | |||
bad_message = EBADMSG, | |||
#endif | |||
broken_pipe = EPIPE, | |||
connection_aborted = ECONNABORTED, | |||
connection_already_in_progress = EALREADY, | |||
connection_refused = ECONNREFUSED, | |||
connection_reset = ECONNRESET, | |||
cross_device_link = EXDEV, | |||
destination_address_required = EDESTADDRREQ, | |||
device_or_resource_busy = EBUSY, | |||
directory_not_empty = ENOTEMPTY, | |||
executable_format_error = ENOEXEC, | |||
file_exists = EEXIST, | |||
file_too_large = EFBIG, | |||
filename_too_long = ENAMETOOLONG, | |||
function_not_supported = ENOSYS, | |||
host_unreachable = EHOSTUNREACH, | |||
#ifdef _GLIBCXX_HAVE_EIDRM | |||
identifier_removed = EIDRM, | |||
#endif | |||
illegal_byte_sequence = EILSEQ, | |||
inappropriate_io_control_operation = ENOTTY, | |||
interrupted = EINTR, | |||
invalid_argument = EINVAL, | |||
invalid_seek = ESPIPE, | |||
io_error = EIO, | |||
is_a_directory = EISDIR, | |||
message_size = EMSGSIZE, | |||
network_down = ENETDOWN, | |||
network_reset = ENETRESET, | |||
network_unreachable = ENETUNREACH, | |||
no_buffer_space = ENOBUFS, | |||
no_child_process = ECHILD, | |||
#ifdef _GLIBCXX_HAVE_ENOLINK | |||
no_link = ENOLINK, | |||
#endif | |||
no_lock_available = ENOLCK, | |||
#ifdef _GLIBCXX_HAVE_ENODATA | |||
no_message_available = ENODATA, | |||
#endif | |||
no_message = ENOMSG, | |||
no_protocol_option = ENOPROTOOPT, | |||
no_space_on_device = ENOSPC, | |||
#ifdef _GLIBCXX_HAVE_ENOSR | |||
no_stream_resources = ENOSR, | |||
#endif | |||
no_such_device_or_address = ENXIO, | |||
no_such_device = ENODEV, | |||
no_such_file_or_directory = ENOENT, | |||
no_such_process = ESRCH, | |||
not_a_directory = ENOTDIR, | |||
not_a_socket = ENOTSOCK, | |||
#ifdef _GLIBCXX_HAVE_ENOSTR | |||
not_a_stream = ENOSTR, | |||
#endif | |||
not_connected = ENOTCONN, | |||
not_enough_memory = ENOMEM, | |||
#ifdef _GLIBCXX_HAVE_ENOTSUP | |||
not_supported = ENOTSUP, | |||
#endif | |||
#ifdef _GLIBCXX_HAVE_ECANCELED | |||
operation_canceled = ECANCELED, | |||
#endif | |||
operation_in_progress = EINPROGRESS, | |||
operation_not_permitted = EPERM, | |||
operation_not_supported = EOPNOTSUPP, | |||
operation_would_block = EWOULDBLOCK, | |||
#ifdef _GLIBCXX_HAVE_EOWNERDEAD | |||
owner_dead = EOWNERDEAD, | |||
#endif | |||
permission_denied = EACCES, | |||
#ifdef _GLIBCXX_HAVE_EPROTO | |||
protocol_error = EPROTO, | |||
#endif | |||
protocol_not_supported = EPROTONOSUPPORT, | |||
read_only_file_system = EROFS, | |||
resource_deadlock_would_occur = EDEADLK, | |||
resource_unavailable_try_again = EAGAIN, | |||
result_out_of_range = ERANGE, | |||
#ifdef _GLIBCXX_HAVE_ENOTRECOVERABLE | |||
state_not_recoverable = ENOTRECOVERABLE, | |||
#endif | |||
#ifdef _GLIBCXX_HAVE_ETIME | |||
stream_timeout = ETIME, | |||
#endif | |||
#ifdef _GLIBCXX_HAVE_ETXTBSY | |||
text_file_busy = ETXTBSY, | |||
#endif | |||
timed_out = ETIMEDOUT, | |||
too_many_files_open_in_system = ENFILE, | |||
too_many_files_open = EMFILE, | |||
too_many_links = EMLINK, | |||
too_many_symbolic_link_levels = ELOOP, | |||
#ifdef _GLIBCXX_HAVE_EOVERFLOW | |||
value_too_large = EOVERFLOW, | |||
#endif | |||
wrong_protocol_type = EPROTOTYPE | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,83 @@ | |||
// C++ includes used for precompiling extensions -*- C++ -*- | |||
// Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file extc++.h | |||
* This is an implementation file for a precompiled header. | |||
*/ | |||
#if __cplusplus < 201103L | |||
#include <bits/stdtr1c++.h> | |||
#else | |||
#include <bits/stdc++.h> | |||
#endif | |||
#include <ext/algorithm> | |||
#if __cplusplus >= 201103L | |||
# include <ext/aligned_buffer.h> | |||
#endif | |||
#include <ext/alloc_traits.h> | |||
#include <ext/atomicity.h> | |||
#include <ext/bitmap_allocator.h> | |||
#include <ext/cast.h> | |||
#if __cplusplus >= 201103L | |||
# include <ext/cmath> | |||
#endif | |||
#include <ext/concurrence.h> | |||
#include <ext/debug_allocator.h> | |||
#include <ext/extptr_allocator.h> | |||
#include <ext/functional> | |||
#include <ext/iterator> | |||
#include <ext/malloc_allocator.h> | |||
#include <ext/memory> | |||
#include <ext/mt_allocator.h> | |||
#include <ext/new_allocator.h> | |||
#include <ext/numeric> | |||
#include <ext/numeric_traits.h> | |||
#include <ext/pod_char_traits.h> | |||
#include <ext/pointer.h> | |||
#include <ext/pool_allocator.h> | |||
#if __cplusplus >= 201103L | |||
# include <ext/random> | |||
#endif | |||
#include <ext/rb_tree> | |||
#include <ext/rope> | |||
#include <ext/slist> | |||
#include <ext/stdio_filebuf.h> | |||
#include <ext/stdio_sync_filebuf.h> | |||
#include <ext/throw_allocator.h> | |||
#include <ext/typelist.h> | |||
#include <ext/type_traits.h> | |||
#include <ext/vstring.h> | |||
#include <ext/pb_ds/assoc_container.hpp> | |||
#include <ext/pb_ds/priority_queue.hpp> | |||
#include <ext/pb_ds/exception.hpp> | |||
#include <ext/pb_ds/hash_policy.hpp> | |||
#include <ext/pb_ds/list_update_policy.hpp> | |||
#include <ext/pb_ds/tree_policy.hpp> | |||
#include <ext/pb_ds/trie_policy.hpp> | |||
#ifdef _GLIBCXX_HAVE_ICONV | |||
#include <ext/codecvt_specializations.h> | |||
#include <ext/enc_filebuf.h> | |||
#endif |
@@ -0,0 +1,298 @@ | |||
/* Threads compatibility routines for libgcc2 and libobjc. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||
#define _GLIBCXX_GCC_GTHR_SINGLE_H | |||
/* Just provide compatibility for mutex handling. */ | |||
typedef int __gthread_key_t; | |||
typedef int __gthread_once_t; | |||
typedef int __gthread_mutex_t; | |||
typedef int __gthread_recursive_mutex_t; | |||
#define __GTHREAD_ONCE_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||
#define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||
#ifdef _LIBOBJC | |||
/* Thread local storage for a single thread */ | |||
static void *thread_local_storage = NULL; | |||
/* Backend initialization functions */ | |||
/* Initialize the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_init_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Close the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_close_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Backend thread functions */ | |||
/* Create a new thread of execution. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return NULL; | |||
} | |||
/* Set the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Return the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_get_priority (void) | |||
{ | |||
return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||
} | |||
/* Yield our process time to another thread. */ | |||
static inline void | |||
__gthread_objc_thread_yield (void) | |||
{ | |||
return; | |||
} | |||
/* Terminate the current thread. */ | |||
static inline int | |||
__gthread_objc_thread_exit (void) | |||
{ | |||
/* No thread support available */ | |||
/* Should we really exit the program */ | |||
/* exit (&__objc_thread_exit_status); */ | |||
return -1; | |||
} | |||
/* Returns an integer value which uniquely describes a thread. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_id (void) | |||
{ | |||
/* No thread support, use 1. */ | |||
return (objc_thread_t) 1; | |||
} | |||
/* Sets the thread's local storage pointer. */ | |||
static inline int | |||
__gthread_objc_thread_set_data (void *value) | |||
{ | |||
thread_local_storage = value; | |||
return 0; | |||
} | |||
/* Returns the thread's local storage pointer. */ | |||
static inline void * | |||
__gthread_objc_thread_get_data (void) | |||
{ | |||
return thread_local_storage; | |||
} | |||
/* Backend mutex functions */ | |||
/* Allocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Try to grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Unlock the mutex */ | |||
static inline int | |||
__gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Backend condition mutex functions */ | |||
/* Allocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wait on the condition */ | |||
static inline int | |||
__gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||
objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up all threads waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up one thread waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
#else /* _LIBOBJC */ | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int _GLIBCXX_UNUSED | |||
__gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static int _GLIBCXX_UNUSED | |||
__gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline void * | |||
__gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_lock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_trylock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_unlock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_destroy (__mutex); | |||
} | |||
#endif /* _LIBOBJC */ | |||
#undef _GLIBCXX_UNUSED | |||
#endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ |
@@ -0,0 +1,890 @@ | |||
/* Threads compatibility routines for libgcc2 and libobjc. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_POSIX_H | |||
#define _GLIBCXX_GCC_GTHR_POSIX_H | |||
/* POSIX threads specific definitions. | |||
Easy, since the interface is just one-to-one mapping. */ | |||
#define __GTHREADS 1 | |||
#define __GTHREADS_CXX0X 1 | |||
#include <pthread.h> | |||
#if ((defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)) \ | |||
|| !defined(_GTHREAD_USE_MUTEX_TIMEDLOCK)) | |||
# include <unistd.h> | |||
# if defined(_POSIX_TIMEOUTS) && _POSIX_TIMEOUTS >= 0 | |||
# define _GTHREAD_USE_MUTEX_TIMEDLOCK 1 | |||
# else | |||
# define _GTHREAD_USE_MUTEX_TIMEDLOCK 0 | |||
# endif | |||
#endif | |||
typedef pthread_t __gthread_t; | |||
typedef pthread_key_t __gthread_key_t; | |||
typedef pthread_once_t __gthread_once_t; | |||
typedef pthread_mutex_t __gthread_mutex_t; | |||
typedef pthread_mutex_t __gthread_recursive_mutex_t; | |||
typedef pthread_cond_t __gthread_cond_t; | |||
typedef struct timespec __gthread_time_t; | |||
/* POSIX like conditional variables are supported. Please look at comments | |||
in gthr.h for details. */ | |||
#define __GTHREAD_HAS_COND 1 | |||
#define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER | |||
#define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function | |||
#define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT | |||
#if defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER | |||
#elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP | |||
#else | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||
#endif | |||
#define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER | |||
#define __GTHREAD_TIME_INIT {0,0} | |||
#ifdef _GTHREAD_USE_MUTEX_INIT_FUNC | |||
# undef __GTHREAD_MUTEX_INIT | |||
#endif | |||
#ifdef _GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC | |||
# undef __GTHREAD_RECURSIVE_MUTEX_INIT | |||
# undef __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||
# define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function | |||
#endif | |||
#ifdef _GTHREAD_USE_COND_INIT_FUNC | |||
# undef __GTHREAD_COND_INIT | |||
# define __GTHREAD_COND_INIT_FUNCTION __gthread_cond_init_function | |||
#endif | |||
#if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||
# ifndef __gthrw_pragma | |||
# define __gthrw_pragma(pragma) | |||
# endif | |||
# define __gthrw2(name,name2,type) \ | |||
static __typeof(type) name \ | |||
__attribute__ ((__weakref__(#name2), __copy__ (type))); \ | |||
__gthrw_pragma(weak type) | |||
# define __gthrw_(name) __gthrw_ ## name | |||
#else | |||
# define __gthrw2(name,name2,type) | |||
# define __gthrw_(name) name | |||
#endif | |||
/* Typically, __gthrw_foo is a weak reference to symbol foo. */ | |||
#define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name) | |||
__gthrw(pthread_once) | |||
__gthrw(pthread_getspecific) | |||
__gthrw(pthread_setspecific) | |||
__gthrw(pthread_create) | |||
__gthrw(pthread_join) | |||
__gthrw(pthread_equal) | |||
__gthrw(pthread_self) | |||
__gthrw(pthread_detach) | |||
#ifndef __BIONIC__ | |||
__gthrw(pthread_cancel) | |||
#endif | |||
__gthrw(sched_yield) | |||
__gthrw(pthread_mutex_lock) | |||
__gthrw(pthread_mutex_trylock) | |||
#if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||
__gthrw(pthread_mutex_timedlock) | |||
#endif | |||
__gthrw(pthread_mutex_unlock) | |||
__gthrw(pthread_mutex_init) | |||
__gthrw(pthread_mutex_destroy) | |||
__gthrw(pthread_cond_init) | |||
__gthrw(pthread_cond_broadcast) | |||
__gthrw(pthread_cond_signal) | |||
__gthrw(pthread_cond_wait) | |||
__gthrw(pthread_cond_timedwait) | |||
__gthrw(pthread_cond_destroy) | |||
__gthrw(pthread_key_create) | |||
__gthrw(pthread_key_delete) | |||
__gthrw(pthread_mutexattr_init) | |||
__gthrw(pthread_mutexattr_settype) | |||
__gthrw(pthread_mutexattr_destroy) | |||
#if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK) | |||
/* Objective-C. */ | |||
__gthrw(pthread_exit) | |||
#ifdef _POSIX_PRIORITY_SCHEDULING | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
__gthrw(sched_get_priority_max) | |||
__gthrw(sched_get_priority_min) | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _POSIX_PRIORITY_SCHEDULING */ | |||
__gthrw(pthread_attr_destroy) | |||
__gthrw(pthread_attr_init) | |||
__gthrw(pthread_attr_setdetachstate) | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
__gthrw(pthread_getschedparam) | |||
__gthrw(pthread_setschedparam) | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _LIBOBJC || _LIBOBJC_WEAK */ | |||
#if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK | |||
/* On Solaris 2.6 up to 9, the libc exposes a POSIX threads interface even if | |||
-pthreads is not specified. The functions are dummies and most return an | |||
error value. However pthread_once returns 0 without invoking the routine | |||
it is passed so we cannot pretend that the interface is active if -pthreads | |||
is not specified. On Solaris 2.5.1, the interface is not exposed at all so | |||
we need to play the usual game with weak symbols. On Solaris 10 and up, a | |||
working interface is always exposed. On FreeBSD 6 and later, libc also | |||
exposes a dummy POSIX threads interface, similar to what Solaris 2.6 up | |||
to 9 does. FreeBSD >= 700014 even provides a pthread_cancel stub in libc, | |||
which means the alternate __gthread_active_p below cannot be used there. */ | |||
#if defined(__FreeBSD__) || (defined(__sun) && defined(__svr4__)) | |||
static volatile int __gthread_active = -1; | |||
static void | |||
__gthread_trigger (void) | |||
{ | |||
__gthread_active = 1; | |||
} | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER; | |||
static pthread_once_t __gthread_active_once = PTHREAD_ONCE_INIT; | |||
/* Avoid reading __gthread_active twice on the main code path. */ | |||
int __gthread_active_latest_value = __gthread_active; | |||
/* This test is not protected to avoid taking a lock on the main code | |||
path so every update of __gthread_active in a threaded program must | |||
be atomic with regard to the result of the test. */ | |||
if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||
{ | |||
if (__gthrw_(pthread_once)) | |||
{ | |||
/* If this really is a threaded program, then we must ensure that | |||
__gthread_active has been set to 1 before exiting this block. */ | |||
__gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); | |||
__gthrw_(pthread_once) (&__gthread_active_once, __gthread_trigger); | |||
__gthrw_(pthread_mutex_unlock) (&__gthread_active_mutex); | |||
} | |||
/* Make sure we'll never enter this block again. */ | |||
if (__gthread_active < 0) | |||
__gthread_active = 0; | |||
__gthread_active_latest_value = __gthread_active; | |||
} | |||
return __gthread_active_latest_value != 0; | |||
} | |||
#else /* neither FreeBSD nor Solaris */ | |||
/* For a program to be multi-threaded the only thing that it certainly must | |||
be using is pthread_create. However, there may be other libraries that | |||
intercept pthread_create with their own definitions to wrap pthreads | |||
functionality for some purpose. In those cases, pthread_create being | |||
defined might not necessarily mean that libpthread is actually linked | |||
in. | |||
For the GNU C library, we can use a known internal name. This is always | |||
available in the ABI, but no other library would define it. That is | |||
ideal, since any public pthread function might be intercepted just as | |||
pthread_create might be. __pthread_key_create is an "internal" | |||
implementation symbol, but it is part of the public exported ABI. Also, | |||
it's among the symbols that the static libpthread.a always links in | |||
whenever pthread_create is used, so there is no danger of a false | |||
negative result in any statically-linked, multi-threaded program. | |||
For others, we choose pthread_cancel as a function that seems unlikely | |||
to be redefined by an interceptor library. The bionic (Android) C | |||
library does not provide pthread_cancel, so we do use pthread_create | |||
there (and interceptor libraries lose). */ | |||
#ifdef __GLIBC__ | |||
__gthrw2(__gthrw_(__pthread_key_create), | |||
__pthread_key_create, | |||
pthread_key_create) | |||
# define GTHR_ACTIVE_PROXY __gthrw_(__pthread_key_create) | |||
#elif defined (__BIONIC__) | |||
# define GTHR_ACTIVE_PROXY __gthrw_(pthread_create) | |||
#else | |||
# define GTHR_ACTIVE_PROXY __gthrw_(pthread_cancel) | |||
#endif | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
static void *const __gthread_active_ptr | |||
= __extension__ (void *) >HR_ACTIVE_PROXY; | |||
return __gthread_active_ptr != 0; | |||
} | |||
#endif /* FreeBSD or Solaris */ | |||
#else /* not __GXX_WEAK__ */ | |||
/* Similar to Solaris, HP-UX 11 for PA-RISC provides stubs for pthread | |||
calls in shared flavors of the HP-UX C library. Most of the stubs | |||
have no functionality. The details are described in the "libc cumulative | |||
patch" for each subversion of HP-UX 11. There are two special interfaces | |||
provided for checking whether an application is linked to a shared pthread | |||
library or not. However, these interfaces aren't available in early | |||
libpthread libraries. We also need a test that works for archive | |||
libraries. We can't use pthread_once as some libc versions call the | |||
init function. We also can't use pthread_create or pthread_attr_init | |||
as these create a thread and thereby prevent changing the default stack | |||
size. The function pthread_default_stacksize_np is available in both | |||
the archive and shared versions of libpthread. It can be used to | |||
determine the default pthread stack size. There is a stub in some | |||
shared libc versions which returns a zero size if pthreads are not | |||
active. We provide an equivalent stub to handle cases where libc | |||
doesn't provide one. */ | |||
#if defined(__hppa__) && defined(__hpux__) | |||
static volatile int __gthread_active = -1; | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
/* Avoid reading __gthread_active twice on the main code path. */ | |||
int __gthread_active_latest_value = __gthread_active; | |||
size_t __s; | |||
if (__builtin_expect (__gthread_active_latest_value < 0, 0)) | |||
{ | |||
pthread_default_stacksize_np (0, &__s); | |||
__gthread_active = __s ? 1 : 0; | |||
__gthread_active_latest_value = __gthread_active; | |||
} | |||
return __gthread_active_latest_value != 0; | |||
} | |||
#else /* not hppa-hpux */ | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
return 1; | |||
} | |||
#endif /* hppa-hpux */ | |||
#endif /* __GXX_WEAK__ */ | |||
#ifdef _LIBOBJC | |||
/* This is the config.h file in libobjc/ */ | |||
#include <config.h> | |||
#ifdef HAVE_SCHED_H | |||
# include <sched.h> | |||
#endif | |||
/* Key structure for maintaining thread specific storage */ | |||
static pthread_key_t _objc_thread_storage; | |||
static pthread_attr_t _objc_thread_attribs; | |||
/* Thread local storage for a single thread */ | |||
static void *thread_local_storage = NULL; | |||
/* Backend initialization functions */ | |||
/* Initialize the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_init_thread_system (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
/* Initialize the thread storage key. */ | |||
if (__gthrw_(pthread_key_create) (&_objc_thread_storage, NULL) == 0) | |||
{ | |||
/* The normal default detach state for threads is | |||
* PTHREAD_CREATE_JOINABLE which causes threads to not die | |||
* when you think they should. */ | |||
if (__gthrw_(pthread_attr_init) (&_objc_thread_attribs) == 0 | |||
&& __gthrw_(pthread_attr_setdetachstate) (&_objc_thread_attribs, | |||
PTHREAD_CREATE_DETACHED) == 0) | |||
return 0; | |||
} | |||
} | |||
return -1; | |||
} | |||
/* Close the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_close_thread_system (void) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_key_delete) (_objc_thread_storage) == 0 | |||
&& __gthrw_(pthread_attr_destroy) (&_objc_thread_attribs) == 0) | |||
return 0; | |||
return -1; | |||
} | |||
/* Backend thread functions */ | |||
/* Create a new thread of execution. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_detach (void (*func)(void *), void *arg) | |||
{ | |||
objc_thread_t thread_id; | |||
pthread_t new_thread_handle; | |||
if (!__gthread_active_p ()) | |||
return NULL; | |||
if (!(__gthrw_(pthread_create) (&new_thread_handle, &_objc_thread_attribs, | |||
(void *) func, arg))) | |||
thread_id = (objc_thread_t) new_thread_handle; | |||
else | |||
thread_id = NULL; | |||
return thread_id; | |||
} | |||
/* Set the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_set_priority (int priority) | |||
{ | |||
if (!__gthread_active_p ()) | |||
return -1; | |||
else | |||
{ | |||
#ifdef _POSIX_PRIORITY_SCHEDULING | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
pthread_t thread_id = __gthrw_(pthread_self) (); | |||
int policy; | |||
struct sched_param params; | |||
int priority_min, priority_max; | |||
if (__gthrw_(pthread_getschedparam) (thread_id, &policy, ¶ms) == 0) | |||
{ | |||
if ((priority_max = __gthrw_(sched_get_priority_max) (policy)) == -1) | |||
return -1; | |||
if ((priority_min = __gthrw_(sched_get_priority_min) (policy)) == -1) | |||
return -1; | |||
if (priority > priority_max) | |||
priority = priority_max; | |||
else if (priority < priority_min) | |||
priority = priority_min; | |||
params.sched_priority = priority; | |||
/* | |||
* The solaris 7 and several other man pages incorrectly state that | |||
* this should be a pointer to policy but pthread.h is universally | |||
* at odds with this. | |||
*/ | |||
if (__gthrw_(pthread_setschedparam) (thread_id, policy, ¶ms) == 0) | |||
return 0; | |||
} | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _POSIX_PRIORITY_SCHEDULING */ | |||
return -1; | |||
} | |||
} | |||
/* Return the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_get_priority (void) | |||
{ | |||
#ifdef _POSIX_PRIORITY_SCHEDULING | |||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING | |||
if (__gthread_active_p ()) | |||
{ | |||
int policy; | |||
struct sched_param params; | |||
if (__gthrw_(pthread_getschedparam) (__gthrw_(pthread_self) (), &policy, ¶ms) == 0) | |||
return params.sched_priority; | |||
else | |||
return -1; | |||
} | |||
else | |||
#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ | |||
#endif /* _POSIX_PRIORITY_SCHEDULING */ | |||
return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||
} | |||
/* Yield our process time to another thread. */ | |||
static inline void | |||
__gthread_objc_thread_yield (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
__gthrw_(sched_yield) (); | |||
} | |||
/* Terminate the current thread. */ | |||
static inline int | |||
__gthread_objc_thread_exit (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
/* exit the thread */ | |||
__gthrw_(pthread_exit) (&__objc_thread_exit_status); | |||
/* Failed if we reached here */ | |||
return -1; | |||
} | |||
/* Returns an integer value which uniquely describes a thread. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_id (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
return (objc_thread_t) __gthrw_(pthread_self) (); | |||
else | |||
return (objc_thread_t) 1; | |||
} | |||
/* Sets the thread's local storage pointer. */ | |||
static inline int | |||
__gthread_objc_thread_set_data (void *value) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_setspecific) (_objc_thread_storage, value); | |||
else | |||
{ | |||
thread_local_storage = value; | |||
return 0; | |||
} | |||
} | |||
/* Returns the thread's local storage pointer. */ | |||
static inline void * | |||
__gthread_objc_thread_get_data (void) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_getspecific) (_objc_thread_storage); | |||
else | |||
return thread_local_storage; | |||
} | |||
/* Backend mutex functions */ | |||
/* Allocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_allocate (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
mutex->backend = objc_malloc (sizeof (pthread_mutex_t)); | |||
if (__gthrw_(pthread_mutex_init) ((pthread_mutex_t *) mutex->backend, NULL)) | |||
{ | |||
objc_free (mutex->backend); | |||
mutex->backend = NULL; | |||
return -1; | |||
} | |||
} | |||
return 0; | |||
} | |||
/* Deallocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_deallocate (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
int count; | |||
/* | |||
* Posix Threads specifically require that the thread be unlocked | |||
* for __gthrw_(pthread_mutex_destroy) to work. | |||
*/ | |||
do | |||
{ | |||
count = __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend); | |||
if (count < 0) | |||
return -1; | |||
} | |||
while (count); | |||
if (__gthrw_(pthread_mutex_destroy) ((pthread_mutex_t *) mutex->backend)) | |||
return -1; | |||
objc_free (mutex->backend); | |||
mutex->backend = NULL; | |||
} | |||
return 0; | |||
} | |||
/* Grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_lock (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_mutex_lock) ((pthread_mutex_t *) mutex->backend) != 0) | |||
{ | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
/* Try to grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_trylock (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_mutex_trylock) ((pthread_mutex_t *) mutex->backend) != 0) | |||
{ | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
/* Unlock the mutex */ | |||
static inline int | |||
__gthread_objc_mutex_unlock (objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p () | |||
&& __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend) != 0) | |||
{ | |||
return -1; | |||
} | |||
return 0; | |||
} | |||
/* Backend condition mutex functions */ | |||
/* Allocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_allocate (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
condition->backend = objc_malloc (sizeof (pthread_cond_t)); | |||
if (__gthrw_(pthread_cond_init) ((pthread_cond_t *) condition->backend, NULL)) | |||
{ | |||
objc_free (condition->backend); | |||
condition->backend = NULL; | |||
return -1; | |||
} | |||
} | |||
return 0; | |||
} | |||
/* Deallocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_deallocate (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
if (__gthrw_(pthread_cond_destroy) ((pthread_cond_t *) condition->backend)) | |||
return -1; | |||
objc_free (condition->backend); | |||
condition->backend = NULL; | |||
} | |||
return 0; | |||
} | |||
/* Wait on the condition */ | |||
static inline int | |||
__gthread_objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_cond_wait) ((pthread_cond_t *) condition->backend, | |||
(pthread_mutex_t *) mutex->backend); | |||
else | |||
return 0; | |||
} | |||
/* Wake up all threads waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_broadcast (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_cond_broadcast) ((pthread_cond_t *) condition->backend); | |||
else | |||
return 0; | |||
} | |||
/* Wake up one thread waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_signal (objc_condition_t condition) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_cond_signal) ((pthread_cond_t *) condition->backend); | |||
else | |||
return 0; | |||
} | |||
#else /* _LIBOBJC */ | |||
static inline int | |||
__gthread_create (__gthread_t *__threadid, void *(*__func) (void*), | |||
void *__args) | |||
{ | |||
return __gthrw_(pthread_create) (__threadid, NULL, __func, __args); | |||
} | |||
static inline int | |||
__gthread_join (__gthread_t __threadid, void **__value_ptr) | |||
{ | |||
return __gthrw_(pthread_join) (__threadid, __value_ptr); | |||
} | |||
static inline int | |||
__gthread_detach (__gthread_t __threadid) | |||
{ | |||
return __gthrw_(pthread_detach) (__threadid); | |||
} | |||
static inline int | |||
__gthread_equal (__gthread_t __t1, __gthread_t __t2) | |||
{ | |||
return __gthrw_(pthread_equal) (__t1, __t2); | |||
} | |||
static inline __gthread_t | |||
__gthread_self (void) | |||
{ | |||
return __gthrw_(pthread_self) (); | |||
} | |||
static inline int | |||
__gthread_yield (void) | |||
{ | |||
return __gthrw_(sched_yield) (); | |||
} | |||
static inline int | |||
__gthread_once (__gthread_once_t *__once, void (*__func) (void)) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_once) (__once, __func); | |||
else | |||
return -1; | |||
} | |||
static inline int | |||
__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) | |||
{ | |||
return __gthrw_(pthread_key_create) (__key, __dtor); | |||
} | |||
static inline int | |||
__gthread_key_delete (__gthread_key_t __key) | |||
{ | |||
return __gthrw_(pthread_key_delete) (__key); | |||
} | |||
static inline void * | |||
__gthread_getspecific (__gthread_key_t __key) | |||
{ | |||
return __gthrw_(pthread_getspecific) (__key); | |||
} | |||
static inline int | |||
__gthread_setspecific (__gthread_key_t __key, const void *__ptr) | |||
{ | |||
return __gthrw_(pthread_setspecific) (__key, __ptr); | |||
} | |||
static inline void | |||
__gthread_mutex_init_function (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
__gthrw_(pthread_mutex_init) (__mutex, NULL); | |||
} | |||
static inline int | |||
__gthread_mutex_destroy (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_destroy) (__mutex); | |||
else | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_lock (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_lock) (__mutex); | |||
else | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_trylock (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_trylock) (__mutex); | |||
else | |||
return 0; | |||
} | |||
#if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||
static inline int | |||
__gthread_mutex_timedlock (__gthread_mutex_t *__mutex, | |||
const __gthread_time_t *__abs_timeout) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_timedlock) (__mutex, __abs_timeout); | |||
else | |||
return 0; | |||
} | |||
#endif | |||
static inline int | |||
__gthread_mutex_unlock (__gthread_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
return __gthrw_(pthread_mutex_unlock) (__mutex); | |||
else | |||
return 0; | |||
} | |||
#if !defined( PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) \ | |||
|| defined(_GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC) | |||
static inline int | |||
__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
if (__gthread_active_p ()) | |||
{ | |||
pthread_mutexattr_t __attr; | |||
int __r; | |||
__r = __gthrw_(pthread_mutexattr_init) (&__attr); | |||
if (!__r) | |||
__r = __gthrw_(pthread_mutexattr_settype) (&__attr, | |||
PTHREAD_MUTEX_RECURSIVE); | |||
if (!__r) | |||
__r = __gthrw_(pthread_mutex_init) (__mutex, &__attr); | |||
if (!__r) | |||
__r = __gthrw_(pthread_mutexattr_destroy) (&__attr); | |||
return __r; | |||
} | |||
return 0; | |||
} | |||
#endif | |||
static inline int | |||
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_lock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_trylock (__mutex); | |||
} | |||
#if _GTHREAD_USE_MUTEX_TIMEDLOCK | |||
static inline int | |||
__gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex, | |||
const __gthread_time_t *__abs_timeout) | |||
{ | |||
return __gthread_mutex_timedlock (__mutex, __abs_timeout); | |||
} | |||
#endif | |||
static inline int | |||
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_unlock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_destroy (__mutex); | |||
} | |||
#ifdef _GTHREAD_USE_COND_INIT_FUNC | |||
static inline void | |||
__gthread_cond_init_function (__gthread_cond_t *__cond) | |||
{ | |||
if (__gthread_active_p ()) | |||
__gthrw_(pthread_cond_init) (__cond, NULL); | |||
} | |||
#endif | |||
static inline int | |||
__gthread_cond_broadcast (__gthread_cond_t *__cond) | |||
{ | |||
return __gthrw_(pthread_cond_broadcast) (__cond); | |||
} | |||
static inline int | |||
__gthread_cond_signal (__gthread_cond_t *__cond) | |||
{ | |||
return __gthrw_(pthread_cond_signal) (__cond); | |||
} | |||
static inline int | |||
__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex) | |||
{ | |||
return __gthrw_(pthread_cond_wait) (__cond, __mutex); | |||
} | |||
static inline int | |||
__gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex, | |||
const __gthread_time_t *__abs_timeout) | |||
{ | |||
return __gthrw_(pthread_cond_timedwait) (__cond, __mutex, __abs_timeout); | |||
} | |||
static inline int | |||
__gthread_cond_wait_recursive (__gthread_cond_t *__cond, | |||
__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_cond_wait (__cond, __mutex); | |||
} | |||
static inline int | |||
__gthread_cond_destroy (__gthread_cond_t* __cond) | |||
{ | |||
return __gthrw_(pthread_cond_destroy) (__cond); | |||
} | |||
#endif /* _LIBOBJC */ | |||
#endif /* ! _GLIBCXX_GCC_GTHR_POSIX_H */ |
@@ -0,0 +1,298 @@ | |||
/* Threads compatibility routines for libgcc2 and libobjc. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_SINGLE_H | |||
#define _GLIBCXX_GCC_GTHR_SINGLE_H | |||
/* Just provide compatibility for mutex handling. */ | |||
typedef int __gthread_key_t; | |||
typedef int __gthread_once_t; | |||
typedef int __gthread_mutex_t; | |||
typedef int __gthread_recursive_mutex_t; | |||
#define __GTHREAD_ONCE_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT 0 | |||
#define __GTHREAD_MUTEX_INIT_FUNCTION(mx) do {} while (0) | |||
#define __GTHREAD_RECURSIVE_MUTEX_INIT 0 | |||
#define _GLIBCXX_UNUSED __attribute__((__unused__)) | |||
#ifdef _LIBOBJC | |||
/* Thread local storage for a single thread */ | |||
static void *thread_local_storage = NULL; | |||
/* Backend initialization functions */ | |||
/* Initialize the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_init_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Close the threads subsystem. */ | |||
static inline int | |||
__gthread_objc_close_thread_system (void) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Backend thread functions */ | |||
/* Create a new thread of execution. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return NULL; | |||
} | |||
/* Set the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) | |||
{ | |||
/* No thread support available */ | |||
return -1; | |||
} | |||
/* Return the current thread's priority. */ | |||
static inline int | |||
__gthread_objc_thread_get_priority (void) | |||
{ | |||
return OBJC_THREAD_INTERACTIVE_PRIORITY; | |||
} | |||
/* Yield our process time to another thread. */ | |||
static inline void | |||
__gthread_objc_thread_yield (void) | |||
{ | |||
return; | |||
} | |||
/* Terminate the current thread. */ | |||
static inline int | |||
__gthread_objc_thread_exit (void) | |||
{ | |||
/* No thread support available */ | |||
/* Should we really exit the program */ | |||
/* exit (&__objc_thread_exit_status); */ | |||
return -1; | |||
} | |||
/* Returns an integer value which uniquely describes a thread. */ | |||
static inline objc_thread_t | |||
__gthread_objc_thread_id (void) | |||
{ | |||
/* No thread support, use 1. */ | |||
return (objc_thread_t) 1; | |||
} | |||
/* Sets the thread's local storage pointer. */ | |||
static inline int | |||
__gthread_objc_thread_set_data (void *value) | |||
{ | |||
thread_local_storage = value; | |||
return 0; | |||
} | |||
/* Returns the thread's local storage pointer. */ | |||
static inline void * | |||
__gthread_objc_thread_get_data (void) | |||
{ | |||
return thread_local_storage; | |||
} | |||
/* Backend mutex functions */ | |||
/* Allocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Try to grab a lock on a mutex. */ | |||
static inline int | |||
__gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
/* There can only be one thread, so we always get the lock */ | |||
return 0; | |||
} | |||
/* Unlock the mutex */ | |||
static inline int | |||
__gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Backend condition mutex functions */ | |||
/* Allocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Deallocate a condition. */ | |||
static inline int | |||
__gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wait on the condition */ | |||
static inline int | |||
__gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, | |||
objc_mutex_t mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up all threads waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
/* Wake up one thread waiting on this condition. */ | |||
static inline int | |||
__gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
#else /* _LIBOBJC */ | |||
static inline int | |||
__gthread_active_p (void) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int _GLIBCXX_UNUSED | |||
__gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static int _GLIBCXX_UNUSED | |||
__gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline void * | |||
__gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) | |||
{ | |||
return 0; | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_lock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_trylock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_unlock (__mutex); | |||
} | |||
static inline int | |||
__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex) | |||
{ | |||
return __gthread_mutex_destroy (__mutex); | |||
} | |||
#endif /* _LIBOBJC */ | |||
#undef _GLIBCXX_UNUSED | |||
#endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ |
@@ -0,0 +1,154 @@ | |||
/* Threads compatibility routines for libgcc2. */ | |||
/* Compile this one with gcc. */ | |||
/* Copyright (C) 1997-2020 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. | |||
Under Section 7 of GPL version 3, you are granted additional | |||
permissions described in the GCC Runtime Library Exception, version | |||
3.1, as published by the Free Software Foundation. | |||
You should have received a copy of the GNU General Public License and | |||
a copy of the GCC Runtime Library Exception along with this program; | |||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
<http://www.gnu.org/licenses/>. */ | |||
#ifndef _GLIBCXX_GCC_GTHR_H | |||
#define _GLIBCXX_GCC_GTHR_H | |||
#ifndef _GLIBCXX_HIDE_EXPORTS | |||
#pragma GCC visibility push(default) | |||
#endif | |||
/* If this file is compiled with threads support, it must | |||
#define __GTHREADS 1 | |||
to indicate that threads support is present. Also it has define | |||
function | |||
int __gthread_active_p () | |||
that returns 1 if thread system is active, 0 if not. | |||
The threads interface must define the following types: | |||
__gthread_key_t | |||
__gthread_once_t | |||
__gthread_mutex_t | |||
__gthread_recursive_mutex_t | |||
The threads interface must define the following macros: | |||
__GTHREAD_ONCE_INIT | |||
to initialize __gthread_once_t | |||
__GTHREAD_MUTEX_INIT | |||
to initialize __gthread_mutex_t to get a fast | |||
non-recursive mutex. | |||
__GTHREAD_MUTEX_INIT_FUNCTION | |||
to initialize __gthread_mutex_t to get a fast | |||
non-recursive mutex. | |||
Define this to a function which looks like this: | |||
void __GTHREAD_MUTEX_INIT_FUNCTION (__gthread_mutex_t *) | |||
Some systems can't initialize a mutex without a | |||
function call. Don't define __GTHREAD_MUTEX_INIT in this case. | |||
__GTHREAD_RECURSIVE_MUTEX_INIT | |||
__GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION | |||
as above, but for a recursive mutex. | |||
The threads interface must define the following static functions: | |||
int __gthread_once (__gthread_once_t *once, void (*func) ()) | |||
int __gthread_key_create (__gthread_key_t *keyp, void (*dtor) (void *)) | |||
int __gthread_key_delete (__gthread_key_t key) | |||
void *__gthread_getspecific (__gthread_key_t key) | |||
int __gthread_setspecific (__gthread_key_t key, const void *ptr) | |||
int __gthread_mutex_destroy (__gthread_mutex_t *mutex); | |||
int __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *mutex); | |||
int __gthread_mutex_lock (__gthread_mutex_t *mutex); | |||
int __gthread_mutex_trylock (__gthread_mutex_t *mutex); | |||
int __gthread_mutex_unlock (__gthread_mutex_t *mutex); | |||
int __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex); | |||
int __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex); | |||
int __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex); | |||
The following are supported in POSIX threads only. They are required to | |||
fix a deadlock in static initialization inside libsupc++. The header file | |||
gthr-posix.h defines a symbol __GTHREAD_HAS_COND to signify that these extra | |||
features are supported. | |||
Types: | |||
__gthread_cond_t | |||
Macros: | |||
__GTHREAD_COND_INIT | |||
__GTHREAD_COND_INIT_FUNCTION | |||
Interface: | |||
int __gthread_cond_broadcast (__gthread_cond_t *cond); | |||
int __gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex); | |||
int __gthread_cond_wait_recursive (__gthread_cond_t *cond, | |||
__gthread_recursive_mutex_t *mutex); | |||
All functions returning int should return zero on success or the error | |||
number. If the operation is not supported, -1 is returned. | |||
If the following are also defined, you should | |||
#define __GTHREADS_CXX0X 1 | |||
to enable the c++0x thread library. | |||
Types: | |||
__gthread_t | |||
__gthread_time_t | |||
Interface: | |||
int __gthread_create (__gthread_t *thread, void *(*func) (void*), | |||
void *args); | |||
int __gthread_join (__gthread_t thread, void **value_ptr); | |||
int __gthread_detach (__gthread_t thread); | |||
int __gthread_equal (__gthread_t t1, __gthread_t t2); | |||
__gthread_t __gthread_self (void); | |||
int __gthread_yield (void); | |||
int __gthread_mutex_timedlock (__gthread_mutex_t *m, | |||
const __gthread_time_t *abs_timeout); | |||
int __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *m, | |||
const __gthread_time_t *abs_time); | |||
int __gthread_cond_signal (__gthread_cond_t *cond); | |||
int __gthread_cond_timedwait (__gthread_cond_t *cond, | |||
__gthread_mutex_t *mutex, | |||
const __gthread_time_t *abs_timeout); | |||
*/ | |||
#if __GXX_WEAK__ | |||
/* The pe-coff weak support isn't fully compatible to ELF's weak. | |||
For static libraries it might would work, but as we need to deal | |||
with shared versions too, we disable it for mingw-targets. */ | |||
#ifdef __MINGW32__ | |||
#undef _GLIBCXX_GTHREAD_USE_WEAK | |||
#define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||
#endif | |||
#ifndef _GLIBCXX_GTHREAD_USE_WEAK | |||
#define _GLIBCXX_GTHREAD_USE_WEAK 1 | |||
#endif | |||
#endif | |||
#include <bits/gthr-default.h> | |||
#ifndef _GLIBCXX_HIDE_EXPORTS | |||
#pragma GCC visibility pop | |||
#endif | |||
#endif /* ! _GLIBCXX_GCC_GTHR_H */ |
@@ -0,0 +1,92 @@ | |||
// std::messages implementation details, generic version -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/messages_members.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.2.7.1.2 messages virtual functions | |||
// | |||
// Written by Benjamin Kosnik <bkoz@redhat.com> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
// Non-virtual member functions. | |||
template<typename _CharT> | |||
messages<_CharT>::messages(size_t __refs) | |||
: facet(__refs) | |||
{ _M_c_locale_messages = _S_get_c_locale(); } | |||
template<typename _CharT> | |||
messages<_CharT>::messages(__c_locale, const char*, size_t __refs) | |||
: facet(__refs) | |||
{ _M_c_locale_messages = _S_get_c_locale(); } | |||
template<typename _CharT> | |||
typename messages<_CharT>::catalog | |||
messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, | |||
const char*) const | |||
{ return this->do_open(__s, __loc); } | |||
// Virtual member functions. | |||
template<typename _CharT> | |||
messages<_CharT>::~messages() | |||
{ _S_destroy_c_locale(_M_c_locale_messages); } | |||
template<typename _CharT> | |||
typename messages<_CharT>::catalog | |||
messages<_CharT>::do_open(const basic_string<char>&, const locale&) const | |||
{ return 0; } | |||
template<typename _CharT> | |||
typename messages<_CharT>::string_type | |||
messages<_CharT>::do_get(catalog, int, int, | |||
const string_type& __dfault) const | |||
{ return __dfault; } | |||
template<typename _CharT> | |||
void | |||
messages<_CharT>::do_close(catalog) const | |||
{ } | |||
// messages_byname | |||
template<typename _CharT> | |||
messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) | |||
: messages<_CharT>(__refs) | |||
{ | |||
if (__builtin_strcmp(__s, "C") != 0 | |||
&& __builtin_strcmp(__s, "POSIX") != 0) | |||
{ | |||
this->_S_destroy_c_locale(this->_M_c_locale_messages); | |||
this->_S_create_c_locale(this->_M_c_locale_messages, __s); | |||
} | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,38 @@ | |||
// Optimizations for random number handling, generic version -*- C++ -*- | |||
// Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/opt_random.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{random} | |||
*/ | |||
#ifndef _BITS_OPT_RANDOM_H | |||
#define _BITS_OPT_RANDOM_H 1 | |||
#pragma GCC system_header | |||
#endif // _BITS_OPT_RANDOM_H |
@@ -0,0 +1,61 @@ | |||
// Specific definitions for newlib -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/os_defines.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{iosfwd} | |||
*/ | |||
#ifndef _GLIBCXX_OS_DEFINES | |||
#define _GLIBCXX_OS_DEFINES 1 | |||
// System-specific #define, typedefs, corrections, etc, go here. This | |||
// file will come before all others. | |||
#ifdef __CYGWIN__ | |||
#define _GLIBCXX_GTHREAD_USE_WEAK 0 | |||
#if defined (_GLIBCXX_DLL) | |||
#define _GLIBCXX_PSEUDO_VISIBILITY_default __attribute__ ((__dllimport__)) | |||
#else | |||
#define _GLIBCXX_PSEUDO_VISIBILITY_default | |||
#endif | |||
#define _GLIBCXX_PSEUDO_VISIBILITY_hidden | |||
#define _GLIBCXX_PSEUDO_VISIBILITY(V) _GLIBCXX_PSEUDO_VISIBILITY_ ## V | |||
// See libstdc++/20806. | |||
#define _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM 1 | |||
// Enable use of GetModuleHandleEx (requires Windows XP/2003) in | |||
// __cxa_thread_atexit to prevent modules from being unloaded before | |||
// their dtors are called | |||
#define _GLIBCXX_THREAD_ATEXIT_WIN32 1 | |||
// See libstdc++/69506 | |||
#define _GLIBCXX_USE_WEAK_REF 0 | |||
#endif | |||
#endif |
@@ -0,0 +1,146 @@ | |||
// C++ includes used for precompiling -*- C++ -*- | |||
// Copyright (C) 2003-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file stdc++.h | |||
* This is an implementation file for a precompiled header. | |||
*/ | |||
// 17.4.1.2 Headers | |||
// C | |||
#ifndef _GLIBCXX_NO_ASSERT | |||
#include <cassert> | |||
#endif | |||
#include <cctype> | |||
#include <cerrno> | |||
#include <cfloat> | |||
#include <ciso646> | |||
#include <climits> | |||
#include <clocale> | |||
#include <cmath> | |||
#include <csetjmp> | |||
#include <csignal> | |||
#include <cstdarg> | |||
#include <cstddef> | |||
#include <cstdio> | |||
#include <cstdlib> | |||
#include <cstring> | |||
#include <ctime> | |||
#include <cwchar> | |||
#include <cwctype> | |||
#if __cplusplus >= 201103L | |||
#include <ccomplex> | |||
#include <cfenv> | |||
#include <cinttypes> | |||
#include <cstdalign> | |||
#include <cstdbool> | |||
#include <cstdint> | |||
#include <ctgmath> | |||
#include <cuchar> | |||
#endif | |||
// C++ | |||
#include <algorithm> | |||
#include <bitset> | |||
#include <complex> | |||
#include <deque> | |||
#include <exception> | |||
#include <fstream> | |||
#include <functional> | |||
#include <iomanip> | |||
#include <ios> | |||
#include <iosfwd> | |||
#include <iostream> | |||
#include <istream> | |||
#include <iterator> | |||
#include <limits> | |||
#include <list> | |||
#include <locale> | |||
#include <map> | |||
#include <memory> | |||
#include <new> | |||
#include <numeric> | |||
#include <ostream> | |||
#include <queue> | |||
#include <set> | |||
#include <sstream> | |||
#include <stack> | |||
#include <stdexcept> | |||
#include <streambuf> | |||
#include <string> | |||
#include <typeinfo> | |||
#include <utility> | |||
#include <valarray> | |||
#include <vector> | |||
#if __cplusplus >= 201103L | |||
#include <array> | |||
#include <atomic> | |||
#include <chrono> | |||
#include <codecvt> | |||
#include <condition_variable> | |||
#include <forward_list> | |||
#include <future> | |||
#include <initializer_list> | |||
#include <mutex> | |||
#include <random> | |||
#include <ratio> | |||
#include <regex> | |||
#include <scoped_allocator> | |||
#include <system_error> | |||
#include <thread> | |||
#include <tuple> | |||
#include <typeindex> | |||
#include <type_traits> | |||
#include <unordered_map> | |||
#include <unordered_set> | |||
#endif | |||
#if __cplusplus >= 201402L | |||
#include <shared_mutex> | |||
#endif | |||
#if __cplusplus >= 201703L | |||
#include <any> | |||
#include <charconv> | |||
// #include <execution> | |||
#include <filesystem> | |||
#include <optional> | |||
#include <memory_resource> | |||
#include <string_view> | |||
#include <variant> | |||
#endif | |||
#if __cplusplus > 201703L | |||
#include <bit> | |||
#include <compare> | |||
#include <concepts> | |||
#include <numbers> | |||
#include <ranges> | |||
#include <span> | |||
#include <stop_token> | |||
// #include <syncstream> | |||
#include <version> | |||
#endif |
@@ -0,0 +1,53 @@ | |||
// C++ includes used for precompiling TR1 -*- C++ -*- | |||
// Copyright (C) 2006-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file stdtr1c++.h | |||
* This is an implementation file for a precompiled header. | |||
*/ | |||
#include <bits/stdc++.h> | |||
#include <tr1/array> | |||
#include <tr1/cctype> | |||
#include <tr1/cfenv> | |||
#include <tr1/cfloat> | |||
#include <tr1/cinttypes> | |||
#include <tr1/climits> | |||
#include <tr1/cmath> | |||
#include <tr1/complex> | |||
#include <tr1/cstdarg> | |||
#include <tr1/cstdbool> | |||
#include <tr1/cstdint> | |||
#include <tr1/cstdio> | |||
#include <tr1/cstdlib> | |||
#include <tr1/ctgmath> | |||
#include <tr1/ctime> | |||
#include <tr1/cwchar> | |||
#include <tr1/cwctype> | |||
#include <tr1/functional> | |||
#include <tr1/random> | |||
#include <tr1/tuple> | |||
#include <tr1/unordered_map> | |||
#include <tr1/unordered_set> | |||
#include <tr1/utility> |
@@ -0,0 +1,92 @@ | |||
// std::time_get, std::time_put implementation, generic version -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/time_members.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.2.5.1.2 - time_get functions | |||
// ISO C++ 14882: 22.2.5.3.2 - time_put functions | |||
// | |||
// Written by Benjamin Kosnik <bkoz@redhat.com> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
template<typename _CharT> | |||
__timepunct<_CharT>::__timepunct(size_t __refs) | |||
: facet(__refs), _M_data(0) | |||
{ | |||
_M_name_timepunct = _S_get_c_name(); | |||
_M_initialize_timepunct(); | |||
} | |||
template<typename _CharT> | |||
__timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) | |||
: facet(__refs), _M_data(__cache) | |||
{ | |||
_M_name_timepunct = _S_get_c_name(); | |||
_M_initialize_timepunct(); | |||
} | |||
template<typename _CharT> | |||
__timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, | |||
size_t __refs) | |||
: facet(__refs), _M_data(0) | |||
{ | |||
if (__builtin_strcmp(__s, _S_get_c_name()) != 0) | |||
{ | |||
const size_t __len = __builtin_strlen(__s) + 1; | |||
char* __tmp = new char[__len]; | |||
__builtin_memcpy(__tmp, __s, __len); | |||
_M_name_timepunct = __tmp; | |||
} | |||
else | |||
_M_name_timepunct = _S_get_c_name(); | |||
__try | |||
{ _M_initialize_timepunct(__cloc); } | |||
__catch(...) | |||
{ | |||
if (_M_name_timepunct != _S_get_c_name()) | |||
delete [] _M_name_timepunct; | |||
__throw_exception_again; | |||
} | |||
} | |||
template<typename _CharT> | |||
__timepunct<_CharT>::~__timepunct() | |||
{ | |||
if (_M_name_timepunct != _S_get_c_name()) | |||
delete [] _M_name_timepunct; | |||
delete _M_data; | |||
_S_destroy_c_locale(_M_c_locale_timepunct); | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,38 @@ | |||
// Optimizations for random number extensions, generic version -*- C++ -*- | |||
// Copyright (C) 2012-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file ext/opt_random.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ext/random} | |||
*/ | |||
#ifndef _EXT_OPT_RANDOM_H | |||
#define _EXT_OPT_RANDOM_H 1 | |||
#pragma GCC system_header | |||
#endif // _EXT_OPT_RANDOM_H |
@@ -0,0 +1,40 @@ | |||
// Low-level type for atomic operations -*- C++ -*- | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file atomic_word.h | |||
* This file is a GNU extension to the Standard C++ Library. | |||
*/ | |||
#ifndef _GLIBCXX_ATOMIC_WORD_H | |||
#define _GLIBCXX_ATOMIC_WORD_H 1 | |||
typedef int _Atomic_word; | |||
// This is a memory order acquire fence. | |||
#define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE) | |||
// This is a memory order release fence. | |||
#define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE) | |||
#endif |
@@ -0,0 +1,135 @@ | |||
// Wrapper of C-language FILE struct -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
// | |||
// ISO C++ 14882: 27.8 File-based streams | |||
// | |||
/** @file bits/basic_file.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ios} | |||
*/ | |||
#ifndef _GLIBCXX_BASIC_FILE_STDIO_H | |||
#define _GLIBCXX_BASIC_FILE_STDIO_H 1 | |||
#pragma GCC system_header | |||
#include <bits/c++config.h> | |||
#include <bits/c++io.h> // for __c_lock and __c_file | |||
#include <bits/move.h> // for swap | |||
#include <ios> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
// Generic declaration. | |||
template<typename _CharT> | |||
class __basic_file; | |||
// Specialization. | |||
template<> | |||
class __basic_file<char> | |||
{ | |||
// Underlying data source/sink. | |||
__c_file* _M_cfile; | |||
// True iff we opened _M_cfile, and thus must close it ourselves. | |||
bool _M_cfile_created; | |||
public: | |||
__basic_file(__c_lock* __lock = 0) throw (); | |||
#if __cplusplus >= 201103L | |||
__basic_file(__basic_file&& __rv, __c_lock* = 0) noexcept | |||
: _M_cfile(__rv._M_cfile), _M_cfile_created(__rv._M_cfile_created) | |||
{ | |||
__rv._M_cfile = nullptr; | |||
__rv._M_cfile_created = false; | |||
} | |||
__basic_file& operator=(const __basic_file&) = delete; | |||
__basic_file& operator=(__basic_file&&) = delete; | |||
void | |||
swap(__basic_file& __f) noexcept | |||
{ | |||
std::swap(_M_cfile, __f._M_cfile); | |||
std::swap(_M_cfile_created, __f._M_cfile_created); | |||
} | |||
#endif | |||
__basic_file* | |||
open(const char* __name, ios_base::openmode __mode, int __prot = 0664); | |||
#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T | |||
__basic_file* | |||
open(const wchar_t* __name, ios_base::openmode __mode); | |||
#endif | |||
__basic_file* | |||
sys_open(__c_file* __file, ios_base::openmode); | |||
__basic_file* | |||
sys_open(int __fd, ios_base::openmode __mode) throw (); | |||
__basic_file* | |||
close(); | |||
_GLIBCXX_PURE bool | |||
is_open() const throw (); | |||
_GLIBCXX_PURE int | |||
fd() throw (); | |||
_GLIBCXX_PURE __c_file* | |||
file() throw (); | |||
~__basic_file(); | |||
streamsize | |||
xsputn(const char* __s, streamsize __n); | |||
streamsize | |||
xsputn_2(const char* __s1, streamsize __n1, | |||
const char* __s2, streamsize __n2); | |||
streamsize | |||
xsgetn(char* __s, streamsize __n); | |||
streamoff | |||
seekoff(streamoff __off, ios_base::seekdir __way) throw (); | |||
int | |||
sync(); | |||
streamsize | |||
showmanyc(); | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,59 @@ | |||
// Base to std::allocator -*- C++ -*- | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++allocator.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{memory} | |||
*/ | |||
#ifndef _GLIBCXX_CXX_ALLOCATOR_H | |||
#define _GLIBCXX_CXX_ALLOCATOR_H 1 | |||
#include <ext/new_allocator.h> | |||
#if __cplusplus >= 201103L | |||
namespace std | |||
{ | |||
/** | |||
* @brief An alias to the base class for std::allocator. | |||
* | |||
* Used to set the std::allocator base class to | |||
* __gnu_cxx::new_allocator. | |||
* | |||
* @ingroup allocators | |||
* @tparam _Tp Type of allocated object. | |||
*/ | |||
template<typename _Tp> | |||
using __allocator_base = __gnu_cxx::new_allocator<_Tp>; | |||
} | |||
#else | |||
// Define new_allocator as the base class to std::allocator. | |||
# define __allocator_base __gnu_cxx::new_allocator | |||
#endif | |||
#if defined(__SANITIZE_ADDRESS__) && !defined(_GLIBCXX_SANITIZE_STD_ALLOCATOR) | |||
# define _GLIBCXX_SANITIZE_STD_ALLOCATOR 1 | |||
#endif | |||
#endif |
@@ -0,0 +1,50 @@ | |||
// Underlying io library details -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++io.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{ios} | |||
*/ | |||
// c_io_stdio.h - Defines for using "C" stdio.h | |||
#ifndef _GLIBCXX_CXX_IO_H | |||
#define _GLIBCXX_CXX_IO_H 1 | |||
#include <cstdio> | |||
#include <bits/gthr.h> | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
typedef __gthread_mutex_t __c_lock; | |||
// for basic_file.h | |||
typedef FILE __c_file; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,92 @@ | |||
// Wrapper for underlying C-language localization -*- C++ -*- | |||
// Copyright (C) 2001-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/c++locale.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.8 Standard locale categories. | |||
// | |||
// Written by Benjamin Kosnik <bkoz@redhat.com> | |||
#ifndef _GLIBCXX_CXX_LOCALE_H | |||
#define _GLIBCXX_CXX_LOCALE_H 1 | |||
#pragma GCC system_header | |||
#include <clocale> | |||
#define _GLIBCXX_NUM_CATEGORIES 0 | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
typedef int* __c_locale; | |||
// Convert numeric value of type double and long double to string and | |||
// return length of string. If vsnprintf is available use it, otherwise | |||
// fall back to the unsafe vsprintf which, in general, can be dangerous | |||
// and should be avoided. | |||
inline int | |||
__convert_from_v(const __c_locale&, char* __out, | |||
const int __size __attribute__((__unused__)), | |||
const char* __fmt, ...) | |||
{ | |||
char* __old = std::setlocale(LC_NUMERIC, 0); | |||
char* __sav = 0; | |||
if (__builtin_strcmp(__old, "C")) | |||
{ | |||
const size_t __len = __builtin_strlen(__old) + 1; | |||
__sav = new char[__len]; | |||
__builtin_memcpy(__sav, __old, __len); | |||
std::setlocale(LC_NUMERIC, "C"); | |||
} | |||
__builtin_va_list __args; | |||
__builtin_va_start(__args, __fmt); | |||
#if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF | |||
const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); | |||
#else | |||
const int __ret = __builtin_vsprintf(__out, __fmt, __args); | |||
#endif | |||
__builtin_va_end(__args); | |||
if (__sav) | |||
{ | |||
std::setlocale(LC_NUMERIC, __sav); | |||
delete [] __sav; | |||
} | |||
return __ret; | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace | |||
#endif |
@@ -0,0 +1,40 @@ | |||
// Specific definitions for generic platforms -*- C++ -*- | |||
// Copyright (C) 2015-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/cpu_defines.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{iosfwd} | |||
*/ | |||
#ifndef _GLIBCXX_CPU_DEFINES | |||
#define _GLIBCXX_CPU_DEFINES 1 | |||
// Integer divide instructions don't trap on ARM. | |||
#ifdef __ARM_ARCH_EXT_IDIV__ | |||
#define __glibcxx_integral_traps false | |||
#else | |||
#define __glibcxx_integral_traps true | |||
#endif | |||
#endif |
@@ -0,0 +1,61 @@ | |||
// Locale support -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
// | |||
// ISO C++ 14882: 22.1 Locales | |||
// | |||
// Information as gleaned from /usr/include/ctype.h | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
/// @brief Base class for ctype. | |||
struct ctype_base | |||
{ | |||
// Non-standard typedefs. | |||
typedef const int* __to_type; | |||
// NB: Offsets into ctype<char>::_M_table force a particular size | |||
// on the mask type. Because of this, we don't use an enum. | |||
typedef char mask; | |||
static const mask upper = _U; | |||
static const mask lower = _L; | |||
static const mask alpha = _U | _L; | |||
static const mask digit = _N; | |||
static const mask xdigit = _X | _N; | |||
static const mask space = _S; | |||
static const mask print = _P | _U | _L | _N | _B; | |||
static const mask graph = _P | _U | _L | _N; | |||
static const mask cntrl = _C; | |||
static const mask punct = _P; | |||
static const mask alnum = _U | _L | _N; | |||
#if __cplusplus >= 201103L | |||
static const mask blank = space; | |||
#endif | |||
}; | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,74 @@ | |||
// Locale support -*- C++ -*- | |||
// Copyright (C) 2000-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/ctype_inline.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{locale} | |||
*/ | |||
// | |||
// ISO C++ 14882: 22.1 Locales | |||
// | |||
// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) | |||
// functions go in ctype.cc | |||
namespace std _GLIBCXX_VISIBILITY(default) | |||
{ | |||
_GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
bool | |||
ctype<char>:: | |||
is(mask __m, char __c) const | |||
{ return _M_table[static_cast<unsigned char>(__c)] & __m; } | |||
const char* | |||
ctype<char>:: | |||
is(const char* __low, const char* __high, mask* __vec) const | |||
{ | |||
while (__low < __high) | |||
*__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; | |||
return __high; | |||
} | |||
const char* | |||
ctype<char>:: | |||
scan_is(mask __m, const char* __low, const char* __high) const | |||
{ | |||
while (__low < __high && !this->is(__m, *__low)) | |||
++__low; | |||
return __low; | |||
} | |||
const char* | |||
ctype<char>:: | |||
scan_not(mask __m, const char* __low, const char* __high) const | |||
{ | |||
while (__low < __high && this->is(__m, *__low) != 0) | |||
++__low; | |||
return __low; | |||
} | |||
_GLIBCXX_END_NAMESPACE_VERSION | |||
} // namespace |
@@ -0,0 +1,82 @@ | |||
// Control various target specific ABI tweaks. ARM version. | |||
// Copyright (C) 2004-2020 Free Software Foundation, Inc. | |||
// | |||
// This file is part of the GNU ISO C++ Library. This library 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. | |||
// This library 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. | |||
// Under Section 7 of GPL version 3, you are granted additional | |||
// permissions described in the GCC Runtime Library Exception, version | |||
// 3.1, as published by the Free Software Foundation. | |||
// You should have received a copy of the GNU General Public License and | |||
// a copy of the GCC Runtime Library Exception along with this program; | |||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |||
// <http://www.gnu.org/licenses/>. | |||
/** @file bits/cxxabi_tweaks.h | |||
* This is an internal header file, included by other library headers. | |||
* Do not attempt to use it directly. @headername{cxxabi.h} | |||
*/ | |||
#ifndef _CXXABI_TWEAKS_H | |||
#define _CXXABI_TWEAKS_H 1 | |||
#ifdef __cplusplus | |||
namespace __cxxabiv1 | |||
{ | |||
extern "C" | |||
{ | |||
#endif | |||
#ifdef __ARM_EABI__ | |||
// The ARM EABI uses the least significant bit of a 32-bit | |||
// guard variable. */ | |||
#define _GLIBCXX_GUARD_TEST(x) ((*(x) & 1) != 0) | |||
#define _GLIBCXX_GUARD_SET(x) *(x) = 1 | |||
#define _GLIBCXX_GUARD_BIT 1 | |||
#define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||
#define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||
typedef int __guard; | |||
// We also want the element size in array cookies. | |||
#define _GLIBCXX_ELTSIZE_IN_COOKIE 1 | |||
// __cxa_vec_ctor should return a pointer to the array. | |||
typedef void * __cxa_vec_ctor_return_type; | |||
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return x | |||
// Constructors and destructors return the "this" pointer. | |||
typedef void * __cxa_cdtor_return_type; | |||
#else // __ARM_EABI__ | |||
// The generic ABI uses the first byte of a 64-bit guard variable. | |||
#define _GLIBCXX_GUARD_TEST(x) (*(char *) (x) != 0) | |||
#define _GLIBCXX_GUARD_SET(x) *(char *) (x) = 1 | |||
#define _GLIBCXX_GUARD_BIT __guard_test_bit (0, 1) | |||
#define _GLIBCXX_GUARD_PENDING_BIT __guard_test_bit (1, 1) | |||
#define _GLIBCXX_GUARD_WAITING_BIT __guard_test_bit (2, 1) | |||
__extension__ typedef int __guard __attribute__((mode (__DI__))); | |||
// __cxa_vec_ctor has void return type. | |||
typedef void __cxa_vec_ctor_return_type; | |||
#define _GLIBCXX_CXA_VEC_CTOR_RETURN(x) return | |||
// Constructors and destructors do not return a value. | |||
typedef void __cxa_cdtor_return_type; | |||
#endif //!__ARM_EABI__ | |||
#ifdef __cplusplus | |||
} | |||
} // namespace __cxxabiv1 | |||
#endif | |||
#endif |