Hi Here is a rebased version of this patch. There are few test failures when running 'make check-c++' but nothing new. Still, there are 2 patches awaiting validation to fix some of them, PR c++/111524 to fix another bunch and I fear that we will have to live with the others.     libstdc++: [_GLIBCXX_INLINE_VERSION] Use cxx11 abi [PR83077]     Use cxx11 abi when activating versioned namespace mode. To do support     a new configuration mode where !_GLIBCXX_USE_DUAL_ABI and _GLIBCXX_USE_CXX11_ABI.     The main change is that std::__cow_string is now defined whenever _GLIBCXX_USE_DUAL_ABI     or _GLIBCXX_USE_CXX11_ABI is true. Implementation is using available std::string in     case of dual abi and a subset of it when it's not.     On the other side std::__sso_string is defined only when _GLIBCXX_USE_DUAL_ABI is true     and _GLIBCXX_USE_CXX11_ABI is false. Meaning that std::__sso_string is a typedef for the     cow std::string implementation when dual abi is disabled and cow string is being used.     libstdcxx-v3/ChangeLog:             PR libstdc++/83077             * acinclude.m4 [GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI]: Default to "new" libstdcxx abi             when enable_symvers is gnu-versioned-namespace.             * 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/string-inst.cc: Add sizeof/alignof static_assert on stdexcept             __cow_string definition.             (_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/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](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/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.             * src/c++98/compatibility.cc [_GLIBCXX_USE_CXX11_ABI]: Skip all definitions appart from             istream::ignore(streamsize). Tested under Linux x64_86, ok to commit ? François On 17/08/2023 19:22, Jonathan Wakely wrote: > On Sun, 13 Aug 2023 at 14:27, François Dumont via Libstdc++ > wrote: >> Here is the fixed patch tested in all 3 modes: >> >> - _GLIBCXX_USE_DUAL_ABI >> >> - !_GLIBCXX_USE_DUAL_ABI && !_GLIBCXX_USE_CXX11_ABI >> >> - !_GLIBCXX_USE_DUAL_ABI && _GLIBCXX_USE_CXX11_ABI >> >> I don't know what you have in mind for the change below but I wanted to >> let you know that I tried to put COW std::basic_string into a nested >> __cow namespace when _GLIBCXX_USE_CXX11_ABI. But it had more impact on >> string-inst.cc so I preferred the macro substitution approach. > I was thinking of implementing the necessary special members functions > of __cow_string directly, so they are ABI compatible with the COW > std::basic_string but don't actually reuse the code. That would mean > we don't need to compile and instantiate the whole COW string just to > use a few members from it. But that can be done later, the macro > approach seems OK for now. > >> There are some test failing when !_GLIBCXX_USE_CXX11_ABI that are >> unrelated with my changes. I'll propose fixes in coming days. > Which tests? I run the entire testsuite with > -D_GLIBCXX_USE_CXX11_ABI=0 several times per day and I'm not seeing > failures. > > I'll review the patch ASAP, thanks for working on it. >