Hi, I followed Paolo's suggestion with the os_defines.h trick. I duplicated os/mingw32/ to os/mingw32-w64/ for this to work, since there aren't any built-in defines to tell the 2 apart unless you include some headers like _mingw.h.
Patch attached, comments?
Index: configure.host =================================================================== --- configure.host (revision 179411) +++ configure.host (working copy) @@ -260,8 +260,15 @@ atomic_word_dir=os/irix ;; mingw32*) - os_include_dir="os/mingw32" - error_constants_dir="os/mingw32" + case "$host" in + *-w64-*) + os_include_dir="os/mingw32-w64" + error_constants_dir="os/mingw32-w64" + ;; + *) + os_include_dir="os/mingw32" + error_constants_dir="os/mingw32" + ;; OPT_LDFLAGS="${OPT_LDFLAGS} \$(lt_host_flags)" ;; netbsd*) Index: include/bits/basic_string.h =================================================================== --- include/bits/basic_string.h (revision 179411) +++ include/bits/basic_string.h (working copy) @@ -201,7 +201,7 @@ void _M_set_length_and_sharable(size_type __n) { -#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING +#if !defined (_GLIBCXX_FULLY_DYNAMIC_STRING) || (_GLIBCXX_FULLY_DYNAMIC_STRING == 0) if (__builtin_expect(this != &_S_empty_rep(), false)) #endif { @@ -231,7 +231,7 @@ void _M_dispose(const _Alloc& __a) { -#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING +#if !defined (_GLIBCXX_FULLY_DYNAMIC_STRING) || (_GLIBCXX_FULLY_DYNAMIC_STRING == 0) if (__builtin_expect(this != &_S_empty_rep(), false)) #endif { @@ -252,7 +252,7 @@ _CharT* _M_refcopy() throw() { -#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING +#if !defined (_GLIBCXX_FULLY_DYNAMIC_STRING) || (_GLIBCXX_FULLY_DYNAMIC_STRING == 0) if (__builtin_expect(this != &_S_empty_rep(), false)) #endif __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1); @@ -430,7 +430,7 @@ * @brief Default constructor creates an empty string. */ basic_string() -#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING +#if !defined (_GLIBCXX_FULLY_DYNAMIC_STRING) || (_GLIBCXX_FULLY_DYNAMIC_STRING == 0) : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { } #else : _M_dataplus(_S_construct(size_type(), _CharT(), _Alloc()), _Alloc()){ } @@ -502,7 +502,7 @@ basic_string(basic_string&& __str) noexcept : _M_dataplus(__str._M_dataplus) { -#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING +#if !defined (_GLIBCXX_FULLY_DYNAMIC_STRING) || (_GLIBCXX_FULLY_DYNAMIC_STRING == 0) __str._M_data(_S_empty_rep()._M_refdata()); #else __str._M_data(_S_construct(size_type(), _CharT(), get_allocator())); Index: include/bits/basic_string.tcc =================================================================== --- include/bits/basic_string.tcc (revision 179411) +++ include/bits/basic_string.tcc (working copy) @@ -80,7 +80,7 @@ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a, input_iterator_tag) { -#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING +#if !defined (_GLIBCXX_FULLY_DYNAMIC_STRING) || (_GLIBCXX_FULLY_DYNAMIC_STRING == 0) if (__beg == __end && __a == _Alloc()) return _S_empty_rep()._M_refdata(); #endif @@ -126,7 +126,7 @@ _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a, forward_iterator_tag) { -#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING +#if !defined (_GLIBCXX_FULLY_DYNAMIC_STRING) || (_GLIBCXX_FULLY_DYNAMIC_STRING == 0) if (__beg == __end && __a == _Alloc()) return _S_empty_rep()._M_refdata(); #endif @@ -154,7 +154,7 @@ basic_string<_CharT, _Traits, _Alloc>:: _S_construct(size_type __n, _CharT __c, const _Alloc& __a) { -#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING +#if !defined (_GLIBCXX_FULLY_DYNAMIC_STRING) || (_GLIBCXX_FULLY_DYNAMIC_STRING == 0) if (__n == 0 && __a == _Alloc()) return _S_empty_rep()._M_refdata(); #endif @@ -456,7 +456,7 @@ basic_string<_CharT, _Traits, _Alloc>:: _M_leak_hard() { -#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING +#if !defined (_GLIBCXX_FULLY_DYNAMIC_STRING) || (_GLIBCXX_FULLY_DYNAMIC_STRING == 0) if (_M_rep() == &_S_empty_rep()) return; #endif Index: config/os/mingw32-w64/os_defines.h =================================================================== --- config/os/mingw32-w64/os_defines.h (revision 179411) +++ config/os/mingw32-w64/os_defines.h (working copy) @@ -65,4 +65,9 @@ // ioctlsocket function doesn't work for normal file-descriptors. #define _GLIBCXX_NO_IOCTL 1 +// mingw-w64 should use fully-dynamic-string by default +#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING +#define _GLIBCXX_FULLY_DYNAMIC_STRING 1 #endif + +#endif Index: acinclude.m4 =================================================================== --- acinclude.m4 (revision 179411) +++ acinclude.m4 (working copy) @@ -564,17 +564,21 @@ dnl memory (mostly useful together with shared memory allocators, see PR dnl libstdc++/16612 for details). dnl -dnl --enable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING -dnl --disable-fully-dynamic-string leaves _GLIBCXX_FULLY_DYNAMIC_STRING undefined +dnl --enable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 1 +dnl --disable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 0 +dnl otherwise undefined dnl + Usage: GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING[(DEFAULT)] dnl Where DEFAULT is either `yes' or `no'. dnl AC_DEFUN([GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING], [ GLIBCXX_ENABLE(fully-dynamic-string,$1,,[do not put empty strings in per-process static memory]) if test $enable_fully_dynamic_string = yes; then - AC_DEFINE(_GLIBCXX_FULLY_DYNAMIC_STRING, 1, - [Define if a fully dynamic basic_string is wanted.]) + enable_fully_dynamic_string_def=1 + else + enable_fully_dynamic_string_def=0 fi + AC_DEFINE(_GLIBCXX_FULLY_DYNAMIC_STRING, $enable_fully_dynamic_string_def, + [Define to 1 if a fully dynamic basic_string is wanted, 0 to disable, undefined for platform defaults]) ])
signature.asc
Description: OpenPGP digital signature