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

--- Comment #2 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
In gimplify_parameters:

x86_64:
(gdb) p data.arg
$2 = {type = <record_type 0x7fffea77cbd0 vj>, mode = E_BLKmode, named = 1,
pass_by_reference = 0}

hppa64-hpux11.3:
(gdb) p data.arg
$29 = {type = <pointer_type 0x7fffea73bbd0>, mode = E_DImode, named = 1,
pass_by_reference = 1}

so this seems to only be happening for empty structs, when passing them by
reference.

Specifically, for both targets we reach:
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV    
Breakpoint 12, pass_by_reference (ca=0x7fffffffd860, arg=...) at
../../src/gcc/calls.cc:921
921       return targetm.calls.pass_by_reference (pack_cumulative_args (ca),
arg);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

and on pa, size == 0, so we pass by reference:

6367    static bool
6368    pa_pass_by_reference (cumulative_args_t, const function_arg_info &arg)
6369    {
6370      HOST_WIDE_INT size = arg.type_size_in_bytes ();
6371      if (TARGET_64BIT)
6372        return size <= 0;
6373      else
6374        return size <= 0 || size > 8;
6375    }

whereas on x86_64, ix86_pass_by_reference returns false.

Reply via email to