aarch64: Tweaks to the handling of fixed-length SVE types
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 25 Aug 2020 12:31:17 +0000 (13:31 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Tue, 25 Aug 2020 12:31:17 +0000 (13:31 +0100)
commit9ded41a39c1bb29f356485a9ec3a573fb75ded12
tree92e2c333a5be0ba32da131fc8cfc02e73c78eb5f
parentdcb043351307001a85fc1e7d56669f5adc9628f7
aarch64: Tweaks to the handling of fixed-length SVE types

This patch is really four things rolled into one, since separating
them seemed artificial:

- Update the mangling of the fixed-length SVE ACLE types to match
  the upcoming spec.  The idea is to mangle:

    VLAT __attribute__((arm_sve_vector_bits(N)))

  as an instance __SVE_VLS<VLAT, N> of the template:

    __SVE_VLS<typename, unsigned>

- Give the fixed-length types their own TYPE_DECL.  This is needed
  to make the above mangling fix work, but should also be a minor
  QoI improvement for error reporting.  Unfortunately, the names are
  quite verbose, e.g.:

    svint8_t __attribute__((arm_sve_vector_bits(512)))

  but anything shorter would be ad-hoc syntax and so might be more
  confusing.

- Improve the error message reported when arm_sve_vector_bits is
  applied to tuples, such as:

    svint32x2_t __attribute__((arm_sve_vector_bits(N)))

  Previously we would complain that the type isn't an SVE type;
  now we complain that it isn't a vector type.

- Don't allow arm_sve_vector_bits(N) to be applied to existing
  fixed-length SVE types.

gcc/
* config/aarch64/aarch64-sve-builtins.cc (add_sve_type_attribute):
Take the ACLE name of the type as a parameter and add it as fourth
argument to the "SVE type" attribute.
(register_builtin_types): Update call accordingly.
(register_tuple_type): Likewise.  Construct the name of the type
earlier in order to do this.
(get_arm_sve_vector_bits_attributes): New function.
(handle_arm_sve_vector_bits_attribute): Report a more sensible
error message if the attribute is applied to an SVE tuple type.
Don't allow the attribute to be applied to an existing fixed-length
SVE type.  Mangle the new type as __SVE_VLS<type, vector-bits>.
Add a dummy TYPE_DECL to the new type.

gcc/testsuite/
* g++.target/aarch64/sve/acle/general-c++/attributes_2.C: New test.
* g++.target/aarch64/sve/acle/general-c++/mangle_6.C: Likewise.
* g++.target/aarch64/sve/acle/general-c++/mangle_7.C: Likewise.
* g++.target/aarch64/sve/acle/general-c++/mangle_8.C: Likewise.
* g++.target/aarch64/sve/acle/general-c++/mangle_9.C: Likewise.
* g++.target/aarch64/sve/acle/general-c++/mangle_10.C: Likewise.
* gcc.target/aarch64/sve/acle/general/attributes_7.c: Check the
error messages reported when arm_sve_vector_bits is applied to
SVE tuple types or to existing fixed-length SVE types.
gcc/config/aarch64/aarch64-sve-builtins.cc
gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/attributes_2.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_10.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_6.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_7.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_8.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mangle_9.C [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general/attributes_7.c