bootstrap: Fix building with GCC 4.2 [PR89494]
authorJakub Jelinek <jakub@redhat.com>
Thu, 16 Apr 2020 08:15:18 +0000 (10:15 +0200)
committerJakub Jelinek <jakub@redhat.com>
Thu, 16 Apr 2020 08:15:18 +0000 (10:15 +0200)
GCC 4.2 (but I think not the latest tip of GCC 4.2 branch) has broken value
initialization, see PR33916.  The following patch provides a workaround for
that.  Tested with GCC 4.2 on a reduced testcase I've distilled from the
assign_param_data_one class which has been miscompiled the same.

2020-04-16  Jakub Jelinek  <jakub@redhat.com>

PR bootstrap/89494
* function.c (assign_parm_find_data_types): Add workaround for
BROKEN_VALUE_INITIALIZATION compilers.

gcc/ChangeLog
gcc/function.c

index 899285cf46f3ade33036a3035b7d8ba942b8345d..7e08f789ab2b68943599532547b818d1cccf07c4 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR bootstrap/89494
+       * function.c (assign_parm_find_data_types): Add workaround for
+       BROKEN_VALUE_INITIALIZATION compilers.
+
 2020-04-16  Richard Biener  <rguenther@suse.de>
 
        * gdbhooks.py (TreePrinter): Print SSA_NAME_VERSION of SSA_NAME
index d8008f60422e5b433ab63cc3cef0c00b537dd0b9..d616f5f64f460799f5fce5b8a67050674efa8a0e 100644 (file)
@@ -2414,7 +2414,15 @@ assign_parm_find_data_types (struct assign_parm_data_all *all, tree parm,
 {
   int unsignedp;
 
+#ifndef BROKEN_VALUE_INITIALIZATION
   *data = assign_parm_data_one ();
+#else
+  /* Old versions of GCC used to miscompile the above by only initializing
+     the members with explicit constructors and copying garbage
+     to the other members.  */
+  assign_parm_data_one zero_data = {};
+  *data = zero_data;
+#endif
 
   /* NAMED_ARG is a misnomer.  We really mean 'non-variadic'. */
   if (!cfun->stdarg)