re PR bootstrap/84405 (Fails to bootstrap with GCC 4.1.2, GCC 4.2.4)
authorJakub Jelinek <jakub@redhat.com>
Fri, 16 Feb 2018 09:05:35 +0000 (10:05 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 16 Feb 2018 09:05:35 +0000 (10:05 +0100)
PR bootstrap/84405
* system.h (BROKEN_VALUE_INITIALIZATION): Define for GCC < 4.3.
* vec.h (vec_default_construct): Use memset instead of placement new
if BROKEN_VALUE_INITIALIZATION is defined.
* hash-table.h (hash_table<Descriptor, Allocator>::empty_slow): Use
memset instead of value initialization if BROKEN_VALUE_INITIALIZATION
is defined.

From-SVN: r257726

gcc/ChangeLog
gcc/hash-table.h
gcc/system.h
gcc/vec.h

index 76eee8a4b56326c647836d406d74e565ededa7f6..85c7880e237064cad571f23b0c6a3c7e133256b8 100644 (file)
@@ -1,5 +1,13 @@
 2018-02-16  Jakub Jelinek  <jakub@redhat.com>
 
+       PR bootstrap/84405
+       * system.h (BROKEN_VALUE_INITIALIZATION): Define for GCC < 4.3.
+       * vec.h (vec_default_construct): Use memset instead of placement new
+       if BROKEN_VALUE_INITIALIZATION is defined.
+       * hash-table.h (hash_table<Descriptor, Allocator>::empty_slow): Use
+       memset instead of value initialization if BROKEN_VALUE_INITIALIZATION
+       is defined.
+
        PR rtl-optimization/83723
        * lra-int.h (lra_substitute_pseudo): Add DEBUG_P argument.
        * lra.c (lra_substitute_pseudo): Likewise.  If true, use
index 8e22cbb660a52a4e248112911c8c80c2b60123eb..706b2370e2343abad8041dcbbc8051591c78577f 100644 (file)
@@ -804,8 +804,12 @@ hash_table<Descriptor, Allocator>::empty_slow ()
     }
   else
     {
+#ifndef BROKEN_VALUE_INITIALIZATION
       for ( ; size; ++entries, --size)
        *entries = value_type ();
+#else
+      memset (entries, 0, size * sizeof (value_type));
+#endif
     }
   m_n_deleted = 0;
   m_n_elements = 0;
index 5d9aaae76ec586e83368d9aab4e316283c8bfe85..4abc321c71dc1c785e5cde2dc0028520b422e645 100644 (file)
@@ -824,6 +824,12 @@ extern void fancy_abort (const char *, int, const char *)
 /* Some compilers do not allow the use of unsigned char in bitfields.  */
 #define BOOL_BITFIELD unsigned int
 
+/* GCC older than 4.4 have broken C++ value initialization handling, see
+   PR11309, PR30111, PR33916, PR82939 and PR84405 for more details.  */
+#if GCC_VERSION > 0 && GCC_VERSION < 4004 && !defined(__clang__)
+# define BROKEN_VALUE_INITIALIZATION
+#endif
+
 /* As the last action in this file, we poison the identifiers that
    shouldn't be used.  Note, luckily gcc-3.0's token-based integrated
    preprocessor won't trip on poisoned identifiers that arrive from
index 24f57b183a38cbc0fc908e6896559494dfa68d65..c707bccf51c5583c525dfe6bbcb69b7ed8f59640 100644 (file)
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -490,8 +490,12 @@ template <typename T>
 inline void
 vec_default_construct (T *dst, unsigned n)
 {
+#ifndef BROKEN_VALUE_INITIALIZATION
   for ( ; n; ++dst, --n)
     ::new (static_cast<void*>(dst)) T ();
+#else
+  memset (dst, '\0', sizeof (T) * n);
+#endif
 }
 
 /* Copy-construct N elements in DST from *SRC.  */