Here is another version with enhanced sizeof/alignof static_assert in string-inst.cc for the std::__cow_string definition from . The assertions in cow-stdexcept.cc are now checking the definition which is in the same file. On 13/08/2023 15:27, François Dumont 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. > > There are some test failing when !_GLIBCXX_USE_CXX11_ABI that are > unrelated with my changes. I'll propose fixes in coming days. > >     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. >             * 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. >             Move static_assert to check std::_cow_string abi layout to... >             * src/c++11/string-inst.cc: ...here. >             (_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 istreambuf_iterator>): Instantiate. >             [!_GLIBCXX_USE_DUAL_ABI](std::num_put ostreambuf_iterator>): 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 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): > 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/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. > > Ok to commit ? > > François > > On 11/08/2023 09:51, Jonathan Wakely wrote: >> >> >> On Fri, 11 Aug 2023, 06:44 François Dumont via Libstdc++, >> > wrote: >> >> I hadn't tested the most basic default configuration and it is >> failing, >> >> >> I did wonder about that when you said which configurations you had >> tested :) >> >> >> >> >> I need some more time yet. >> >> >> OK, no problem. >> >> I actually have an idea for replacing the __cow_string hack with >> something better, which I will try to work on next week. That might >> make things simpler for you, as you won't need the __std_cow_string >> macro. >> >> >> >> >> >> François >> >> >> On 10/08/2023 07:13, François Dumont wrote: >> > 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> > istreambuf_iterator>): Instantiate. >> > [!_GLIBCXX_USE_DUAL_ABI](std::num_put> > ostreambuf_iterator>): 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> > 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](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/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 >> > >> > >>