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 <[email protected]>
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)