From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id AD5D43858C39 for ; Fri, 13 Jan 2023 17:06:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AD5D43858C39 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1673629592; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FUFNZs8GvKp7hyXfxAWmqNWZrmw+XiP/xfByBYGYjPU=; b=Q9veVLp+UoHWWZMeZZJPQsNqzj+Zoyjd5obX4mCprbytnzbXSJCx50a0R21mHQgfvWlfSK xjXt7QtwcksgxRnUrIt3gWRTp8qufY/EQP18Bhqku8VB/pFdVNtlVA+mAYaB8EByMt/Mow wOMQm3FBs9Vue0t4Hh0ODbwOfzXnQOI= Received: from mail-lf1-f69.google.com (mail-lf1-f69.google.com [209.85.167.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-564-8_CdJAEBNa2zxLYV4OVI-w-1; Fri, 13 Jan 2023 12:06:31 -0500 X-MC-Unique: 8_CdJAEBNa2zxLYV4OVI-w-1 Received: by mail-lf1-f69.google.com with SMTP id g28-20020a0565123b9c00b004cc8a085997so5059758lfv.13 for ; Fri, 13 Jan 2023 09:06:30 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FUFNZs8GvKp7hyXfxAWmqNWZrmw+XiP/xfByBYGYjPU=; b=K6FrS9pQTHRX8lE6935FLrvOnML940TnauIYDalSGMESQJdY/c05ve4874cJlfpNJx IKAkOdvuhvmlvZd1OTfhasA8MjLar+Lhxm5SCSm0uVZLxd73kCAN+mpg+9iQrvFOCfUF vUEnVXX8QWdmiO2IkbbTuBim+JU94RqxRZ6h+0XxIKU4yVEgc3wQpZKFsfCImXFLJ1Wj ifgeo4+VZqLT1VL4KcnbD6Kr6II8k2R2R/R+8lnixsO4zya3kDqzCBR2UEXRVnpW8+ZR 32v//BCmPIJJzeLpAVR3sn2EWW00bwv6dn6QxxfN6UAAQ1O6qaxN69wOrZJE9i54pXed kzeQ== X-Gm-Message-State: AFqh2kocBYt8qM9qRbiDblFs0WynM5XLhmbQndEFFS2qg57WJzcN3cSl e20jXWkicPGdvBVE/a2sMVoua4MGOsfuB/CX3GkadBXH+VTzCfFkqiAiTSg20hWntRUPudu/5x6 OweNlWdt0xLX/6HWNe0Awdq9nHi24Oqk= X-Received: by 2002:a05:6512:3772:b0:4b5:aa1c:4d12 with SMTP id z18-20020a056512377200b004b5aa1c4d12mr3878894lft.481.1673629589821; Fri, 13 Jan 2023 09:06:29 -0800 (PST) X-Google-Smtp-Source: AMrXdXt4aUr8H/PugQ17O9EJ1yBjj9+NHu2pVwESA/X2nwxhb1xRmlrdmnixfEjOGupWS+HyFESXOQMHYcFXWCQkV7A= X-Received: by 2002:a05:6512:3772:b0:4b5:aa1c:4d12 with SMTP id z18-20020a056512377200b004b5aa1c4d12mr3878891lft.481.1673629589487; Fri, 13 Jan 2023 09:06:29 -0800 (PST) MIME-Version: 1.0 References: <2d387cf7-8b99-3f04-6b99-d9dab5309693@gmail.com> <66ebb430-e280-3501-1f20-aab66f6f4d7b@gmail.com> <98eeb943-9f1d-72b6-4ce1-cb2a802550f7@gmail.com> In-Reply-To: From: Jonathan Wakely Date: Fri, 13 Jan 2023 17:06:18 +0000 Message-ID: Subject: Re: [PATCH] Use cxx11 abi in versioned namespace To: =?UTF-8?Q?Fran=C3=A7ois_Dumont?= Cc: "libstdc++@gcc.gnu.org" , gcc-patches X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-6.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,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 List-Id: On Fri, 13 Jan 2023 at 16:33, Jonathan Wakely wrote: > > On Mon, 5 Dec 2022 at 21:14, Fran=C3=A7ois Dumont via Libstdc++ > wrote: > > > > I just rebased this patch. > > > > All good apart from the to_chars/from_chars symbols issue. > > > > Fran=C3=A7ois > > > > > > On 11/10/22 19:28, Fran=C3=A7ois Dumont wrote: > > > Hi > > > > > > Now that pretty printer is fixed (once patch validated) I'd like > > > to propose this patch again. > > > > > > Note that I'am adding a check on pretty printer with a std::any o= n > > > a std::wstring. I did so because of the FIXME in printers.py which is > > > dealing with 'std::string' explicitely. Looks like in my case, where > > > there is no 'std::string' but just a 'std::__8::string' we do not nee= d > > > the workaround. > > > > > > Once again I am attaching also the version namespace bump patch a= s > > > I think that adopting the cxx11 abi in this mode is a good enough > > > reason to bump it. If you agress let me know if I should squash the > > > commits before pushing. > > Yes, I think this change would justify bumping the version. > > > > > > > libstdc++: [_GLIBCXX_INLINE_VERSION] Use cxx11 abi > > > > > > Use cxx11 abi when activating versioned namespace mode. > > > > > > libstdcxx-v3/ChangeLog: > > > > > > * 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): Defin= e. > > > * 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. > > > * 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 em= pty. > > > * src/Makefile.in: Regenerate. > > > * src/c++11/Makefile.am (cxx11_abi_sources): Rename into.= .. > > > (dual_abi_sources): ...this, new. Also move several > > > sources to... > > > (sources): ...this. > > > (extra_string_inst_sources): Move several sources to... > > > (inst_sources): ...this. > > I don't understand this part. Moving those files to sources and > inst_sources will mean they are always compiled, right? But we don't > want them compiled for --disable-libstdcxx-dual-abi > > In those files you've changed the #if conditions so they are empty if > the dual ABI is disabled, but why do they need to be compiled at all? > This isn't clear from the patch or the description or the changelog. > > > > > * 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](error_category::_M_message): > > > Skip definition. > > > [_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. > > For this file I think your changes make sense, because the definitions > of the gcc4-compatible and cxx11 ABI are different, we're not just > compiling it twice. > > > > > * 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. > > > [!_GLIBCXX_USE_DUAL_ABI](__cow_string): Remove. > > > * src/c++11/cxx11-wlocale-inst.cc > > > [!_GLIBCXX_USE_CXX11_ABI]: Skip definitions. > > > * src/c++11/fstream-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 > > istreambuf_iterator>): Instantiate. > > > [!_GLIBCXX_USE_DUAL_ABI](std::num_put > > ostreambuf_iterator>): Instantiate. > > > * src/c++11/locale-inst.cc [!_GLIBCXX_USE_DUAL_ABI]: Buil= d > > > 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): Instantiat= e. > > > [!_GLIBCXX_USE_DUAL_ABI](__timepunct): Instantiate. > > > [!_GLIBCXX_USE_DUAL_ABI](__timepunct_cache): Instantia= te. > > > [!_GLIBCXX_USE_DUAL_ABI](time_put > > ostreambuf_iterator>): Instantiate. > > > [!_GLIBCXX_USE_DUAL_ABI](time_put_byname > > ostreambuf_iterator>): Instantiate. > > > [!_GLIBCXX_USE_DUAL_ABI](__ctype_abstract_base): Instantiate. > > > [!_GLIBCXX_USE_DUAL_ABI](ctype_byname): Instantiate. > > > [!_GLIBCXX_USE_DUAL_ABI](__codecvt_abstract_base > > mbstate_t>): Instantiate. > > > [!_GLIBCXX_USE_DUAL_ABI](codecvt_byname > > mbstate_t>): Instantiate. > > > [!_GLIBCXX_USE_DUAL_ABI](use_facet>(const locale&)): > > > Instantiate. > > > [!_GLIBCXX_USE_DUAL_ABI](use_facet > > mbstate_t>>(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 > > mbstate_t>>(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/cxx11-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. > > Why? I know all this ENABLE_DUAL_ABI stuff is a horrible mess, and I should really try to clean it up, and it's impressive you made this work at all. But I think the solution you've found makes the mess even worse, unfortunately. Another problem is here: --- a/libstdc++-v3/src/c++98/stdexcept.cc +++ b/libstdc++-v3/src/c++98/stdexcept.cc @@ -26,7 +26,7 @@ // ISO C++ 14882: 19.1 Exception classes // -// All exception classes still use the classic COW std::string. +// In dual abi all exception classes still use the classic COW std::string= . #define _GLIBCXX_USE_CXX11_ABI 0 Exceptions must have a non-throwing copy constructor, which is why they still need to use a reference-counted string. If we disable the dual ABI and only build the cxx11 string, we need to figure out a way to compile enough of the COW string to keep exceptions working.