aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-05-12 09:20:17 +0200
committerRichard Biener <rguenther@suse.de>2021-05-18 09:03:24 +0200
commit4054472b3fa15e11ccd48190f5e3ecfc89d65af9 (patch)
tree0262bbd39afb7f883b8a48e4dfbd73d582069b88
parent7e75d62442fc3707c96c53d22f6c185fdf893c72 (diff)
downloadgcc-4054472b3fa15e11ccd48190f5e3ecfc89d65af9.zip
gcc-4054472b3fa15e11ccd48190f5e3ecfc89d65af9.tar.gz
gcc-4054472b3fa15e11ccd48190f5e3ecfc89d65af9.tar.bz2
c/100547 - reject overly large vector_size attributes
This rejects a number of vector components that does not fit an 'int' which is an internal limitation of RTVEC. This requires adjusting gcc.dg/attr-vector_size.c which checks for much larger supported vectors. Note that the RTVEC limitation is a host specific limitation (unless we change this 'int' to int32_t), but should be 32bits in practice everywhere. 2021-05-12 Richard Biener <rguenther@suse.de> PR c/100547 gcc/c-family/ * c-attribs.c (type_valid_for_vector_size): Reject too large nunits. Reword existing nunit diagnostic. gcc/testsuite/ * gcc.dg/pr100547.c: New testcase. * gcc.dg/attr-vector_size.c: Adjust.
-rw-r--r--gcc/c-family/c-attribs.c16
-rw-r--r--gcc/testsuite/gcc.dg/attr-vector_size.c16
-rw-r--r--gcc/testsuite/gcc.dg/pr100547.c35
3 files changed, 49 insertions, 18 deletions
diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
index f54388e..ecb32c7 100644
--- a/gcc/c-family/c-attribs.c
+++ b/gcc/c-family/c-attribs.c
@@ -4245,10 +4245,22 @@ type_valid_for_vector_size (tree type, tree atname, tree args,
if (nunits & (nunits - 1))
{
if (error_p)
- error ("number of components of the vector not a power of two");
+ error ("number of vector components %wu not a power of two", nunits);
else
warning (OPT_Wattributes,
- "number of components of the vector not a power of two");
+ "number of vector components %wu not a power of two", nunits);
+ return NULL_TREE;
+ }
+
+ if (nunits >= (unsigned HOST_WIDE_INT)INT_MAX)
+ {
+ if (error_p)
+ error ("number of vector components %wu exceeds %d",
+ nunits, INT_MAX - 1);
+ else
+ warning (OPT_Wattributes,
+ "number of vector components %wu exceeds %d",
+ nunits, INT_MAX - 1);
return NULL_TREE;
}
diff --git a/gcc/testsuite/gcc.dg/attr-vector_size.c b/gcc/testsuite/gcc.dg/attr-vector_size.c
index 00be26a..3f2ce88 100644
--- a/gcc/testsuite/gcc.dg/attr-vector_size.c
+++ b/gcc/testsuite/gcc.dg/attr-vector_size.c
@@ -22,14 +22,6 @@ DEFVEC (extern, 30);
#if __SIZEOF_SIZE_T__ > 4
-DEFVEC (extern, 31);
-DEFVEC (extern, 32);
-DEFVEC (extern, 33);
-DEFVEC (extern, 34);
-DEFVEC (extern, 60);
-DEFVEC (extern, 61);
-DEFVEC (extern, 62);
-
VEC (POW2 (63)) char v63; /* { dg-error "'vector_size' attribute argument value '9223372036854775808' exceeds 9223372036854775807" "LP64" { target lp64 } } */
#else
@@ -49,14 +41,6 @@ void test_local_scope (void)
#if __SIZEOF_SIZE_T__ > 4
- DEFVEC (auto, 31);
- DEFVEC (auto, 32);
- DEFVEC (auto, 33);
- DEFVEC (auto, 34);
- DEFVEC (auto, 60);
- DEFVEC (auto, 61);
- DEFVEC (auto, 62);
-
VEC (POW2 (63)) char v63; /* { dg-error "'vector_size' attribute argument value '9223372036854775808' exceeds 9223372036854775807" "LP64" { target lp64 } } */
#else
diff --git a/gcc/testsuite/gcc.dg/pr100547.c b/gcc/testsuite/gcc.dg/pr100547.c
new file mode 100644
index 0000000..2d3da4e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr100547.c
@@ -0,0 +1,35 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O -g" } */
+
+typedef int __attribute__((vector_size(
+ ((((((((((((((((((((((((((((((8 * sizeof(short)) * sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)) *
+ sizeof(short)))) V; /* { dg-error "number of vector components" } */
+void k() { V w = { 0 }; }