This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch] detect invalid altivec data types
On Wed, Nov 24, 2004 at 12:11:29AM +0000, Joseph S. Myers wrote:
> On Tue, 23 Nov 2004, Janis Johnson wrote:
>
> > This patch recognizes errors for AltiVec types with invalid component
> > types. The tests also check for component types that are themselves
> > invalid to make sure those are detected elsewhere in the compiler.
> > If the tests are relevant for more targets than powerpc*-*-linux* then
> > I can fix that.
>
> I don't know if _Complex types are valid here or not, but the tests don't
> seem to cover them. Nor do they test the C99 _Bool (as distinct from the
> AltiVec __bool).
This version checks for AltiVec types composed of complex types (which
don't actually make it as far as this check) and boolean types. The
tests make sure those are flagged as errors for both C and C++.
Tested on powerpc64-*-linux* with -m32 and -m64. OK for mainline?
2004-11-30 Uttam Pawar <uttamp@us.ibm.com>
Janis Johnson <janis187@us.ibm.com>
* rs6000.c (rs6000_handle_altivec_attribute_tree): Report errors
for vector types with invalid component types.
testsuite:
2004-11-30 Janis Johnson <janis187@us.ibm.com
* gcc.dg/altivec-types-1.c: New test.
* gcc.dg/altivec-types-2.c: New test.
* gcc.dg/altivec-types-3.c: New test.
* gcc.dg/altivec-types-4.c: New test.
* g++.dg/ext/altivec-types-1.C: New test.
* g++.dg/ext/altivec-types-2.C: New test.
* g++.dg/ext/altivec-types-3.C: New test.
* g++.dg/ext/altivec-types-4.C: New test.
--- config/rs6000/rs6000.c.orig 2004-11-30 09:20:13.000000000 -0800
+++ config/rs6000/rs6000.c 2004-11-30 09:55:32.805220848 -0800
@@ -17020,7 +17020,9 @@ const struct attribute_spec rs6000_attri
given declaration. */
static tree
-rs6000_handle_altivec_attribute (tree *node, tree name, tree args,
+rs6000_handle_altivec_attribute (tree *node,
+ tree name ATTRIBUTE_UNUSED,
+ tree args,
int flags ATTRIBUTE_UNUSED,
bool *no_add_attrs)
{
@@ -17041,9 +17043,28 @@ rs6000_handle_altivec_attribute (tree *n
mode = TYPE_MODE (type);
- if (rs6000_warn_altivec_long
- && (type == long_unsigned_type_node || type == long_integer_type_node))
- warning ("use of 'long' in AltiVec types is deprecated; use 'int'");
+ /* Check for invalid AltiVec type qualifiers. */
+ if (type == long_unsigned_type_node || type == long_integer_type_node)
+ {
+ if (TARGET_64BIT)
+ error ("use of %<long%> in AltiVec types is invalid for 64-bit code");
+ else if (rs6000_warn_altivec_long)
+ warning ("use of %<long%> in AltiVec types is deprecated; use %<int%>");
+ }
+ else if (type == long_long_unsigned_type_node
+ || type == long_long_integer_type_node)
+ error ("use of %<long long%> in AltiVec types is invalid");
+ else if (type == double_type_node)
+ error ("use of %<double%> in AltiVec types is invalid");
+ else if (type == long_double_type_node)
+ error ("use of %<long double%> in AltiVec types is invalid");
+ else if (type == boolean_type_node)
+ error ("use of boolean types in AltiVec types is invalid");
+ else if (type == complex_integer_type_node
+ || type == complex_float_type_node
+ || type == complex_double_type_node
+ || type == complex_long_double_type_node)
+ error ("use of %<complex%> in AltiVec types is invalid");
switch (altivec_type)
{
@@ -17092,9 +17113,7 @@ rs6000_handle_altivec_attribute (tree *n
*no_add_attrs = true; /* No need to hang on to the attribute. */
- if (!result)
- warning ("%qs attribute ignored", IDENTIFIER_POINTER (name));
- else
+ if (result)
*node = reconstruct_complex_type (*node, result);
return NULL_TREE;
--- /dev/null 2004-11-15 16:06:50.555915352 -0800
+++ gcc.dg/altivec-types-1.c 2004-11-30 09:36:56.681273960 -0800
@@ -0,0 +1,68 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-options "-maltivec" } */
+
+/* Valid AltiVec vector types should be accepted with no warnings. */
+
+__vector char vc;
+__vector unsigned char vuc;
+__vector signed char vsc;
+__vector __bool char vbc;
+__vector short vh;
+__vector signed short vsh;
+__vector unsigned short vuh;
+__vector short int vhi;
+__vector signed short int vshi;
+__vector unsigned short int vuhi;
+__vector __bool short vbh;
+__vector __bool short int vbhi;
+__vector int vi;
+__vector unsigned int vui;
+__vector signed int vsi;
+__vector __bool int vbi;
+__vector unsigned vuj;
+__vector signed vsj;
+__vector __bool vbj;
+__vector float vf;
+
+/* These should be rejected as invalid AltiVec types. */
+
+__vector long long vll; /* { dg-error "AltiVec types" "" } */
+__vector unsigned long long vull; /* { dg-error "AltiVec types" "" } */
+__vector signed long long vsll; /* { dg-error "AltiVec types" "" } */
+__vector __bool long long vbll; /* { dg-error "AltiVec types" "" } */
+__vector long long int vlli; /* { dg-error "AltiVec types" "" } */
+__vector unsigned long long int vulli; /* { dg-error "AltiVec types" "" } */
+__vector signed long long int vslli; /* { dg-error "AltiVec types" "" } */
+__vector __bool long long int vblli; /* { dg-error "AltiVec types" "" } */
+__vector double vd1; /* { dg-error "AltiVec types" "" } */
+__vector long double vld; /* { dg-error "AltiVec types" "" } */
+__vector _Bool vb; /* { dg-error "AltiVec types" "" } */
+
+/* These are rejected before the compiler checks AltiVec types. */
+
+__vector Complex int vci; /* { dg-error "error" "" } */
+__vector Complex float vcf; /* { dg-error "error" "" } */
+__vector Complex double vcd; /* { dg-error "error" "" } */
+__vector Complex long double vcd; /* { dg-error "error" "" } */
+
+/* These should be rejected because the component types are invalid. We
+ don't care about the actual error messages here. */
+
+__vector __bool unsigned char vbuc; /* { dg-error "error" "" } */
+__vector __bool signed char vbsc; /* { dg-error "error" "" } */
+__vector __bool unsigned short vbuh; /* { dg-error "error" "" } */
+__vector __bool signed short vbsh; /* { dg-error "error" "" } */
+__vector __bool unsigned int vbui; /* { dg-error "error" "" } */
+__vector __bool signed int vbsi; /* { dg-error "error" "" } */
+__vector __bool unsigned vbuj; /* { dg-error "error" "" } */
+__vector __bool signed vbsj; /* { dg-error "error" "" } */
+__vector signed float vsf; /* { dg-error "error" "" } */
+__vector unsigned float vuf; /* { dg-error "error" "" } */
+__vector short float vsf; /* { dg-error "error" "" } */
+__vector signed double vsd; /* { dg-error "error" "" } */
+__vector unsigned double vud; /* { dg-error "error" "" } */
+__vector short double vsd; /* { dg-error "error" "" } */
+__vector __bool float vbf; /* { dg-error "error" "" } */
+__vector __bool double vbd; /* { dg-error "error" "" } */
+__vector __bool short float blf; /* { dg-error "error" "" } */
+__vector __bool short double vlbd; /* { dg-error "error" "" } */
--- /dev/null 2004-11-15 16:06:50.555915352 -0800
+++ gcc.dg/altivec-types-2.c 2004-11-30 09:45:30.377204344 -0800
@@ -0,0 +1,13 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-maltivec" } */
+
+/* These should get warnings for 32-bit code. */
+
+__vector long vl; /* { dg-warning "deprecated" "" } */
+__vector unsigned long vul; /* { dg-warning "deprecated" "" } */
+__vector signed long vsl; /* { dg-warning "deprecated" "" } */
+__vector __bool long int vbli; /* { dg-warning "deprecated" "" } */
+__vector long int vli; /* { dg-warning "deprecated" "" } */
+__vector unsigned long int vuli; /* { dg-warning "deprecated" "" } */
+__vector signed long int vsli; /* { dg-warning "deprecated" "" } */
--- /dev/null 2004-11-15 16:06:50.555915352 -0800
+++ gcc.dg/altivec-types-3.c 2004-11-30 09:45:49.980288424 -0800
@@ -0,0 +1,13 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-maltivec" } */
+
+/* These should be rejected for 64-bit code. */
+
+__vector long vl; /* { dg-error "invalid for 64" "" } */
+__vector unsigned long vul; /* { dg-error "invalid for 64" "" } */
+__vector signed long vsl; /* { dg-error "invalid for 64" "" } */
+__vector __bool long int vbli; /* { dg-error "invalid for 64" "" } */
+__vector long int vli; /* { dg-error "invalid for 64" "" } */
+__vector unsigned long int vuli; /* { dg-error "invalid for 64" "" } */
+__vector signed long int vsli; /* { dg-error "invalid for 64" "" } */
--- /dev/null 2004-11-15 16:06:50.555915352 -0800
+++ gcc.dg/altivec-types-4.c 2004-11-30 09:45:55.257283232 -0800
@@ -0,0 +1,14 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-maltivec -mno-warn-altivec-long" } */
+
+/* These should not get warnings for 32-bit code when the warning is
+ disabled. */
+
+__vector long vl;
+__vector unsigned long vul;
+__vector signed long vsl;
+__vector __bool long int vbli;
+__vector long int vli;
+__vector unsigned long int vuli;
+__vector signed long int vsli;
--- /dev/null 2004-11-15 16:06:50.555915352 -0800
+++ g++.dg/ext/altivec-types-1.C 2004-11-30 09:44:25.827166128 -0800
@@ -0,0 +1,68 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-options "-maltivec" } */
+
+/* Valid AltiVec vector types should be accepted with no warnings. */
+
+__vector char vc;
+__vector unsigned char vuc;
+__vector signed char vsc;
+__vector __bool char vbc;
+__vector short vh;
+__vector signed short vsh;
+__vector unsigned short vuh;
+__vector short int vhi;
+__vector signed short int vshi;
+__vector unsigned short int vuhi;
+__vector __bool short vbh;
+__vector __bool short int vbhi;
+__vector int vi;
+__vector unsigned int vui;
+__vector signed int vsi;
+__vector __bool int vbi;
+__vector unsigned vuj;
+__vector signed vsj;
+__vector __bool vbj;
+__vector float vf;
+
+/* These should be rejected as invalid AltiVec types. */
+
+__vector bool vb; /* { dg-error "AltiVec types" "" } */
+__vector long long vll; /* { dg-error "AltiVec types" "" } */
+__vector unsigned long long vull; /* { dg-error "AltiVec types" "" } */
+__vector signed long long vsll; /* { dg-error "AltiVec types" "" } */
+__vector __bool long long vbll; /* { dg-error "AltiVec types" "" } */
+__vector long long int vlli; /* { dg-error "AltiVec types" "" } */
+__vector unsigned long long int vulli; /* { dg-error "AltiVec types" "" } */
+__vector signed long long int vslli; /* { dg-error "AltiVec types" "" } */
+__vector __bool long long int vblli; /* { dg-error "AltiVec types" "" } */
+__vector double vd1; /* { dg-error "AltiVec types" "" } */
+__vector long double vld; /* { dg-error "AltiVec types" "" } */
+
+/* These are rejected before the compiler checks AltiVec types. */
+
+__vector Complex int vci; /* { dg-error "error" "" } */
+__vector Complex float vcf; /* { dg-error "error" "" } */
+__vector Complex double vcd; /* { dg-error "error" "" } */
+__vector Complex long double vcd; /* { dg-error "error" "" } */
+
+/* These should be rejected because the component types are invalid. We
+ don't care about the actual error messages here. */
+
+__vector __bool unsigned char vbuc; /* { dg-error "error" "" } */
+__vector __bool signed char vbsc; /* { dg-error "error" "" } */
+__vector __bool unsigned short vbuh; /* { dg-error "error" "" } */
+__vector __bool signed short vbsh; /* { dg-error "error" "" } */
+__vector __bool unsigned int vbui; /* { dg-error "error" "" } */
+__vector __bool signed int vbsi; /* { dg-error "error" "" } */
+__vector __bool unsigned vbuj; /* { dg-error "error" "" } */
+__vector __bool signed vbsj; /* { dg-error "error" "" } */
+__vector signed float vsf; /* { dg-error "error" "" } */
+__vector unsigned float vuf; /* { dg-error "error" "" } */
+__vector short float vsf; /* { dg-error "error" "" } */
+__vector signed double vsd; /* { dg-error "error" "" } */
+__vector unsigned double vud; /* { dg-error "error" "" } */
+__vector short double vsd; /* { dg-error "error" "" } */
+__vector __bool float vbf; /* { dg-error "error" "" } */
+__vector __bool double vbd; /* { dg-error "error" "" } */
+__vector __bool short float blf; /* { dg-error "error" "" } */
+__vector __bool short double vlbd; /* { dg-error "error" "" } */
--- /dev/null 2004-11-15 16:06:50.555915352 -0800
+++ g++.dg/ext/altivec-types-2.C 2004-11-30 09:38:54.392221608 -0800
@@ -0,0 +1,13 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-maltivec" } */
+
+/* These should get warnings for 32-bit code. */
+
+__vector long vl; /* { dg-warning "deprecated" "" } */
+__vector unsigned long vul; /* { dg-warning "deprecated" "" } */
+__vector signed long vsl; /* { dg-warning "deprecated" "" } */
+__vector __bool long int vbli; /* { dg-warning "deprecated" "" } */
+__vector long int vli; /* { dg-warning "deprecated" "" } */
+__vector unsigned long int vuli; /* { dg-warning "deprecated" "" } */
+__vector signed long int vsli; /* { dg-warning "deprecated" "" } */
--- /dev/null 2004-11-15 16:06:50.555915352 -0800
+++ g++.dg/ext/altivec-types-3.C 2004-11-30 09:39:02.418199720 -0800
@@ -0,0 +1,13 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-maltivec" } */
+
+/* These should be rejected for 64-bit code. */
+
+__vector long vl; /* { dg-error "invalid for 64" "" } */
+__vector unsigned long vul; /* { dg-error "invalid for 64" "" } */
+__vector signed long vsl; /* { dg-error "invalid for 64" "" } */
+__vector __bool long int vbli; /* { dg-error "invalid for 64" "" } */
+__vector long int vli; /* { dg-error "invalid for 64" "" } */
+__vector unsigned long int vuli; /* { dg-error "invalid for 64" "" } */
+__vector signed long int vsli; /* { dg-error "invalid for 64" "" } */
--- /dev/null 2004-11-15 16:06:50.555915352 -0800
+++ g++.dg/ext/altivec-types-4.C 2004-11-30 09:39:14.468232248 -0800
@@ -0,0 +1,14 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-maltivec -mno-warn-altivec-long" } */
+
+/* These should not get warnings for 32-bit code when the warning is
+ disabled. */
+
+__vector long vl;
+__vector unsigned long vul;
+__vector signed long vsl;
+__vector __bool long int vbli;
+__vector long int vli;
+__vector unsigned long int vuli;
+__vector signed long int vsli;