From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 7F84C3856247; Tue, 10 May 2022 13:26:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7F84C3856247 From: "clyon at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug target/105549] New: aarch64: Wrong va_arg alignment handling Date: Tue, 10 May 2022 13:26:59 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: target X-Bugzilla-Version: 13.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: major X-Bugzilla-Who: clyon at gcc dot gnu.org X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter target_milestone Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 May 2022 13:26:59 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D105549 Bug ID: 105549 Summary: aarch64: Wrong va_arg alignment handling Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: major Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: clyon at gcc dot gnu.org Target Milestone: --- While working on enabling DFP for AArch64, I noticed new failures in gcc.dg/compat/struct-layout-1.exp (t028) which were not actually caused by DFP types handling. I reduced the problem to: /* This test is derived from a case generated by struct-layout-1.exp: */ enum E6 { e6_0, e6_1, e6_2, e6_3, e6_65533 =3D 65533, e6_65534, e6_65535 }; typedef enum E6 Tal16E6 __attribute__((aligned (16))); typedef unsigned int Tuint; int fails; union S2844 { Tuint a:((((10) - 1) & 31) + 1); Tal16E6 __attribute__((aligned (2), packed)) b:31; struct{}c[0]; } ; union S2844 s2844; union S2844 a2844[5]; typedef __builtin_va_list __gnuc_va_list; typedef __gnuc_va_list va_list; void check2844va (int z, ...) { union S2844 arg, *p; va_list ap; __builtin_va_start(ap,z); if (__builtin_va_arg(ap,double) !=3D 1.0) printf ("fail %d.%d\n", 2844, 0), ++fails; p =3D &s2844; arg =3D __builtin_va_arg(ap,union S2844); /* This would fail. */ if (p->a !=3D arg.a) printf ("fail %d.%d\n", 2844, 1), ++fails; if (__builtin_va_arg(ap,long long) !=3D 3LL) printf ("fail %d.%d\n", 2844, 2), ++fails; p =3D &a2844[2]; arg =3D __builtin_va_arg(ap,union S2844); /* This would fail. */ if (p->a !=3D arg.a) printf ("fail %d.%d\n", 2844, 3), ++fails; arg =3D __builtin_va_arg(ap,union S2844); /* This would fail. */ if (p->a !=3D arg.a) printf ("fail %d.%d\n", 2844, 4), ++fails; __builtin_va_end(ap); } int main (void) { int i, j; memset (&s2844, '\0', sizeof (s2844)); memset (a2844, '\0', sizeof (a2844)); s2844.a =3D 799U; a2844[2].a =3D 586U; check2844va (1, 1.0, s2844, 2LL, a2844[2], a2844[2]); exit (fails !=3D 0); } This is a tough case mixing bitfields and alignment, where aarch64_gimplify_va_arg_expr did not follow the exact same rule as aarch64_layout_arg. When the va_arg parameter uses only one general register, we do not want to introduce double-word alignment.=