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
