Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Sema][AArch64] Add parsing support for arm_sve_vector_bits attribute
Summary: This patch implements parsing support for the 'arm_sve_vector_bits' type attribute, defined by the Arm C Language Extensions (ACLE, version 00bet5, section 3.7.3) for SVE [1]. The purpose of this attribute is to define fixed-length (VLST) versions of existing sizeless types (VLAT). For example: #if __ARM_FEATURE_SVE_BITS==512 typedef svint32_t fixed_svint32_t __attribute__((arm_sve_vector_bits(512))); #endif Creates a type 'fixed_svint32_t' that is a fixed-length version of 'svint32_t' that is normal-sized (rather than sizeless) and contains exactly 512 bits. Unlike 'svint32_t', this type can be used in places such as structs and arrays where sizeless types can't. Implemented in this patch is the following: * Defined and tested attribute taking single argument. * Checks the argument is an integer constant expression. * Attribute can only be attached to a single SVE vector or predicate type, excluding tuple types such as svint32x4_t. * Added the `-msve-vector-bits=<bits>` flag. When specified the `__ARM_FEATURE_SVE_BITS__EXPERIMENTAL` macro is defined. * Added a language option to store the vector size specified by the `-msve-vector-bits=<bits>` flag. This is used to validate `N == __ARM_FEATURE_SVE_BITS`, where N is the number of bits passed to the attribute and `__ARM_FEATURE_SVE_BITS` is the feature macro defined under the same flag. The `__ARM_FEATURE_SVE_BITS` macro will be made non-experimental in the final patch of the series. [1] https://developer.arm.com/documentation/100987/latest This is patch 1/4 of a patch series. Reviewers: sdesmalen, rsandifo-arm, efriedma, ctetreau, cameron.mcinally, rengolin, aaron.ballman Reviewed By: sdesmalen, aaron.ballman Differential Revision: https://reviews.llvm.org/D83550
- Loading branch information
Showing
17 changed files
with
336 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
// ----------------------------------------------------------------------------- | ||
// Tests for the -msve-vector-bits flag | ||
// ----------------------------------------------------------------------------- | ||
|
||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -march=armv8-a+sve \ | ||
// RUN: -msve-vector-bits=128 2>&1 | FileCheck --check-prefix=CHECK-128 %s | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -march=armv8-a+sve \ | ||
// RUN: -msve-vector-bits=256 2>&1 | FileCheck --check-prefix=CHECK-256 %s | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -march=armv8-a+sve \ | ||
// RUN: -msve-vector-bits=512 2>&1 | FileCheck --check-prefix=CHECK-512 %s | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -march=armv8-a+sve \ | ||
// RUN: -msve-vector-bits=1024 2>&1 | FileCheck --check-prefix=CHECK-1024 %s | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -march=armv8-a+sve \ | ||
// RUN: -msve-vector-bits=2048 2>&1 | FileCheck --check-prefix=CHECK-2048 %s | ||
|
||
// CHECK-128: "-msve-vector-bits=128" | ||
// CHECK-256: "-msve-vector-bits=256" | ||
// CHECK-512: "-msve-vector-bits=512" | ||
// CHECK-1024: "-msve-vector-bits=1024" | ||
// CHECK-2048: "-msve-vector-bits=2048" | ||
|
||
// Bail out if -msve-vector-bits is specified without SVE enabled | ||
// ----------------------------------------------------------------------------- | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -msve-vector-bits=128 \ | ||
// RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-SVE-ERROR %s | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -msve-vector-bits=256 \ | ||
// RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-SVE-ERROR %s | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -msve-vector-bits=512 \ | ||
// RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-SVE-ERROR %s | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -msve-vector-bits=1024 \ | ||
// RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-SVE-ERROR %s | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -msve-vector-bits=2048 \ | ||
// RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-SVE-ERROR %s | ||
|
||
// CHECK-NO-SVE-ERROR: error: '-msve-vector-bits' is not supported without SVE enabled | ||
|
||
// Error out if an unsupported value is passed to -msve-vector-bits. | ||
// ----------------------------------------------------------------------------- | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -march=armv8-a+sve \ | ||
// RUN: -msve-vector-bits=64 2>&1 | FileCheck --check-prefix=CHECK-BAD-VALUE-ERROR %s | ||
// RUN: %clang -c %s -### -target aarch64-none-linux-gnu -march=armv8-a+sve \ | ||
// RUN: -msve-vector-bits=A 2>&1 | FileCheck --check-prefix=CHECK-BAD-VALUE-ERROR %s | ||
|
||
// CHECK-BAD-VALUE-ERROR: error: unsupported argument '{{.*}}' to option 'msve-vector-bits=' | ||
|
||
// Error if using attribute without -msve-vector-bits | ||
// ----------------------------------------------------------------------------- | ||
// RUN: not %clang -c %s -target aarch64-none-linux-gnu -march=armv8-a+sve \ | ||
// RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-FLAG-ERROR %s | ||
|
||
typedef __SVInt32_t svint32_t; | ||
typedef svint32_t noflag __attribute__((arm_sve_vector_bits(256))); | ||
|
||
// CHECK-NO-FLAG-ERROR: error: 'arm_sve_vector_bits' is not supported when '-msve-vector-bits=<bits>' is not specified | ||
|
||
// Error if attribute vector size != -msve-vector-bits | ||
// ----------------------------------------------------------------------------- | ||
// RUN: not %clang -c %s -target aarch64-none-linux-gnu -march=armv8-a+sve \ | ||
// RUN: -msve-vector-bits=128 2>&1 | FileCheck --check-prefix=CHECK-BAD-VECTOR-SIZE-ERROR %s | ||
|
||
typedef svint32_t bad_vector_size __attribute__((arm_sve_vector_bits(256))); | ||
|
||
// CHECK-BAD-VECTOR-SIZE-ERROR: error: invalid SVE vector size '256', must match value set by '-msve-vector-bits' ('128') |
Oops, something went wrong.