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

--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Richard Sandiford <rsand...@gcc.gnu.org>:

https://gcc.gnu.org/g:14814e20161d7b6a4e9cac244c7013fa56f71f55

commit r12-8000-g14814e20161d7b6a4e9cac244c7013fa56f71f55
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Tue Apr 5 17:31:35 2022 +0100

    aarch64: Fix -fpack-struct + <arm_neon.h> [PR103147]

    This PR is about -fpack-struct causing a crash when <arm_neon.h>
    is included.  The new register_tuple_type code was expecting a
    normal unpacked structure layout instead of a packed one.

    For SVE we got around this by temporarily suppressing -fpack-struct,
    so that the tuple types always have their normal ABI.  However:

    (a) The SVE ACLE tuple types are defined to be abstract.  The fact
        that GCC uses structures is an internal implementation detail.

    (b) In contrast, the ACLE explicitly defines the Advanced SIMD
        tuple types to be particular structures.

    (c) Clang and previous versions of GCC are consistent in applying
        -fpack-struct to these tuple structures.

    This patch therefore honours -fpack-struct and -fpack-struct=.  It also
    adds tests for some other combinations, such as -mgeneral-regs-only and
    -fpack-struct -mstrict-align.

    gcc/
            PR target/103147
            * config/aarch64/aarch64-protos.h (aarch64_simd_switcher): New
class.
            * config/aarch64/aarch64-sve-builtins.h (sve_switcher): Inherit
            from aarch64_simd_switcher.
            * config/aarch64/aarch64-builtins.cc (aarch64_simd_tuple_modes):
            New variable.
            (aarch64_lookup_simd_builtin_type): Use it instead of TYPE_MODE.
            (register_tuple_type): Add more asserts.  Expect the alignment
            of the structure to be subject to flag_pack_struct and
            maximum_field_alignment.  Set aarch64_simd_tuple_modes.
            (aarch64_simd_switcher::aarch64_simd_switcher): New function.
            (aarch64_simd_switcher::~aarch64_simd_switcher): Likewise.
            (handle_arm_neon_h): Hold an aarch64_simd_switcher throughout.
            (aarch64_general_init_builtins): Hold an aarch64_simd_switcher
            while calling aarch64_init_simd_builtins.
            * config/aarch64/aarch64-sve-builtins.cc
(sve_switcher::sve_switcher)
            (sve_switcher::~sve_switcher): Remove code now performed by
            aarch64_simd_switcher.

    gcc/testsuite/
            PR target/103147
            * gcc.target/aarch64/pr103147-1.c: New test.
            * gcc.target/aarch64/pr103147-2.c: Likewise.
            * gcc.target/aarch64/pr103147-3.c: Likewise.
            * gcc.target/aarch64/pr103147-4.c: Likewise.
            * gcc.target/aarch64/pr103147-5.c: Likewise.
            * gcc.target/aarch64/pr103147-6.c: Likewise.
            * gcc.target/aarch64/pr103147-7.c: Likewise.
            * gcc.target/aarch64/pr103147-8.c: Likewise.
            * gcc.target/aarch64/pr103147-9.c: Likewise.
            * gcc.target/aarch64/pr103147-10.c: Likewise.
            * g++.target/aarch64/pr103147-1.C: Likewise.
            * g++.target/aarch64/pr103147-2.C: Likewise.
            * g++.target/aarch64/pr103147-3.C: Likewise.
            * g++.target/aarch64/pr103147-4.C: Likewise.
            * g++.target/aarch64/pr103147-5.C: Likewise.
            * g++.target/aarch64/pr103147-6.C: Likewise.
            * g++.target/aarch64/pr103147-7.C: Likewise.
            * g++.target/aarch64/pr103147-8.C: Likewise.
            * g++.target/aarch64/pr103147-9.C: Likewise.
            * g++.target/aarch64/pr103147-10.C: Likewise.

Reply via email to