On Mon, Jul 7, 2025 at 11:33 PM H.J. Lu <hjl.to...@gmail.com> wrote: > > On Tue, Jul 8, 2025 at 5:02 AM H.J. Lu <hjl.to...@gmail.com> wrote: > > > > On Mon, Jul 7, 2025 at 11:08 PM Jason Merrill <ja...@redhat.com> wrote: > > > > > > On 7/1/25 5:36 PM, H.J. Lu wrote: > > > > On Tue, Jul 1, 2025 at 9:37 PM Jason Merrill <ja...@redhat.com> wrote: > > > >> > > > >> On 6/30/25 7:03 PM, H.J. Lu wrote: > > > >>> On Mon, Jun 30, 2025 at 10:36 PM Jason Merrill <ja...@redhat.com> > > > >>> wrote: > > > >>>> > > > >>>> On 6/28/25 7:00 AM, H.J. Lu wrote: > > > >>>>> Since a backend may ignore user type alignment for arguments passed > > > >>>>> on > > > >>>>> stack, check backend for argument alignment on stack when evaluating > > > >>>>> __alignof. > > > >>>> > > > >>>> I assume that's reflected in DECL_ALIGN, so could we just add > > > >>>> PARM_DECL to > > > >>> > > > >>> No. targetm.calls.function_arg_boundary may have special handling > > > >>> for it. > > > >> > > > >> Why wouldn't we adjust DECL_ALIGN of the PARM_DECL to reflect the > > > >> actual > > > >> alignment of the argument? Are you saying it could be different from > > > >> one call to another? > > > > > > > > Function argument alignment is different from other places in memory if > > > > the main variant type alignment is different: > > > > > > Yes, I understand that function parameter alignment can be different > > > from other objects of that type. > > > > > > But since we have a PARM_DECL to represent that particular function > > > parameter, it seems natural to represent that difference in the > > > DECL_ALIGN of the PARM_DECL. If you don't, its DECL_ALIGN is wrong. > > > > > > > __alignof returns TYPE_ALIGN, not DECL_ALIGN. For PARM_DECL, > > TYPE_ALIGN may not be the same as DECL_ALIGN. > > > > How about this patch? > > Since a backend may ignore type alignment for arguments passed on stack, > call targetm.calls.function_arg_boundary to set DECL_ALIGN for PARM_DECL > and change __alignof to return DECL_ALIGN, instead of TYPE_ALIGN, for > PARM_DECL.
I don't think this will work out correctness-wise. You'd have to patch up all places. Also we might turn a reference to the PARM_DECL into a dereference of its address. So we rely on the fact that TYPE_ALIGN is always more conservative than DECL_ALIGN which is not the case you are caring about. So no, I don't think this is good design. Get the missed copy working instead. Richard. > gcc/ > > PR target/120839 > * stor-layout.cc (do_type_align): Call > targetm.calls.function_arg_boundary to set DECL_ALIGN for > PARM_DECL. > > gcc/c-family/ > > PR target/120839 > * c-common.cc (c_alignof_expr): Return DECL_ALIGN for PARM_DECL. > > gcc/testsuite/ > > PR target/120839 > * gcc.target/i386/pr120839-1.c: New test. > * gcc.target/i386/pr120839-2.c: Likewise. > > -- > H.J.