aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Waller <peter.waller@arm.com>2020-12-10 12:34:00 +0000
committerPeter Waller <peter.waller@arm.com>2020-12-10 12:43:14 +0000
commit2315e9874c92bf625ec84a5f45a4fa28bfbc16ce (patch)
tree6f91a22b3cbd2deaaa9598f43656d8c433dd883a
parent208e3f5d9b6c172f65dbb9cdbc9354c81c6d8911 (diff)
downloadllvm-2315e9874c92bf625ec84a5f45a4fa28bfbc16ce.zip
llvm-2315e9874c92bf625ec84a5f45a4fa28bfbc16ce.tar.gz
llvm-2315e9874c92bf625ec84a5f45a4fa28bfbc16ce.tar.bz2
[AArch64][Driver][SVE] Push missing SVE feature error from driver to frontend
... and give more guidance to users. If specifying -msve-vector-bits on a non-SVE target, clang would say: error: '-msve-vector-bits' is not supported without SVE enabled 1. The driver lacks logic for "implied features". This would result in this error being raised for -march=...+sve2, even though +sve2 implies +sve. 2. Feature implication is well modelled in LLVM, so push the error down the stack. 3. Hint to the user what flag they need to consider setting. Now clang fails later, when the feature is used, saying: aarch64-sve-vector-bits.c:42:41: error: 'arm_sve_vector_bits' attribute is not supported on targets missing 'sve'; specify an appropriate -march= or -mcpu= typedef svint32_t noflag __attribute__((arm_sve_vector_bits(256))); Move clang/test/Sema/{neon => arm}-vector-types-support.c and put tests for this warning together in one place. Reviewed By: sdesmalen Differential Revision: https://reviews.llvm.org/D92487
-rw-r--r--clang/include/clang/Basic/DiagnosticDriverKinds.td3
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td3
-rw-r--r--clang/lib/Driver/ToolChains/Arch/AArch64.cpp6
-rw-r--r--clang/lib/Sema/SemaType.cpp5
-rw-r--r--clang/test/Driver/aarch64-sve-vector-bits.c15
-rw-r--r--clang/test/Sema/arm-vector-types-support.c5
-rw-r--r--clang/test/Sema/neon-vector-types-support.c4
7 files changed, 10 insertions, 31 deletions
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 8ca176d..0e85be8 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -534,9 +534,6 @@ def err_drv_cannot_mix_options : Error<"cannot specify '%1' along with '%0'">;
def err_drv_invalid_object_mode : Error<"OBJECT_MODE setting %0 is not recognized and is not a valid setting.">;
-def err_drv_invalid_sve_vector_bits : Error<
- "'-msve-vector-bits' is not supported without SVE enabled">;
-
def err_aix_default_altivec_abi : Error<
"The default Altivec ABI on AIX is not yet supported, use '-mabi=vec-extabi' for the extended Altivec ABI">;
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 97773d3..363bcc1 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -2843,7 +2843,8 @@ def warn_unsupported_target_attribute
"attribute ignored">,
InGroup<IgnoredAttributes>;
def err_attribute_unsupported
- : Error<"%0 attribute is not supported for this target">;
+ : Error<"%0 attribute is not supported on targets missing %1;"
+ " specify an appropriate -march= or -mcpu=">;
// The err_*_attribute_argument_not_int are separate because they're used by
// VerifyIntegerConstantExpression.
def err_aligned_attribute_argument_not_int : Error<
diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
index 0fc531b..fca6d95 100644
--- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
@@ -381,12 +381,6 @@ fp16_fml_fallthrough:
if (V8_6Pos != std::end(Features))
V8_6Pos = Features.insert(std::next(V8_6Pos), {"+i8mm", "+bf16"});
- bool HasSve = llvm::is_contained(Features, "+sve");
- // -msve-vector-bits=<bits> flag is valid only if SVE is enabled.
- if (Args.hasArg(options::OPT_msve_vector_bits_EQ))
- if (!HasSve)
- D.Diag(diag::err_drv_invalid_sve_vector_bits);
-
if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
options::OPT_munaligned_access)) {
if (A->getOption().matches(options::OPT_mno_unaligned_access))
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index fbdbfbc..6485beb 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -7799,7 +7799,8 @@ static void HandleNeonVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr,
// not to need a separate attribute)
if (!S.Context.getTargetInfo().hasFeature("neon") &&
!S.Context.getTargetInfo().hasFeature("mve")) {
- S.Diag(Attr.getLoc(), diag::err_attribute_unsupported) << Attr;
+ S.Diag(Attr.getLoc(), diag::err_attribute_unsupported)
+ << Attr << "'neon' or 'mve'";
Attr.setInvalid();
return;
}
@@ -7842,7 +7843,7 @@ static void HandleArmSveVectorBitsTypeAttr(QualType &CurType, ParsedAttr &Attr,
Sema &S) {
// Target must have SVE.
if (!S.Context.getTargetInfo().hasFeature("sve")) {
- S.Diag(Attr.getLoc(), diag::err_attribute_unsupported) << Attr;
+ S.Diag(Attr.getLoc(), diag::err_attribute_unsupported) << Attr << "'sve'";
Attr.setInvalid();
return;
}
diff --git a/clang/test/Driver/aarch64-sve-vector-bits.c b/clang/test/Driver/aarch64-sve-vector-bits.c
index ffe82f1..474619f 100644
--- a/clang/test/Driver/aarch64-sve-vector-bits.c
+++ b/clang/test/Driver/aarch64-sve-vector-bits.c
@@ -22,21 +22,6 @@
// CHECK-2048: "-msve-vector-bits=2048"
// CHECK-SCALABLE-NOT: "-msve-vector-bits=
-// 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 \
diff --git a/clang/test/Sema/arm-vector-types-support.c b/clang/test/Sema/arm-vector-types-support.c
new file mode 100644
index 0000000..fa101af
--- /dev/null
+++ b/clang/test/Sema/arm-vector-types-support.c
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 %s -triple armv7 -fsyntax-only -verify
+
+typedef __attribute__((neon_vector_type(2))) int int32x2_t; // expected-error{{'neon_vector_type' attribute is not supported on targets missing 'neon' or 'mve'; specify an appropriate -march= or -mcpu=}}
+typedef __attribute__((neon_polyvector_type(16))) short poly8x16_t; // expected-error{{'neon_polyvector_type' attribute is not supported on targets missing 'neon' or 'mve'; specify an appropriate -march= or -mcpu=}}
+typedef __attribute__((arm_sve_vector_bits(256))) void nosveflag; // expected-error{{'arm_sve_vector_bits' attribute is not supported on targets missing 'sve'; specify an appropriate -march= or -mcpu=}}
diff --git a/clang/test/Sema/neon-vector-types-support.c b/clang/test/Sema/neon-vector-types-support.c
deleted file mode 100644
index 6bf8539..0000000
--- a/clang/test/Sema/neon-vector-types-support.c
+++ /dev/null
@@ -1,4 +0,0 @@
-// RUN: %clang_cc1 %s -triple armv7 -fsyntax-only -verify
-
-typedef __attribute__((neon_vector_type(2))) int int32x2_t; // expected-error{{'neon_vector_type' attribute is not supported for this target}}
-typedef __attribute__((neon_polyvector_type(16))) short poly8x16_t; // expected-error{{'neon_polyvector_type' attribute is not supported for this target}}