https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89494

--- Comment #20 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So, we are running into PR33916 here, not very much reduced test:
class function_arg_info
{
public:
  function_arg_info ()
    : type (0), mode (0), named (false), pass_by_reference (false)
  {}
  function_arg_info (int mode, bool named)
    : type (0), mode (mode), named (named), pass_by_reference (false)
  {}
  void *type;
  int mode;
  unsigned int named : 1;
  unsigned int pass_by_reference : 1;
};

struct args_size
{
  long long int constant;
  void *var;
};

struct locate_and_pad_arg_data
{
  struct args_size size;
  struct args_size offset;
  struct args_size slot_offset;
  struct args_size alignment_pad;
  int where_pad;
  unsigned int boundary;
};

struct assign_parm_data_one
{
  void *nominal_type;
  function_arg_info arg;
  void *entry_parm;
  void *stack_parm;
  int nominal_mode;
  int passed_mode;
  struct locate_and_pad_arg_data locate;
  int partial;
};

void
foo (struct assign_parm_data_one *data)
{
  *data = assign_parm_data_one ();
}

shows that GCC 4.2.1 (and earlier too) will only clear arg.type, arg.mode,
arg.named and arg.pass_by_reference of a temporary before memcpying that
temporary to *data.

Thus, my proposal is:
2020-04-15  Jakub Jelinek  <ja...@redhat.com>

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

--- gcc/function.c.jj   2020-01-12 11:54:36.606410497 +0100
+++ gcc/function.c      2020-04-15 14:15:29.269495427 +0200
@@ -2414,7 +2414,15 @@ assign_parm_find_data_types (struct assi
 {
   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)

Reply via email to