From patchwork Thu Aug 10 05:13:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Fran=C3=A7ois_Dumont?= X-Patchwork-Id: 1819693 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=IiKAhzsL; dkim-atps=neutral Received: from server2.sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RLw8l0jX2z1yYl for ; Thu, 10 Aug 2023 15:14:46 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 07603385735E for ; Thu, 10 Aug 2023 05:14:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 07603385735E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1691644485; bh=Tm/w7d42F/QL7Cc0gHYGJgE0IaISYHpNbOgP+GKF1iY=; h=Date:To:Cc:Subject:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=IiKAhzsLJpaK+QMXpoOPr/qoWv+2X2znzzl+fZ0VyBDQtqBjMBGqgwXfWqoJ1oXqD xCykpvkGMprKPJUaG3wttfBDrCYYefNdoR5zGpCW0qaf8qXcZoTlXmqfeS9xbpeC79 M4Lcx6kYZbN83RIOdCM9ECgD9zYhAxuJ+B1PLqM8= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by sourceware.org (Postfix) with ESMTPS id D2A0A3858D20; Thu, 10 Aug 2023 05:13:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D2A0A3858D20 Received: by mail-wm1-x32b.google.com with SMTP id 5b1f17b1804b1-3fe4cdb72b9so4196635e9.0; Wed, 09 Aug 2023 22:13:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691644419; x=1692249219; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Tm/w7d42F/QL7Cc0gHYGJgE0IaISYHpNbOgP+GKF1iY=; b=HRtkznkDYfhPHlc6IFUrYLX49zcxlMn4r+D+3QK4wed1c6B6Kr50JdAuSllN7KaXV1 IOVFhA56EK8rjVm1vXcRdAnSX4KWiKa0/2xdSbKkdXbdb15pYyWWwRgwF722/KPY5Nk+ t1ORX1a78dmPLbq1kN2w9YvOtI+VROXf3UfwG2OjepiDR3y9AMJgG5LyZbs9L/7NO6Xc U7X3lre2xARzJGfebw/KNOfe+Q7RNvkvljwWNk6unT/UNTeT8/qE/ALVjKqclKT54se9 bQqJmND4pIge2fucXW1XOH0MWDYsT/3RaCKwttjPOewm597rV8Dan2Qy83J8VOfO66r+ 4c8g== X-Gm-Message-State: AOJu0YwyoMT5/oFBZkicTMaMfG3IYCdA7Xd6/BxwLl7BUs1a0TdpAiVb U2fkOHwIRbNVqxOB0qg8+ZVhSoX4LNc= X-Google-Smtp-Source: AGHT+IFk2Cwc7dFswpeTMUYl9lUHbpb6g68cLsI8iZwIIdxH4TK7zbwHufjSpEGYTWKbnIrEqAn1Mw== X-Received: by 2002:a5d:4241:0:b0:317:e7e0:8528 with SMTP id s1-20020a5d4241000000b00317e7e08528mr1090723wrr.50.1691644418607; Wed, 09 Aug 2023 22:13:38 -0700 (PDT) Received: from [192.168.42.159] (pop.92-184-123-137.mobile.abo.orange.fr. [92.184.123.137]) by smtp.gmail.com with ESMTPSA id h1-20020adffd41000000b0030ae499da59sm795635wrs.111.2023.08.09.22.13.37 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 09 Aug 2023 22:13:37 -0700 (PDT) Message-ID: <1dc681f4-41b7-d171-02ac-b0194617bdee@gmail.com> Date: Thu, 10 Aug 2023 07:13:36 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Content-Language: en-US To: libstdc++ Cc: gcc-patches Subject: [PATCH] sso-string@gnu-versioned-namespace [PR83077] X-Spam-Status: No, score=-9.3 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: =?utf-8?q?Fran=C3=A7ois_Dumont_via_Gcc-patches?= From: =?utf-8?q?Fran=C3=A7ois_Dumont?= Reply-To: =?utf-8?q?Fran=C3=A7ois_Dumont?= Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Hi I've eventually completed this work. This evolution will allow to build libstdc++ without dual abi and using cxx11 abi. For the moment such a config is only accessible through the --enable-symvers=gnu-versioned-namespace configuration.     libstdc++: [_GLIBCXX_INLINE_VERSION] Use cxx11 abi [PR83077]     Use cxx11 abi when activating versioned namespace mode.     libstdcxx-v3/ChangeLog:             PR libstdc++/83077             * acinclude.m4 [GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI]: Default to "new" libstdcxx abi.             * config/locale/dragonfly/monetary_members.cc [!_GLIBCXX_USE_DUAL_ABI]: Define money_base             members.             * config/locale/generic/monetary_members.cc [!_GLIBCXX_USE_DUAL_ABI]: Likewise.             * config/locale/gnu/monetary_members.cc [!_GLIBCXX_USE_DUAL_ABI]: Likewise.             * config/locale/gnu/numeric_members.cc             [!_GLIBCXX_USE_DUAL_ABI](__narrow_multibyte_chars): Define.             * configure: Regenerate.             * include/bits/c++config             [_GLIBCXX_INLINE_VERSION](_GLIBCXX_NAMESPACE_CXX11, _GLIBCXX_BEGIN_NAMESPACE_CXX11):             Define empty. [_GLIBCXX_INLINE_VERSION](_GLIBCXX_END_NAMESPACE_CXX11, _GLIBCXX_DEFAULT_ABI_TAG):             Likewise.             * include/bits/cow_string.h [!_GLIBCXX_USE_CXX11_ABI]: Define a light version of COW             basic_string as __std_cow_string for use in stdexcept.             * include/std/stdexcept [_GLIBCXX_USE_CXX11_ABI]: Define __cow_string.             (__cow_string(const char*)): New.             (__cow_string::c_str()): New.             * python/libstdcxx/v6/printers.py (StdStringPrinter::__init__): Set self.new_string to True             when std::__8::basic_string type is found.             * src/Makefile.am [ENABLE_SYMVERS_GNU_NAMESPACE](ldbl_alt128_compat_sources): Define empty.             * src/Makefile.in: Regenerate.             * src/c++11/Makefile.am (cxx11_abi_sources): Rename into...             (dual_abi_sources): ...this. Also move cow-local_init.cc, cxx11-hash_tr1.cc,             cxx11-ios_failure.cc entries to...             (sources): ...this.             (extra_string_inst_sources): Move cow-fstream-inst.cc, cow-sstream-inst.cc, cow-string-inst.cc,             cow-string-io-inst.cc, cow-wtring-inst.cc, cow-wstring-io-inst.cc, cxx11-locale-inst.cc,             cxx11-wlocale-inst.cc entries to...             (inst_sources): ...this.             * src/c++11/Makefile.in: Regenerate.             * src/c++11/cow-fstream-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-locale_init.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-sstream-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-stdexcept.cc [_GLIBCXX_USE_CXX11_ABI]: Include .             [_GLIBCXX_USE_DUAL_ABI || _GLIBCXX_USE_CXX11_ABI](__cow_string): Redefine before including             . Define _GLIBCXX_DEFINE_STDEXCEPT_INSTANTIATIONS so that __cow_string definition             in is skipped.             [_GLIBCXX_USE_CXX11_ABI]: Skip Transaction Memory TS definitions.             * src/c++11/cow-string-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-string-io-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-wstring-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cow-wstring-io-inst.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cxx11-hash_tr1.cc [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cxx11-ios_failure.cc [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             [!_GLIBCXX_USE_DUAL_ABI] (__ios_failure): Remove.             * src/c++11/cxx11-locale-inst.cc: Cleanup, just include locale-inst.cc.             * src/c++11/cxx11-stdexcept.cc [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/cxx11-wlocale-inst.cc [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++11/locale-inst-numeric.h [!_GLIBCXX_USE_DUAL_ABI](std::use_facet>, std::use_facet>): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](std::has_facet>, std::has_facet>): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](std::num_get>): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](std::num_put>): Instantiate.             * src/c++11/locale-inst.cc [!_GLIBCXX_USE_DUAL_ABI]: Build only when configured             _GLIBCXX_USE_CXX11_ABI is equal to currently built abi.             [!_GLIBCXX_USE_DUAL_ABI](__moneypunct_cache): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__moneypunct_cache): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__numpunct_cache): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__timepunct): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__timepunct_cache): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](time_put>): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](time_put_byname>): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](__ctype_abstract_base): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](ctype_byname): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__codecvt_abstract_base): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](codecvt_byname): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](codecvt_byname): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](use_facet>(const locale&)): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](use_facet>(const locale&)): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](use_facet<__timepunct>(const locale&)): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](use_facet>(const locale&)): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](has_facet>(const locale&)): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](has_facet>(const locale&)): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](has_facet<__timepunct>(const locale&)): Instantiate. [!_GLIBCXX_USE_DUAL_ABI](has_facet>(const locale&)): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__add_grouping): Define.             [!_GLIBCXX_USE_DUAL_ABI](__pad>): Instantiate.             [!_GLIBCXX_USE_DUAL_ABI](__int_to_char(C*, unsigned long, const C*,             ios_base::fmtflags, bool)): Define.             [!_GLIBCXX_USE_DUAL_ABI](__int_to_char(C*, unsigned long long, const C*,             ios_base::fmtflags, bool)): Define.             * src/c++11/string-inst.cc (_GLIBCXX_DEFINING_CXX11_ABI_INSTANTIATIONS): Define following             _GLIBCXX_USE_CXX11_ABI value.             [_GLIBCXX_USE_CXX11_ABI && !_GLIBCXX_DEFINING_CXX11_ABI_INSTANTIATIONS]:             Define _GLIBCXX_DEFINING_COW_STRING_INSTANTIATIONS. Include .             Define basic_string as __std_cow_string for the current translation unit.             * src/c++11/wlocale-inst.cc [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++98/Makefile.am (cxx11_abi_sources): Remove, unique cow-istream-string.cc entry             move to...             (inst_sources): ...this.             * src/c++98/Makefile.in: Regenerate.             * src/c++98/cow-istream-string.cc: Include .             [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++98/hash_tr1.cc [_GLIBCXX_USE_CXX11_ABI]: Skip definitions.             * src/c++98/ios_failure.cc [_GLIBCXX_USE_CXX11_ABI][_GLIBCXX_USE_DUAL_ABI]: Skip definitions.             * src/c++98/istream-string.cc [!_GLIBCXX_USE_DUAL_ABI]: Build only when configured             _GLIBCXX_USE_CXX11_ABI is equal to currently built abi.             * src/c++98/locale_facets.cc [_GLIBCXX_USE_CXX11_ABI](__verify_grouping): Remove.             * src/c++98/stdexcept.cc             [_GLIBCXX_USE_CXX11_ABI](logic_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](domain_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](invalid_argument(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](length_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](out_of_range(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](runtime_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](range_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](overflow_error(const string&): Remove.             [_GLIBCXX_USE_CXX11_ABI](underflow_error(const string&): Remove. Tested under linux x86_64 with following configs: --enable-symvers=gnu-versioned-namespace --disable-libstdcxx-dual-abi Ok to commit ? François diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index b25378eaace..322f1e42611 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -4875,12 +4875,16 @@ dnl AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI], [ GLIBCXX_ENABLE(libstdcxx-dual-abi,$1,,[support two versions of std::string]) if test x$enable_symvers = xgnu-versioned-namespace; then - # gnu-versioned-namespace is incompatible with the dual ABI. - enable_libstdcxx_dual_abi="no" - fi - if test x"$enable_libstdcxx_dual_abi" != xyes; then + # gnu-versioned-namespace is incompatible with the dual ABI... AC_MSG_NOTICE([dual ABI is disabled]) - default_libstdcxx_abi="gcc4-compatible" + enable_libstdcxx_dual_abi="no" + # ... and use the cxx11 one. + default_libstdcxx_abi="new" + else + if test x"$enable_libstdcxx_dual_abi" != xyes; then + AC_MSG_NOTICE([dual ABI is disabled]) + default_libstdcxx_abi="gcc4-compatible" + fi fi GLIBCXX_CONDITIONAL(ENABLE_DUAL_ABI, test $enable_libstdcxx_dual_abi = yes) ]) diff --git a/libstdc++-v3/config/locale/dragonfly/monetary_members.cc b/libstdc++-v3/config/locale/dragonfly/monetary_members.cc index f534bbe4aeb..3f96f2b9f11 100644 --- a/libstdc++-v3/config/locale/dragonfly/monetary_members.cc +++ b/libstdc++-v3/config/locale/dragonfly/monetary_members.cc @@ -39,7 +39,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // This file might be compiled twice, but we only want to define the members // of money_base once. -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI // Construct and return valid pattern consisting of some combination of: // space none symbol sign value @@ -207,7 +207,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } return __ret; } -#endif +#endif // ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI template<> void diff --git a/libstdc++-v3/config/locale/generic/monetary_members.cc b/libstdc++-v3/config/locale/generic/monetary_members.cc index 2c1cfeff094..a1ae136be04 100644 --- a/libstdc++-v3/config/locale/generic/monetary_members.cc +++ b/libstdc++-v3/config/locale/generic/monetary_members.cc @@ -36,7 +36,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // This file might be compiled twice, but we only want to define the members // of money_base once. -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI // Construct and return valid pattern consisting of some combination of: // space none symbol sign value diff --git a/libstdc++-v3/config/locale/gnu/monetary_members.cc b/libstdc++-v3/config/locale/gnu/monetary_members.cc index 1f46ea2f53f..87561bcc821 100644 --- a/libstdc++-v3/config/locale/gnu/monetary_members.cc +++ b/libstdc++-v3/config/locale/gnu/monetary_members.cc @@ -37,7 +37,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // This file might be compiled twice, but we only want to define the members // of money_base once. -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI // Construct and return valid pattern consisting of some combination of: // space none symbol sign value @@ -205,7 +205,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } return __ret; } -#endif +#endif // ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI extern char __narrow_multibyte_chars(const char* s, __locale_t cloc); diff --git a/libstdc++-v3/config/locale/gnu/numeric_members.cc b/libstdc++-v3/config/locale/gnu/numeric_members.cc index 220a0f8c510..cb8095e6ac7 100644 --- a/libstdc++-v3/config/locale/gnu/numeric_members.cc +++ b/libstdc++-v3/config/locale/gnu/numeric_members.cc @@ -39,7 +39,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION extern char __narrow_multibyte_chars(const char* s, __locale_t cloc); // This file might be compiled twice, but we only want to define this once. -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI char __narrow_multibyte_chars(const char* s, __locale_t cloc) { @@ -84,7 +84,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } return '\0'; } -#endif +#endif // ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI template<> void diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index c4da56c3042..fd431f28547 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -70702,13 +70702,18 @@ fi if test x$enable_symvers = xgnu-versioned-namespace; then - # gnu-versioned-namespace is incompatible with the dual ABI. - enable_libstdcxx_dual_abi="no" - fi - if test x"$enable_libstdcxx_dual_abi" != xyes; then + # gnu-versioned-namespace is incompatible with the dual ABI... { $as_echo "$as_me:${as_lineno-$LINENO}: dual ABI is disabled" >&5 $as_echo "$as_me: dual ABI is disabled" >&6;} - default_libstdcxx_abi="gcc4-compatible" + enable_libstdcxx_dual_abi="no" + # ... and use the cxx11 one. + default_libstdcxx_abi="new" + else + if test x"$enable_libstdcxx_dual_abi" != xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: dual ABI is disabled" >&5 +$as_echo "$as_me: dual ABI is disabled" >&6;} + default_libstdcxx_abi="gcc4-compatible" + fi fi diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index dd47f274d5f..b90efc81d33 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -337,26 +337,6 @@ namespace std #define _GLIBCXX_USE_CXX11_ABI #endif -#if _GLIBCXX_USE_CXX11_ABI -namespace std -{ - inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } -} -namespace __gnu_cxx -{ - inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } -} -# define _GLIBCXX_NAMESPACE_CXX11 __cxx11:: -# define _GLIBCXX_BEGIN_NAMESPACE_CXX11 namespace __cxx11 { -# define _GLIBCXX_END_NAMESPACE_CXX11 } -# define _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_ABI_TAG_CXX11 -#else -# define _GLIBCXX_NAMESPACE_CXX11 -# define _GLIBCXX_BEGIN_NAMESPACE_CXX11 -# define _GLIBCXX_END_NAMESPACE_CXX11 -# define _GLIBCXX_DEFAULT_ABI_TAG -#endif - // Non-zero if inline namespaces are used for versioning the entire library. #define _GLIBCXX_INLINE_VERSION @@ -415,7 +395,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Non-inline namespace for components replaced by alternates in active mode. namespace __cxx1998 { -# if _GLIBCXX_USE_CXX11_ABI +# if _GLIBCXX_USE_CXX11_ABI && ! _GLIBCXX_INLINE_VERSION inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } # endif } @@ -445,6 +425,26 @@ _GLIBCXX_END_NAMESPACE_VERSION # endif #endif +#if _GLIBCXX_USE_CXX11_ABI && ! _GLIBCXX_INLINE_VERSION +namespace std +{ + inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } +} +namespace __gnu_cxx +{ + inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } +} +# define _GLIBCXX_NAMESPACE_CXX11 __cxx11:: +# define _GLIBCXX_BEGIN_NAMESPACE_CXX11 namespace __cxx11 { +# define _GLIBCXX_END_NAMESPACE_CXX11 } +# define _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_ABI_TAG_CXX11 +#else +# define _GLIBCXX_NAMESPACE_CXX11 +# define _GLIBCXX_BEGIN_NAMESPACE_CXX11 +# define _GLIBCXX_END_NAMESPACE_CXX11 +# define _GLIBCXX_DEFAULT_ABI_TAG +#endif + // Macros for namespace scope. Either namespace std:: or the name // of some nested namespace within it corresponding to the active mode. // _GLIBCXX_STD_A diff --git a/libstdc++-v3/include/bits/cow_string.h b/libstdc++-v3/include/bits/cow_string.h index e5f094fd13e..d5b98d30a70 100644 --- a/libstdc++-v3/include/bits/cow_string.h +++ b/libstdc++-v3/include/bits/cow_string.h @@ -32,8 +32,6 @@ #ifndef _COW_STRING_H #define _COW_STRING_H 1 -#if ! _GLIBCXX_USE_CXX11_ABI - #include // _Atomic_word, __is_single_threaded #ifdef __cpp_lib_is_constant_evaluated @@ -44,6 +42,10 @@ # define __cpp_lib_constexpr_string 201611L #endif +#if _GLIBCXX_USE_CXX11_ABI +# define basic_string __std_cow_string +#endif + namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -835,6 +837,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION end() const _GLIBCXX_NOEXCEPT { return const_iterator(_M_data() + this->size()); } +#if ! _GLIBCXX_USE_CXX11_ABI /** * Returns a read/write reverse iterator that points to the last * character in the %string. Iteration is done in reverse element @@ -906,6 +909,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION crend() const noexcept { return const_reverse_iterator(this->begin()); } #endif +#endif // ! _GLIBCXX_USE_CXX11_ABI public: // Capacity: @@ -933,6 +937,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION max_size() const _GLIBCXX_NOEXCEPT { return _Rep::_S_max_size; } +#if ! _GLIBCXX_USE_CXX11_ABI /** * @brief Resizes the %string to the specified number of characters. * @param __n Number of characters the %string should contain. @@ -969,7 +974,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { reserve(); } #pragma GCC diagnostic pop #endif - +#endif // ! _GLIBCXX_USE_CXX11_ABI /** * Returns the total number of characters that the %string can hold * before needing to allocate more memory. @@ -978,6 +983,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION capacity() const _GLIBCXX_NOEXCEPT { return _M_rep()->_M_capacity; } +#if ! _GLIBCXX_USE_CXX11_ABI /** * @brief Attempt to preallocate enough memory for specified number of * characters. @@ -1026,6 +1032,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION clear() { _M_mutate(0, this->size(), 0); } #endif +#endif // ! _GLIBCXX_USE_CXX11_ABI /** * Returns true if the %string is empty. Equivalent to @@ -1035,6 +1042,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION empty() const _GLIBCXX_NOEXCEPT { return this->size() == 0; } +#if ! _GLIBCXX_USE_CXX11_ABI // Element access: /** * @brief Subscript access to the data contained in the %string. @@ -1345,6 +1353,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION traits_type::assign(_M_data()[this->size()], __c); _M_rep()->_M_set_length_and_sharable(__len); } +#endif // ! _GLIBCXX_USE_CXX11_ABI /** * @brief Set value to contents of another string. @@ -1489,6 +1498,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } #endif // C++17 +#if ! _GLIBCXX_USE_CXX11_ABI /** * @brief Insert multiple characters. * @param __p Iterator referencing location in string to insert at. @@ -2107,6 +2117,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return this->replace(__i1 - begin(), __i2 - __i1, __sv); } #endif // C++17 +#endif // ! _GLIBCXX_USE_CXX11_ABI private: template @@ -2178,6 +2189,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION public: +#if ! _GLIBCXX_USE_CXX11_ABI /** * @brief Copy substring into C string. * @param __s C string to copy value into. @@ -2192,6 +2204,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const; +#endif /** * @brief Swap contents with another string. @@ -2249,6 +2262,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION get_allocator() const _GLIBCXX_NOEXCEPT { return _M_dataplus; } +#if ! _GLIBCXX_USE_CXX11_ABI /** * @brief Find position of a C substring. * @param __s C string to locate. @@ -3054,6 +3068,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION contains(const _CharT* __x) const noexcept { return __sv_type(this->data(), this->size()).contains(__x); } #endif // C++23 +#endif // ! _GLIBCXX_USE_CXX11_ABI # ifdef _GLIBCXX_TM_TS_INTERNAL friend void @@ -3257,6 +3272,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } } +#if ! _GLIBCXX_USE_CXX11_ABI template basic_string<_CharT, _Traits, _Alloc>& basic_string<_CharT, _Traits, _Alloc>:: @@ -3420,6 +3436,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return _M_replace_safe(__pos, __n1, __tmp._M_data(), __n2); } } +#endif // ! _GLIBCXX_USE_CXX11_ABI template void @@ -3481,6 +3498,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_rep()->_M_set_length_and_sharable(__new_size); } +#if ! _GLIBCXX_USE_CXX11_ABI template void basic_string<_CharT, _Traits, _Alloc>:: @@ -3506,6 +3524,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_rep()->_M_dispose(__a); _M_data(__tmp); } +#endif template void @@ -3629,6 +3648,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __r->_M_refdata(); } +#if ! _GLIBCXX_USE_CXX11_ABI template void basic_string<_CharT, _Traits, _Alloc>:: @@ -3642,6 +3662,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION this->erase(__n); // else nothing (in particular, avoid calling _M_mutate() unnecessarily.) } + #endif template template @@ -3682,6 +3703,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return *this; } +#if ! _GLIBCXX_USE_CXX11_ABI template void basic_string<_CharT, _Traits, _Alloc>:: @@ -3716,7 +3738,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // 21.3.5.7 par 3: do not append null. (good.) return __n; } +#endif // ! _GLIBCXX_USE_CXX11_ABI _GLIBCXX_END_NAMESPACE_VERSION } // namespace std -#endif // ! _GLIBCXX_USE_CXX11_ABI + +#if _GLIBCXX_USE_CXX11_ABI +# undef basic_string +#endif #endif // _COW_STRING_H diff --git a/libstdc++-v3/include/std/stdexcept b/libstdc++-v3/include/std/stdexcept index 66c8572d0cd..07e6c74e37f 100644 --- a/libstdc++-v3/include/std/stdexcept +++ b/libstdc++-v3/include/std/stdexcept @@ -42,8 +42,9 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION -#if _GLIBCXX_USE_DUAL_ABI +#if _GLIBCXX_USE_DUAL_ABI || _GLIBCXX_USE_CXX11_ABI #if _GLIBCXX_USE_CXX11_ABI +# if ! _GLIBCXX_DEFINE_STDEXCEPT_INSTANTIATIONS // Emulates an old COW string when the new std::string is in use. struct __cow_string { @@ -54,6 +55,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __cow_string(); __cow_string(const std::string&); + __cow_string(const char*); __cow_string(const char*, size_t); __cow_string(const __cow_string&) _GLIBCXX_NOTHROW; __cow_string& operator=(const __cow_string&) _GLIBCXX_NOTHROW; @@ -62,7 +64,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __cow_string(__cow_string&&) noexcept; __cow_string& operator=(__cow_string&&) noexcept; #endif + const char* c_str() const _GLIBCXX_NOEXCEPT; }; +# endif // ! _GLIBCXX_DEFINE_STDEXCEPT_INSTANTIATIONS typedef basic_string __sso_string; #else // _GLIBCXX_USE_CXX11_ABI @@ -95,7 +99,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif }; #endif // _GLIBCXX_USE_CXX11_ABI -#else // _GLIBCXX_USE_DUAL_ABI +#else // ! _GLIBCXX_USE_DUAL_ABI && ! _GLIBCXX_USE_CXX11_ABI typedef basic_string __sso_string; typedef basic_string __cow_string; #endif @@ -127,7 +131,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION logic_error& operator=(logic_error&&) noexcept; #endif -#if _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINE_STDEXCEPT_COPY_OPS +#if _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINE_STDEXCEPT_INSTANTIATIONS logic_error(const logic_error&) _GLIBCXX_NOTHROW; logic_error& operator=(const logic_error&) _GLIBCXX_NOTHROW; #elif __cplusplus >= 201103L @@ -233,7 +237,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION runtime_error& operator=(runtime_error&&) noexcept; #endif -#if _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINE_STDEXCEPT_COPY_OPS +#if _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINE_STDEXCEPT_INSTANTIATIONS runtime_error(const runtime_error&) _GLIBCXX_NOTHROW; runtime_error& operator=(const runtime_error&) _GLIBCXX_NOTHROW; #elif __cplusplus >= 201103L diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index b4c427d487c..a43bf105308 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -963,6 +963,8 @@ class StdStringPrinter: def __init__(self, typename, val): self.val = val self.new_string = typename.find("::__cxx11::basic_string") != -1 + if not self.new_string and _versioned_namespace: + self.new_string = typename.find("::" + _versioned_namespace + "basic_string") != -1 def to_string(self): # Make sure &string works, too. diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am index 5b9af41cdb9..ec0c502ecb1 100644 --- a/libstdc++-v3/src/Makefile.am +++ b/libstdc++-v3/src/Makefile.am @@ -89,6 +89,9 @@ else ldbl_compat_sources = endif +if ENABLE_SYMVERS_GNU_NAMESPACE +ldbl_alt128_compat_sources = +else if GLIBCXX_LDBL_ALT128_COMPAT if ENABLE_DUAL_ABI ldbl_alt128_compat_cxx11_sources = \ @@ -102,6 +105,7 @@ ldbl_alt128_compat_sources = \ else ldbl_alt128_compat_sources = endif +endif if ENABLE_SYMVERS_GNU_NAMESPACE cxx0x_compat_sources = diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in index f42d957af36..c9c1b65db52 100644 --- a/libstdc++-v3/src/Makefile.in +++ b/libstdc++-v3/src/Makefile.in @@ -157,10 +157,9 @@ am__objects_2 = compatibility.lo compatibility-debug_list.lo \ @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ compatibility-chrono.lo \ @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ compatibility-condvar.lo \ @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ compatibility-thread-c++0x.lo -@ENABLE_DUAL_ABI_TRUE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@am__objects_4 = compatibility-ldbl-alt128-cxx11.lo -@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@am__objects_5 = \ -@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ compatibility-ldbl-alt128.lo \ -@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ $(am__objects_4) +@ENABLE_DUAL_ABI_TRUE@@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@am__objects_4 = compatibility-ldbl-alt128-cxx11.lo +@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@am__objects_5 = compatibility-ldbl-alt128.lo \ +@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ $(am__objects_4) am__objects_6 = $(am__objects_3) $(am__objects_5) @GLIBCXX_HOSTED_TRUE@am_libstdc___la_OBJECTS = $(am__objects_2) \ @GLIBCXX_HOSTED_TRUE@ $(am__objects_6) @@ -510,14 +509,15 @@ SUBDIRS = c++98 c++11 c++17 c++20 $(filesystem_dir) $(backtrace_dir) $(experimen @GLIBCXX_LDBL_COMPAT_FALSE@ldbl_compat_sources = @GLIBCXX_LDBL_COMPAT_TRUE@ldbl_compat_sources = compatibility-ldbl.cc -@ENABLE_DUAL_ABI_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ldbl_alt128_compat_cxx11_sources = -@ENABLE_DUAL_ABI_TRUE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ldbl_alt128_compat_cxx11_sources = \ -@ENABLE_DUAL_ABI_TRUE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ compatibility-ldbl-alt128-cxx11.cc - -@GLIBCXX_LDBL_ALT128_COMPAT_FALSE@ldbl_alt128_compat_sources = -@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ldbl_alt128_compat_sources = \ -@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ compatibility-ldbl-alt128.cc \ -@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ ${ldbl_alt128_compat_cxx11_sources} +@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_FALSE@ldbl_alt128_compat_sources = +@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ldbl_alt128_compat_sources = \ +@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ compatibility-ldbl-alt128.cc \ +@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ ${ldbl_alt128_compat_cxx11_sources} + +@ENABLE_SYMVERS_GNU_NAMESPACE_TRUE@ldbl_alt128_compat_sources = +@ENABLE_DUAL_ABI_FALSE@@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ldbl_alt128_compat_cxx11_sources = +@ENABLE_DUAL_ABI_TRUE@@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ldbl_alt128_compat_cxx11_sources = \ +@ENABLE_DUAL_ABI_TRUE@@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@@GLIBCXX_LDBL_ALT128_COMPAT_TRUE@ compatibility-ldbl-alt128-cxx11.cc @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@cxx0x_compat_sources = \ @ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@ compatibility-atomic-c++0x.cc \ diff --git a/libstdc++-v3/src/c++11/Makefile.am b/libstdc++-v3/src/c++11/Makefile.am index 682be1669a4..82227338798 100644 --- a/libstdc++-v3/src/c++11/Makefile.am +++ b/libstdc++-v3/src/c++11/Makefile.am @@ -40,15 +40,11 @@ ctype_members.cc: ${glibcxx_srcdir}/$(CCTYPE_CC) $(LN_S) ${glibcxx_srcdir}/$(CCTYPE_CC) . || true if ENABLE_DUAL_ABI -cxx11_abi_sources = \ - cow-locale_init.cc \ +dual_abi_sources = \ cow-shim_facets.cc \ - cxx11-hash_tr1.cc \ - cxx11-ios_failure.cc \ - cxx11-shim_facets.cc \ - cxx11-stdexcept.cc + cxx11-shim_facets.cc else -cxx11_abi_sources = +dual_abi_sources = endif sources_freestanding = \ @@ -59,8 +55,12 @@ sources = \ chrono.cc \ codecvt.cc \ condition_variable.cc \ + cow-locale_init.cc \ cow-stdexcept.cc \ ctype.cc \ + cxx11-hash_tr1.cc \ + cxx11-ios_failure.cc \ + cxx11-stdexcept.cc \ debug.cc \ functexcept.cc \ functional.cc \ @@ -77,19 +77,11 @@ sources = \ snprintf_lite.cc \ system_error.cc \ thread.cc \ - ${cxx11_abi_sources} \ + ${dual_abi_sources} \ ${host_sources} if ENABLE_DUAL_ABI extra_string_inst_sources = \ - cow-fstream-inst.cc \ - cow-sstream-inst.cc \ - cow-string-inst.cc \ - cow-string-io-inst.cc \ - cow-wstring-inst.cc \ - cow-wstring-io-inst.cc \ - cxx11-locale-inst.cc \ - cxx11-wlocale-inst.cc \ sso_string.cc else extra_string_inst_sources = @@ -99,6 +91,14 @@ if ENABLE_EXTERN_TEMPLATE # XTEMPLATE_FLAGS = -fno-implicit-templates inst_sources = \ $(extra_string_inst_sources) \ + cow-fstream-inst.cc \ + cow-sstream-inst.cc \ + cow-string-inst.cc \ + cow-string-io-inst.cc \ + cow-wstring-inst.cc \ + cow-wstring-io-inst.cc \ + cxx11-locale-inst.cc \ + cxx11-wlocale-inst.cc \ ext11-inst.cc \ fstream-inst.cc \ ios-inst.cc \ diff --git a/libstdc++-v3/src/c++11/Makefile.in b/libstdc++-v3/src/c++11/Makefile.in index e7a09fe3246..2d94425480b 100644 --- a/libstdc++-v3/src/c++11/Makefile.in +++ b/libstdc++-v3/src/c++11/Makefile.in @@ -122,25 +122,26 @@ CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libc__11convenience_la_LIBADD = am__objects_1 = limits.lo placeholders.lo -@ENABLE_DUAL_ABI_TRUE@am__objects_2 = cow-locale_init.lo \ -@ENABLE_DUAL_ABI_TRUE@ cow-shim_facets.lo cxx11-hash_tr1.lo \ -@ENABLE_DUAL_ABI_TRUE@ cxx11-ios_failure.lo \ -@ENABLE_DUAL_ABI_TRUE@ cxx11-shim_facets.lo cxx11-stdexcept.lo +@ENABLE_DUAL_ABI_TRUE@am__objects_2 = cow-shim_facets.lo \ +@ENABLE_DUAL_ABI_TRUE@ cxx11-shim_facets.lo am__objects_3 = ctype_configure_char.lo ctype_members.lo am__objects_4 = chrono.lo codecvt.lo condition_variable.lo \ - cow-stdexcept.lo ctype.lo debug.lo functexcept.lo \ - functional.lo futex.lo future.lo hash_c++0x.lo \ + cow-locale_init.lo cow-stdexcept.lo ctype.lo cxx11-hash_tr1.lo \ + cxx11-ios_failure.lo cxx11-stdexcept.lo debug.lo \ + functexcept.lo functional.lo futex.lo future.lo hash_c++0x.lo \ hashtable_c++0x.lo ios.lo ios_errcat.lo mutex.lo random.lo \ regex.lo shared_ptr.lo snprintf_lite.lo system_error.lo \ thread.lo $(am__objects_2) $(am__objects_3) -@ENABLE_DUAL_ABI_TRUE@am__objects_5 = cow-fstream-inst.lo \ -@ENABLE_DUAL_ABI_TRUE@ cow-sstream-inst.lo cow-string-inst.lo \ -@ENABLE_DUAL_ABI_TRUE@ cow-string-io-inst.lo \ -@ENABLE_DUAL_ABI_TRUE@ cow-wstring-inst.lo \ -@ENABLE_DUAL_ABI_TRUE@ cow-wstring-io-inst.lo \ -@ENABLE_DUAL_ABI_TRUE@ cxx11-locale-inst.lo \ -@ENABLE_DUAL_ABI_TRUE@ cxx11-wlocale-inst.lo sso_string.lo +@ENABLE_DUAL_ABI_TRUE@am__objects_5 = sso_string.lo @ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_6 = $(am__objects_5) \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-fstream-inst.lo \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-sstream-inst.lo \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-string-inst.lo \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-string-io-inst.lo \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-wstring-inst.lo \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-wstring-io-inst.lo \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cxx11-locale-inst.lo \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cxx11-wlocale-inst.lo \ @ENABLE_EXTERN_TEMPLATE_TRUE@ ext11-inst.lo fstream-inst.lo \ @ENABLE_EXTERN_TEMPLATE_TRUE@ ios-inst.lo iostream-inst.lo \ @ENABLE_EXTERN_TEMPLATE_TRUE@ istream-inst.lo locale-inst.lo \ @@ -461,14 +462,10 @@ host_sources = \ ctype_configure_char.cc \ ctype_members.cc -@ENABLE_DUAL_ABI_FALSE@cxx11_abi_sources = -@ENABLE_DUAL_ABI_TRUE@cxx11_abi_sources = \ -@ENABLE_DUAL_ABI_TRUE@ cow-locale_init.cc \ +@ENABLE_DUAL_ABI_FALSE@dual_abi_sources = +@ENABLE_DUAL_ABI_TRUE@dual_abi_sources = \ @ENABLE_DUAL_ABI_TRUE@ cow-shim_facets.cc \ -@ENABLE_DUAL_ABI_TRUE@ cxx11-hash_tr1.cc \ -@ENABLE_DUAL_ABI_TRUE@ cxx11-ios_failure.cc \ -@ENABLE_DUAL_ABI_TRUE@ cxx11-shim_facets.cc \ -@ENABLE_DUAL_ABI_TRUE@ cxx11-stdexcept.cc +@ENABLE_DUAL_ABI_TRUE@ cxx11-shim_facets.cc sources_freestanding = \ limits.cc \ @@ -478,8 +475,12 @@ sources = \ chrono.cc \ codecvt.cc \ condition_variable.cc \ + cow-locale_init.cc \ cow-stdexcept.cc \ ctype.cc \ + cxx11-hash_tr1.cc \ + cxx11-ios_failure.cc \ + cxx11-stdexcept.cc \ debug.cc \ functexcept.cc \ functional.cc \ @@ -496,19 +497,11 @@ sources = \ snprintf_lite.cc \ system_error.cc \ thread.cc \ - ${cxx11_abi_sources} \ + ${dual_abi_sources} \ ${host_sources} @ENABLE_DUAL_ABI_FALSE@extra_string_inst_sources = @ENABLE_DUAL_ABI_TRUE@extra_string_inst_sources = \ -@ENABLE_DUAL_ABI_TRUE@ cow-fstream-inst.cc \ -@ENABLE_DUAL_ABI_TRUE@ cow-sstream-inst.cc \ -@ENABLE_DUAL_ABI_TRUE@ cow-string-inst.cc \ -@ENABLE_DUAL_ABI_TRUE@ cow-string-io-inst.cc \ -@ENABLE_DUAL_ABI_TRUE@ cow-wstring-inst.cc \ -@ENABLE_DUAL_ABI_TRUE@ cow-wstring-io-inst.cc \ -@ENABLE_DUAL_ABI_TRUE@ cxx11-locale-inst.cc \ -@ENABLE_DUAL_ABI_TRUE@ cxx11-wlocale-inst.cc \ @ENABLE_DUAL_ABI_TRUE@ sso_string.cc # XTEMPLATE_FLAGS = @@ -517,6 +510,14 @@ sources = \ # XTEMPLATE_FLAGS = -fno-implicit-templates @ENABLE_EXTERN_TEMPLATE_TRUE@inst_sources = \ @ENABLE_EXTERN_TEMPLATE_TRUE@ $(extra_string_inst_sources) \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-fstream-inst.cc \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-sstream-inst.cc \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-string-inst.cc \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-string-io-inst.cc \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-wstring-inst.cc \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cow-wstring-io-inst.cc \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cxx11-locale-inst.cc \ +@ENABLE_EXTERN_TEMPLATE_TRUE@ cxx11-wlocale-inst.cc \ @ENABLE_EXTERN_TEMPLATE_TRUE@ ext11-inst.cc \ @ENABLE_EXTERN_TEMPLATE_TRUE@ fstream-inst.cc \ @ENABLE_EXTERN_TEMPLATE_TRUE@ ios-inst.cc \ diff --git a/libstdc++-v3/src/c++11/cow-fstream-inst.cc b/libstdc++-v3/src/c++11/cow-fstream-inst.cc index 0562bc6c9cb..8153387daea 100644 --- a/libstdc++-v3/src/c++11/cow-fstream-inst.cc +++ b/libstdc++-v3/src/c++11/cow-fstream-inst.cc @@ -29,10 +29,7 @@ #define _GLIBCXX_USE_CXX11_ABI 0 #include -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. -#endif - +#if ! _GLIBCXX_USE_CXX11_ABI namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -76,3 +73,4 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace +#endif diff --git a/libstdc++-v3/src/c++11/cow-locale_init.cc b/libstdc++-v3/src/c++11/cow-locale_init.cc index 85277763427..6833f903f47 100644 --- a/libstdc++-v3/src/c++11/cow-locale_init.cc +++ b/libstdc++-v3/src/c++11/cow-locale_init.cc @@ -24,10 +24,7 @@ #define _GLIBCXX_USE_CXX11_ABI 0 #include -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. -#endif - +#if ! _GLIBCXX_USE_CXX11_ABI namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -165,6 +162,7 @@ namespace #endif } +#if _GLIBCXX_USE_DUAL_ABI // TODO should be in another file string locale::name() const @@ -190,6 +188,8 @@ namespace } return __ret; } +#endif _GLIBCXX_END_NAMESPACE_VERSION } +#endif // ! _GLIBCXX_USE_CXX11_ABI diff --git a/libstdc++-v3/src/c++11/cow-sstream-inst.cc b/libstdc++-v3/src/c++11/cow-sstream-inst.cc index 035a267d9d8..7699170d13d 100644 --- a/libstdc++-v3/src/c++11/cow-sstream-inst.cc +++ b/libstdc++-v3/src/c++11/cow-sstream-inst.cc @@ -27,8 +27,8 @@ // #define _GLIBCXX_USE_CXX11_ABI 0 -#include "sstream-inst.cc" +#include -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. +#if ! _GLIBCXX_USE_CXX11_ABI +# include "sstream-inst.cc" #endif diff --git a/libstdc++-v3/src/c++11/cow-stdexcept.cc b/libstdc++-v3/src/c++11/cow-stdexcept.cc index 8d1cc4605d4..8d5eec814d2 100644 --- a/libstdc++-v3/src/c++11/cow-stdexcept.cc +++ b/libstdc++-v3/src/c++11/cow-stdexcept.cc @@ -43,11 +43,53 @@ _txnal_runtime_error_get_msg(void* e); // All exception classes still use the classic COW std::string. #define _GLIBCXX_USE_CXX11_ABI 0 -#define _GLIBCXX_DEFINE_STDEXCEPT_COPY_OPS 1 -#define __cow_string __cow_stringxxx +#include + +#if _GLIBCXX_USE_CXX11_ABI +# include +#endif + +#if _GLIBCXX_USE_DUAL_ABI || _GLIBCXX_USE_CXX11_ABI + +namespace std _GLIBCXX_VISIBILITY(default) +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + +#if ! _GLIBCXX_USE_CXX11_ABI + typedef std::string cowstr; +#else + typedef std::__std_cow_string, + std::allocator> cowstr; +#endif + + // Redefine __cow_string so that we can define and export its members + // in terms of the COW std::string. + struct __cow_string + { + union { + const char* _M_p; + char _M_bytes[sizeof(_M_p)]; + cowstr _M_str; + }; + + __cow_string(); + __cow_string(const std::string& s); + __cow_string(const char*); + __cow_string(const char*, size_t); + __cow_string(const __cow_string&) noexcept; + __cow_string& operator=(const __cow_string&) noexcept; + ~__cow_string(); + __cow_string(__cow_string&&) noexcept; + __cow_string& operator=(__cow_string&&) noexcept; + const char* c_str() const noexcept; + }; +_GLIBCXX_END_NAMESPACE_VERSION +} +#endif + +#define _GLIBCXX_DEFINE_STDEXCEPT_INSTANTIATIONS 1 #include #include -#undef __cow_string namespace std _GLIBCXX_VISIBILITY(default) { @@ -114,30 +156,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Converting constructor from COW std::string to SSO string. __sso_string::__sso_string(const string& s) : __sso_string(s.c_str(), s.length()) { } +#endif - // Redefine __cow_string so that we can define and export its members - // in terms of the COW std::string. - struct __cow_string - { - union { - const char* _M_p; - char _M_bytes[sizeof(_M_p)]; - std::string _M_str; - }; - - __cow_string(); - __cow_string(const std::string& s); - __cow_string(const char*, size_t n); - __cow_string(const __cow_string&) noexcept; - __cow_string& operator=(const __cow_string&) noexcept; - ~__cow_string(); - __cow_string(__cow_string&&) noexcept; - __cow_string& operator=(__cow_string&&) noexcept; - }; +#if _GLIBCXX_USE_DUAL_ABI || _GLIBCXX_USE_CXX11_ABI __cow_string::__cow_string() : _M_str() { } +#if ! _GLIBCXX_USE_CXX11_ABI __cow_string::__cow_string(const std::string& s) : _M_str(s) { } +#endif + + __cow_string::__cow_string(const char* s) : _M_str(s) { } __cow_string::__cow_string(const char* s, size_t n) : _M_str(s, n) { } @@ -151,7 +180,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return *this; } - __cow_string::~__cow_string() { _M_str.~basic_string(); } + __cow_string::~__cow_string() { _M_str.~cowstr(); } __cow_string::__cow_string(__cow_string&& s) noexcept : _M_str(std::move(s._M_str)) { } @@ -163,12 +192,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return *this; } - static_assert(sizeof(__cow_string) == sizeof(std::string), + const char* + __cow_string::c_str() const noexcept + { return _M_str.c_str(); } + + static_assert(sizeof(__cow_string) == sizeof(cowstr), "sizeof(std::string) has changed"); - static_assert(alignof(__cow_string) == alignof(std::string), + static_assert(alignof(__cow_string) == alignof(cowstr), "alignof(std::string) has changed"); -#endif +#endif // _GLIBCXX_USE_DUAL_ABI || _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI // Return error_category::message() as an SSO string __sso_string error_category::_M_message(int i) const @@ -176,10 +210,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION string msg = this->message(i); return {msg.c_str(), msg.length()}; } +#endif _GLIBCXX_END_NAMESPACE_VERSION } // namespace +#if ! _GLIBCXX_USE_CXX11_ABI // Support for the Transactional Memory TS (N4514). // // logic_error and runtime_error both carry a message in the form of a COW @@ -463,3 +499,4 @@ CTORDTOR(15underflow_error, std::underflow_error, runtime_error) #endif // _GLIBCXX_USE_C99_STDINT #endif // _GLIBCXX_USE_WEAK_REF +#endif // ! _GLIBCXX_USE_CXX11_ABI diff --git a/libstdc++-v3/src/c++11/cow-string-inst.cc b/libstdc++-v3/src/c++11/cow-string-inst.cc index 5a2b8ffa568..57c28129f00 100644 --- a/libstdc++-v3/src/c++11/cow-string-inst.cc +++ b/libstdc++-v3/src/c++11/cow-string-inst.cc @@ -29,10 +29,7 @@ #define _GLIBCXX_USE_CXX11_ABI 0 #include "string-inst.cc" -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. -#endif - +#if _GLIBCXX_USE_DUAL_ABI && ! _GLIBCXX_USE_CXX11_ABI #include namespace std _GLIBCXX_VISIBILITY(default) @@ -45,3 +42,4 @@ namespace std _GLIBCXX_VISIBILITY(default) random_device::_M_init_pretr1(const std::string& token) { _M_init(token.c_str(), token.length()); } } // namespace +#endif diff --git a/libstdc++-v3/src/c++11/cow-string-io-inst.cc b/libstdc++-v3/src/c++11/cow-string-io-inst.cc index 505bc9dd384..9abc9b47e52 100644 --- a/libstdc++-v3/src/c++11/cow-string-io-inst.cc +++ b/libstdc++-v3/src/c++11/cow-string-io-inst.cc @@ -30,10 +30,7 @@ #include #include -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. -#endif - +#if ! _GLIBCXX_USE_CXX11_ABI namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -57,3 +54,4 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace +#endif diff --git a/libstdc++-v3/src/c++11/cow-wstring-inst.cc b/libstdc++-v3/src/c++11/cow-wstring-inst.cc index ce533ea8fa5..d3c3b0c297e 100644 --- a/libstdc++-v3/src/c++11/cow-wstring-inst.cc +++ b/libstdc++-v3/src/c++11/cow-wstring-inst.cc @@ -29,12 +29,9 @@ #define _GLIBCXX_USE_CXX11_ABI 0 #include +#if ! _GLIBCXX_USE_CXX11_ABI #ifdef _GLIBCXX_USE_WCHAR_T #define C wchar_t #include "string-inst.cc" - -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. #endif - #endif diff --git a/libstdc++-v3/src/c++11/cow-wstring-io-inst.cc b/libstdc++-v3/src/c++11/cow-wstring-io-inst.cc index 49394b0e275..0e6cc490fa4 100644 --- a/libstdc++-v3/src/c++11/cow-wstring-io-inst.cc +++ b/libstdc++-v3/src/c++11/cow-wstring-io-inst.cc @@ -29,14 +29,11 @@ #define _GLIBCXX_USE_CXX11_ABI 0 #include +#if ! _GLIBCXX_USE_CXX11_ABI #ifdef _GLIBCXX_USE_WCHAR_T #include #include -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. -#endif - namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -61,3 +58,4 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace #endif +#endif diff --git a/libstdc++-v3/src/c++11/cxx11-hash_tr1.cc b/libstdc++-v3/src/c++11/cxx11-hash_tr1.cc index 22a7685eeca..0b9fc28ceaa 100644 --- a/libstdc++-v3/src/c++11/cxx11-hash_tr1.cc +++ b/libstdc++-v3/src/c++11/cxx11-hash_tr1.cc @@ -25,9 +25,7 @@ #define _GLIBCXX_USE_CXX11_ABI 1 #include -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. -#endif +#if _GLIBCXX_USE_CXX11_ABI #include namespace std _GLIBCXX_VISIBILITY(default) @@ -57,3 +55,5 @@ namespace std _GLIBCXX_VISIBILITY(default) #endif } } + +#endif // _GLIBCXX_USE_CXX11_ABI diff --git a/libstdc++-v3/src/c++11/cxx11-ios_failure.cc b/libstdc++-v3/src/c++11/cxx11-ios_failure.cc index e0e816b453b..46bfda329de 100644 --- a/libstdc++-v3/src/c++11/cxx11-ios_failure.cc +++ b/libstdc++-v3/src/c++11/cxx11-ios_failure.cc @@ -38,9 +38,7 @@ # define _(msgid) (msgid) #endif -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. -#endif +#if _GLIBCXX_USE_CXX11_ABI namespace std _GLIBCXX_VISIBILITY(default) { @@ -62,7 +60,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ios_base::failure::what() const throw() { return runtime_error::what(); } -#if __cpp_rtti +#if _GLIBCXX_USE_DUAL_ABI && __cpp_rtti // These functions are defined in src/c++98/ios_failure.cc extern void __construct_ios_failure(void*, const char*); extern void __destroy_ios_failure(void*); @@ -118,7 +116,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Otherwise proceed as normal to see if the handler matches. return __class_type_info::__do_upcast(dst_type, obj_ptr); } -#else // ! __cpp_rtti +#else // ! _GLIBCXX_USE_DUAL_ABI || ! __cpp_rtti using __ios_failure = ios::failure; #endif @@ -136,3 +134,5 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace + +#endif // _GLIBCXX_USE_CXX11_ABI diff --git a/libstdc++-v3/src/c++11/cxx11-locale-inst.cc b/libstdc++-v3/src/c++11/cxx11-locale-inst.cc index 94b181886d3..e21cc5548bf 100644 --- a/libstdc++-v3/src/c++11/cxx11-locale-inst.cc +++ b/libstdc++-v3/src/c++11/cxx11-locale-inst.cc @@ -27,11 +27,5 @@ // Facet instantiations using new ABI strings. #define _GLIBCXX_USE_CXX11_ABI 1 -#include -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. -#endif -#define C char -#define C_is_char -# include "locale-inst.cc" +#include "locale-inst.cc" diff --git a/libstdc++-v3/src/c++11/cxx11-stdexcept.cc b/libstdc++-v3/src/c++11/cxx11-stdexcept.cc index 74c070c0439..38ab35692a3 100644 --- a/libstdc++-v3/src/c++11/cxx11-stdexcept.cc +++ b/libstdc++-v3/src/c++11/cxx11-stdexcept.cc @@ -29,9 +29,7 @@ #define _GLIBCXX_USE_CXX11_ABI 1 #include -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. -#endif +#if _GLIBCXX_USE_CXX11_ABI namespace std _GLIBCXX_VISIBILITY(default) { @@ -76,3 +74,5 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace + +#endif // _GLIBCXX_USE_CXX11_ABI diff --git a/libstdc++-v3/src/c++11/cxx11-wlocale-inst.cc b/libstdc++-v3/src/c++11/cxx11-wlocale-inst.cc index 11fb15d9602..faff236c1df 100644 --- a/libstdc++-v3/src/c++11/cxx11-wlocale-inst.cc +++ b/libstdc++-v3/src/c++11/cxx11-wlocale-inst.cc @@ -28,11 +28,10 @@ #define _GLIBCXX_USE_CXX11_ABI 1 #include -#if ! _GLIBCXX_USE_DUAL_ABI -# error This file should not be compiled for this configuration. -#endif -#ifdef _GLIBCXX_USE_WCHAR_T -#define C wchar_t -#include "locale-inst.cc" +#if _GLIBCXX_USE_CXX11_ABI +# ifdef _GLIBCXX_USE_WCHAR_T +# define C wchar_t +# include "locale-inst.cc" +# endif #endif diff --git a/libstdc++-v3/src/c++11/locale-inst-numeric.h b/libstdc++-v3/src/c++11/locale-inst-numeric.h index b917fe5802e..211e19c7ff9 100644 --- a/libstdc++-v3/src/c++11/locale-inst-numeric.h +++ b/libstdc++-v3/src/c++11/locale-inst-numeric.h @@ -30,7 +30,7 @@ namespace std _GLIBCXX_VISIBILITY(default) { -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI // use_facet and has_facet instantiations INSTANTIATE_FACET_ACCESSORS(num_get); INSTANTIATE_FACET_ACCESSORS(num_put); @@ -38,7 +38,7 @@ INSTANTIATE_FACET_ACCESSORS(num_put); _GLIBCXX_BEGIN_NAMESPACE_LDBL -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI template class num_get >; template class num_put >; #endif @@ -88,7 +88,7 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL unsigned long long&) const; #endif -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI // num_put member function templates template ostreambuf_iterator diff --git a/libstdc++-v3/src/c++11/locale-inst.cc b/libstdc++-v3/src/c++11/locale-inst.cc index 3a5c6844f1b..ee3375d7040 100644 --- a/libstdc++-v3/src/c++11/locale-inst.cc +++ b/libstdc++-v3/src/c++11/locale-inst.cc @@ -35,8 +35,17 @@ # define _GLIBCXX_USE_CXX11_ABI 0 #endif -#include +#if _GLIBCXX_USE_CXX11_ABI +# define _GLIBCXX_BUILD_CXX11_ABI 1 +#else +# define _GLIBCXX_BUILD_CXX11_ABI 0 +#endif + +#include +#if _GLIBCXX_BUILD_CXX11_ABI == _GLIBCXX_USE_CXX11_ABI + +#include // Instantiation configuration. #ifndef C # define C char @@ -52,7 +61,7 @@ namespace std _GLIBCXX_VISIBILITY(default) _GLIBCXX_BEGIN_NAMESPACE_VERSION // moneypunct, money_get, and money_put -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI template struct __moneypunct_cache; template struct __moneypunct_cache; #endif @@ -64,7 +73,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 _GLIBCXX_END_NAMESPACE_CXX11 // numpunct, numpunct_byname, num_get, and num_put -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI template struct __numpunct_cache; #endif _GLIBCXX_BEGIN_NAMESPACE_CXX11 @@ -73,7 +82,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 _GLIBCXX_END_NAMESPACE_CXX11 // time_get and time_put -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI template class __timepunct; template struct __timepunct_cache; template class time_put >; @@ -97,13 +106,13 @@ _GLIBCXX_END_NAMESPACE_CXX11 ctype_byname::ctype_byname(const string& __s, size_t __refs) : ctype_byname(__s.c_str(), __refs) { } -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI inline template class __ctype_abstract_base; template class ctype_byname; #endif // codecvt -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI inline template class __codecvt_abstract_base; template class codecvt_byname; #else @@ -118,7 +127,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 _GLIBCXX_END_NAMESPACE_CXX11 // use_facet and has_facet instantiations -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI INSTANTIATE_FACET_ACCESSORS(ctype); INSTANTIATE_FACET_ACCESSORS(codecvt); #endif @@ -127,14 +136,14 @@ INSTANTIATE_FACET_ACCESSORS(numpunct); INSTANTIATE_FACET_ACCESSORS(moneypunct); // No explicit instantiation of has_facet> for some reason. INSTANTIATE_USE_FACET (moneypunct); -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI INSTANTIATE_FACET_ACCESSORS(__timepunct); INSTANTIATE_FACET_ACCESSORS(time_put); #endif INSTANTIATE_FACET_ACCESSORS(time_get); INSTANTIATE_FACET_ACCESSORS(messages); -#if ! _GLIBCXX_USE_CXX11_ABI +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI // locale functions. template C* @@ -163,3 +172,5 @@ _GLIBCXX_END_NAMESPACE_VERSION #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && ! _GLIBCXX_USE_CXX11_ABI #include "compatibility-ldbl-facets-aliases.h" #endif // _GLIBCXX_LONG_DOUBLE_COMPAT + +#endif // _GLIBCXX_BUILD_CXX11_ABI == _GLIBCXX_USE_CXX11_ABI diff --git a/libstdc++-v3/src/c++11/string-inst.cc b/libstdc++-v3/src/c++11/string-inst.cc index ddaafc08199..ea9dcf02639 100644 --- a/libstdc++-v3/src/c++11/string-inst.cc +++ b/libstdc++-v3/src/c++11/string-inst.cc @@ -35,6 +35,12 @@ # define _GLIBCXX_USE_CXX11_ABI 1 #endif +#if _GLIBCXX_USE_CXX11_ABI +# define _GLIBCXX_DEFINING_CXX11_ABI_INSTANTIATIONS 1 +#else +# define _GLIBCXX_DEFINING_CXX11_ABI_INSTANTIATIONS 0 +#endif + // Prevent the basic_string(const _CharT*, const _Alloc&) and // basic_string(size_type, _CharT, const _Alloc&) constructors from being // replaced by constrained function templates, so that we instantiate the @@ -45,6 +51,12 @@ #include +#if _GLIBCXX_USE_CXX11_ABI && ! _GLIBCXX_DEFINING_CXX11_ABI_INSTANTIATIONS +# define _GLIBCXX_DEFINING_COW_STRING_INSTANTIATIONS 1 +# include +# define basic_string __std_cow_string +#endif + // Instantiation configuration. #ifndef C # define C char @@ -54,12 +66,14 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION - typedef basic_string S; +typedef basic_string, std::allocator> S; - template class basic_string; + template class basic_string, std::allocator>; +#if ! _GLIBCXX_DEFINING_COW_STRING_INSTANTIATIONS template S operator+(const C*, const S&); template S operator+(C, const S&); template S operator+(const S&, const S&); +#endif // Only one template keyword allowed here. // See core issue #46 (NAD) @@ -73,7 +87,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template S::basic_string(S::iterator, S::iterator, const allocator&); -#if _GLIBCXX_USE_CXX11_ABI +#if _GLIBCXX_USE_CXX11_ABI && ! _GLIBCXX_DEFINING_COW_STRING_INSTANTIATIONS template void S::_M_construct(S::iterator, S::iterator, forward_iterator_tag); @@ -91,7 +105,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION void S::_M_construct(const C*, const C*, forward_iterator_tag); -#else // !_GLIBCXX_USE_CXX11_ABI +#else // ! _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINING_COW_STRING_INSTANTIATIONS template C* @@ -111,6 +125,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace +#if ! _GLIBCXX_DEFINING_COW_STRING_INSTANTIATIONS namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -121,3 +136,4 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace +#endif diff --git a/libstdc++-v3/src/c++11/wlocale-inst.cc b/libstdc++-v3/src/c++11/wlocale-inst.cc index dc2d2349055..b5c798bfe64 100644 --- a/libstdc++-v3/src/c++11/wlocale-inst.cc +++ b/libstdc++-v3/src/c++11/wlocale-inst.cc @@ -30,7 +30,9 @@ #define _GLIBCXX_USE_CXX11_ABI 0 #include -#ifdef _GLIBCXX_USE_WCHAR_T -#define C wchar_t -#include "locale-inst.cc" -#endif // _GLIBCXX_USE_WCHAR_T +#if ! _GLIBCXX_USE_CXX11_ABI +# ifdef _GLIBCXX_USE_WCHAR_T +# define C wchar_t +# include "locale-inst.cc" +# endif // _GLIBCXX_USE_WCHAR_T +#endif diff --git a/libstdc++-v3/src/c++98/Makefile.am b/libstdc++-v3/src/c++98/Makefile.am index 284ffda3443..eb24325af67 100644 --- a/libstdc++-v3/src/c++98/Makefile.am +++ b/libstdc++-v3/src/c++98/Makefile.am @@ -90,13 +90,6 @@ c++locale.cc: ${glibcxx_srcdir}/$(CLOCALE_CC) basic_file.cc: ${glibcxx_srcdir}/$(BASIC_FILE_CC) $(LN_S) ${glibcxx_srcdir}/$(BASIC_FILE_CC) ./$@ || true -if ENABLE_DUAL_ABI -cxx11_abi_sources = \ - cow-istream-string.cc -else -cxx11_abi_sources = -endif - if ENABLE_EXTERN_TEMPLATE # XTEMPLATE_FLAGS = -fno-implicit-templates inst_sources = \ @@ -118,6 +111,7 @@ sources = \ mt_allocator.cc \ codecvt.cc \ complex_io.cc \ + cow-istream-string.cc \ globals_io.cc \ hash_tr1.cc \ hashtable_tr1.cc \ @@ -142,7 +136,6 @@ sources = \ istream-string.cc \ streambuf.cc \ valarray.cc \ - ${cxx11_abi_sources} \ ${host_sources} \ ${host_sources_extra} diff --git a/libstdc++-v3/src/c++98/Makefile.in b/libstdc++-v3/src/c++98/Makefile.in index a100df77a6d..d2ed2a221f2 100644 --- a/libstdc++-v3/src/c++98/Makefile.in +++ b/libstdc++-v3/src/c++98/Makefile.in @@ -121,31 +121,30 @@ CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libc__98convenience_la_LIBADD = -@ENABLE_DUAL_ABI_TRUE@am__objects_1 = cow-istream-string.lo -@ENABLE_DUAL_ABI_TRUE@am__objects_2 = collate_members_cow.lo \ +@ENABLE_DUAL_ABI_TRUE@am__objects_1 = collate_members_cow.lo \ @ENABLE_DUAL_ABI_TRUE@ messages_members_cow.lo \ @ENABLE_DUAL_ABI_TRUE@ monetary_members_cow.lo \ @ENABLE_DUAL_ABI_TRUE@ numeric_members_cow.lo -am__objects_3 = $(am__objects_2) codecvt_members.lo collate_members.lo \ +am__objects_2 = $(am__objects_1) codecvt_members.lo collate_members.lo \ messages_members.lo monetary_members.lo numeric_members.lo \ time_members.lo -@ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_4 = allocator-inst.lo \ +@ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_3 = allocator-inst.lo \ @ENABLE_EXTERN_TEMPLATE_TRUE@ concept-inst.lo ext-inst.lo \ @ENABLE_EXTERN_TEMPLATE_TRUE@ misc-inst.lo -am__objects_5 = parallel_settings.lo -am__objects_6 = basic_file.lo c++locale.lo $(am__objects_4) \ - $(am__objects_5) -am__objects_7 = bitmap_allocator.lo pool_allocator.lo mt_allocator.lo \ - codecvt.lo complex_io.lo globals_io.lo hash_tr1.lo \ - hashtable_tr1.lo ios_failure.lo ios_init.lo ios_locale.lo \ - list.lo list-aux.lo list-aux-2.lo list_associated.lo \ - list_associated-2.lo locale.lo locale_init.lo locale_facets.lo \ - localename.lo math_stubs_float.lo math_stubs_long_double.lo \ - stdexcept.lo strstream.lo tree.lo istream.lo istream-string.lo \ - streambuf.lo valarray.lo $(am__objects_1) $(am__objects_3) \ - $(am__objects_6) +am__objects_4 = parallel_settings.lo +am__objects_5 = basic_file.lo c++locale.lo $(am__objects_3) \ + $(am__objects_4) +am__objects_6 = bitmap_allocator.lo pool_allocator.lo mt_allocator.lo \ + codecvt.lo complex_io.lo cow-istream-string.lo globals_io.lo \ + hash_tr1.lo hashtable_tr1.lo ios_failure.lo ios_init.lo \ + ios_locale.lo list.lo list-aux.lo list-aux-2.lo \ + list_associated.lo list_associated-2.lo locale.lo \ + locale_init.lo locale_facets.lo localename.lo \ + math_stubs_float.lo math_stubs_long_double.lo stdexcept.lo \ + strstream.lo tree.lo istream.lo istream-string.lo streambuf.lo \ + valarray.lo $(am__objects_2) $(am__objects_5) @GLIBCXX_HOSTED_TRUE@am_libc__98convenience_la_OBJECTS = \ -@GLIBCXX_HOSTED_TRUE@ $(am__objects_7) +@GLIBCXX_HOSTED_TRUE@ $(am__objects_6) libc__98convenience_la_OBJECTS = $(am_libc__98convenience_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -471,10 +470,6 @@ host_sources_extra = \ basic_file.cc c++locale.cc \ ${inst_sources} ${parallel_sources} -@ENABLE_DUAL_ABI_FALSE@cxx11_abi_sources = -@ENABLE_DUAL_ABI_TRUE@cxx11_abi_sources = \ -@ENABLE_DUAL_ABI_TRUE@ cow-istream-string.cc - # XTEMPLATE_FLAGS = @ENABLE_EXTERN_TEMPLATE_FALSE@inst_sources = @@ -494,6 +489,7 @@ sources = \ mt_allocator.cc \ codecvt.cc \ complex_io.cc \ + cow-istream-string.cc \ globals_io.cc \ hash_tr1.cc \ hashtable_tr1.cc \ @@ -518,7 +514,6 @@ sources = \ istream-string.cc \ streambuf.cc \ valarray.cc \ - ${cxx11_abi_sources} \ ${host_sources} \ ${host_sources_extra} diff --git a/libstdc++-v3/src/c++98/cow-istream-string.cc b/libstdc++-v3/src/c++98/cow-istream-string.cc index 405f9ecb781..f00cbc09f69 100644 --- a/libstdc++-v3/src/c++98/cow-istream-string.cc +++ b/libstdc++-v3/src/c++98/cow-istream-string.cc @@ -27,4 +27,8 @@ // #define _GLIBCXX_USE_CXX11_ABI 0 -#include "istream-string.cc" +#include + +#if ! _GLIBCXX_USE_CXX11_ABI +# include "istream-string.cc" +#endif diff --git a/libstdc++-v3/src/c++98/hash_tr1.cc b/libstdc++-v3/src/c++98/hash_tr1.cc index e132c01bf8e..a2cd2c509f3 100644 --- a/libstdc++-v3/src/c++98/hash_tr1.cc +++ b/libstdc++-v3/src/c++98/hash_tr1.cc @@ -28,6 +28,7 @@ #include "hash-long-double-tr1-aux.cc" +#if ! _GLIBCXX_USE_CXX11_ABI namespace std _GLIBCXX_VISIBILITY(default) { namespace tr1 @@ -57,3 +58,4 @@ namespace std _GLIBCXX_VISIBILITY(default) #endif } } +#endif // ! _GLIBCXX_USE_CXX11_ABI diff --git a/libstdc++-v3/src/c++98/ios_failure.cc b/libstdc++-v3/src/c++98/ios_failure.cc index 27476eccbdb..43291871196 100644 --- a/libstdc++-v3/src/c++98/ios_failure.cc +++ b/libstdc++-v3/src/c++98/ios_failure.cc @@ -29,22 +29,24 @@ #define _GLIBCXX_USE_CXX11_ABI 0 #include -#if _GLIBCXX_USE_DUAL_ABI && __cpp_rtti -#include -#include -#endif - -#ifdef _GLIBCXX_USE_NLS -# include -# define _(msgid) gettext (msgid) -#else -# define _(msgid) (msgid) -#endif +#if ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI +# if _GLIBCXX_USE_DUAL_ABI && __cpp_rtti +# include +# include +# endif + +# ifdef _GLIBCXX_USE_NLS +# include +# define _(msgid) gettext (msgid) +# else +# define _(msgid) (msgid) +# endif namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION +#if ! _GLIBCXX_USE_CXX11_ABI ios_base::failure::failure(const string& __str) throw() : _M_msg(__str) { } @@ -54,6 +56,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const char* ios_base::failure::what() const throw() { return _M_msg.c_str(); } +#endif #if _GLIBCXX_USE_DUAL_ABI // When the dual ABI is enabled __throw_ios_failure() is defined in @@ -82,7 +85,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } #endif // __cpp_rtti -#else // ! _GLIBCXX_USE_DUAL_ABI +#elif ! _GLIBCXX_USE_CXX11_ABI void __throw_ios_failure(const char* __s __attribute__((unused))) @@ -92,7 +95,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_ios_failure(const char* str, int) { __throw_ios_failure(str); } -#endif // _GLIBCXX_USE_DUAL_ABI +#endif // ! _GLIBCXX_USE_CXX11_ABI _GLIBCXX_END_NAMESPACE_VERSION } // namespace + +#endif // ! _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI diff --git a/libstdc++-v3/src/c++98/istream-string.cc b/libstdc++-v3/src/c++98/istream-string.cc index 4859987fcc2..b64347f796e 100644 --- a/libstdc++-v3/src/c++98/istream-string.cc +++ b/libstdc++-v3/src/c++98/istream-string.cc @@ -31,6 +31,16 @@ // by another file which defines _GLIBCXX_USE_CXX11_ABI=0. # define _GLIBCXX_USE_CXX11_ABI 1 #endif + +#if _GLIBCXX_USE_CXX11_ABI +# define _GLIBCXX_BUILD_CXX11_ABI 1 +#else +# define _GLIBCXX_BUILD_CXX11_ABI 0 +#endif + +#include + +#if _GLIBCXX_BUILD_CXX11_ABI == _GLIBCXX_USE_CXX11_ABI #include #include @@ -289,3 +299,4 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace +#endif // _GLIBCXX_BUILD_CXX11_ABI == _GLIBCXX_USE_CXX11_ABI diff --git a/libstdc++-v3/src/c++98/locale_facets.cc b/libstdc++-v3/src/c++98/locale_facets.cc index c0bb7fd181d..7a929d51be4 100644 --- a/libstdc++-v3/src/c++98/locale_facets.cc +++ b/libstdc++-v3/src/c++98/locale_facets.cc @@ -125,6 +125,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __test; } +#if ! _GLIBCXX_USE_CXX11_ABI bool __verify_grouping(const char* __grouping, size_t __grouping_size, const string& __grouping_tmp) throw() @@ -133,6 +134,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __grouping_tmp.c_str(), __grouping_tmp.size()); } +#endif namespace { diff --git a/libstdc++-v3/src/c++98/stdexcept.cc b/libstdc++-v3/src/c++98/stdexcept.cc index e8c91f5c1cd..e82554e0aec 100644 --- a/libstdc++-v3/src/c++98/stdexcept.cc +++ b/libstdc++-v3/src/c++98/stdexcept.cc @@ -35,8 +35,10 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION +#if ! _GLIBCXX_USE_CXX11_ABI logic_error::logic_error(const string& __arg) : exception(), _M_msg(__arg) { } +#endif logic_error::~logic_error() _GLIBCXX_USE_NOEXCEPT { } @@ -44,28 +46,38 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION logic_error::what() const _GLIBCXX_USE_NOEXCEPT { return _M_msg.c_str(); } +#if ! _GLIBCXX_USE_CXX11_ABI domain_error::domain_error(const string& __arg) : logic_error(__arg) { } +#endif domain_error::~domain_error() _GLIBCXX_USE_NOEXCEPT { } +#if ! _GLIBCXX_USE_CXX11_ABI invalid_argument::invalid_argument(const string& __arg) : logic_error(__arg) { } +#endif invalid_argument::~invalid_argument() _GLIBCXX_USE_NOEXCEPT { } +#if ! _GLIBCXX_USE_CXX11_ABI length_error::length_error(const string& __arg) : logic_error(__arg) { } +#endif length_error::~length_error() _GLIBCXX_USE_NOEXCEPT { } +#if ! _GLIBCXX_USE_CXX11_ABI out_of_range::out_of_range(const string& __arg) : logic_error(__arg) { } +#endif out_of_range::~out_of_range() _GLIBCXX_USE_NOEXCEPT { } +#if ! _GLIBCXX_USE_CXX11_ABI runtime_error::runtime_error(const string& __arg) : exception(), _M_msg(__arg) { } +#endif runtime_error::~runtime_error() _GLIBCXX_USE_NOEXCEPT { } @@ -73,18 +85,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION runtime_error::what() const _GLIBCXX_USE_NOEXCEPT { return _M_msg.c_str(); } +#if ! _GLIBCXX_USE_CXX11_ABI range_error::range_error(const string& __arg) : runtime_error(__arg) { } +#endif range_error::~range_error() _GLIBCXX_USE_NOEXCEPT { } +#if ! _GLIBCXX_USE_CXX11_ABI overflow_error::overflow_error(const string& __arg) : runtime_error(__arg) { } +#endif overflow_error::~overflow_error() _GLIBCXX_USE_NOEXCEPT { } +#if ! _GLIBCXX_USE_CXX11_ABI underflow_error::underflow_error(const string& __arg) : runtime_error(__arg) { } +#endif underflow_error::~underflow_error() _GLIBCXX_USE_NOEXCEPT { }