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
- From: Janis Johnson <janis187 at us dot ibm dot com>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>
- Cc: Janis Johnson <janis187 at us dot ibm dot com>, gcc-patches at gcc dot gnu dot org, uttamp at us dot ibm dot com
- Date: Tue, 30 Nov 2004 17:11:19 -0800
- Subject: Re: [patch] detect invalid altivec data types
- References: <20041123234037.GA7724@us.ibm.com> <Pine.LNX.4.61.0411240009340.9421@digraph.polyomino.org.uk> <20041130204640.GA6029@us.ibm.com> <Pine.LNX.4.61.0411302053300.32288@digraph.polyomino.org.uk>
On Tue, Nov 30, 2004 at 08:54:29PM +0000, Joseph S. Myers wrote:
> On Tue, 30 Nov 2004, Janis Johnson wrote:
>
> > +__vector Complex int vci; /* { dg-error "error" "" } */
>
> Should be _Complex or __complex__ not Complex.
This version checks for AltiVec types composed of complex types and
boolean types, this time using a check for complex types that catches
complex integer types. The tests make sure those are flagged as errors
for both C and C++, this time using _Complex and __complex for complex
types. "vector long" types are not supported for -m64 and are
deprecated for -m32, although there's a flag to turn off warnings, so
there are tests for proper handling of vector long types.
Bootstrapped C and C++ with this version on powerpc64-*-linux* and
ran the new tests 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 16:59:28.415222288 -0800
+++ config/rs6000/rs6000.c 2004-11-30 14:48:45.575269536 -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,25 @@ 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 (TREE_CODE (type) == COMPLEX_TYPE)
+ error ("use of %<complex%> in AltiVec types is invalid");
switch (altivec_type)
{
@@ -17092,9 +17110,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 14:52:47.692209192 -0800
@@ -0,0 +1,87 @@
+/* { 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" "" } */
+__vector _Complex float vcf; /* { dg-error "AltiVec types" "" } */
+__vector _Complex double vcd; /* { dg-error "AltiVec types" "" } */
+__vector _Complex long double vcld; /* { dg-error "AltiVec types" "" } */
+__vector _Complex signed char vcsc; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned char vcuc; /* { dg-error "AltiVec types" "" } */
+__vector _Complex short vcss; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned short vcus; /* { dg-error "AltiVec types" "" } */
+__vector _Complex int vcsi; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned int vcui; /* { dg-error "AltiVec types" "" } */
+__vector _Complex long vcsl; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned long vcul; /* { dg-error "AltiVec types" "" } */
+__vector _Complex long long vcsll; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned long long vcull; /* { dg-error "AltiVec types" "" } */
+__vector __complex float v_cf; /* { dg-error "AltiVec types" "" } */
+__vector __complex double v_cd; /* { dg-error "AltiVec types" "" } */
+__vector __complex long double v_cld; /* { dg-error "AltiVec types" "" } */
+__vector __complex signed char v_csc; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned char v_cuc; /* { dg-error "AltiVec types" "" } */
+__vector __complex short v_css; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned short v_cus; /* { dg-error "AltiVec types" "" } */
+__vector __complex int v_csi; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned int v_cui; /* { dg-error "AltiVec types" "" } */
+__vector __complex long v_csl; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned long v_cul; /* { dg-error "AltiVec types" "" } */
+__vector __complex long long v_csll; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned long long v_cull; /* { dg-error "AltiVec types" "" } */
+
+/* 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 10:35:31.778182480 -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 10:35:31.779182328 -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 10:35:31.779182328 -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 14:53:42.165181136 -0800
@@ -0,0 +1,87 @@
+/* { 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" "" } */
+__vector _Complex float vcf; /* { dg-error "AltiVec types" "" } */
+__vector _Complex double vcd; /* { dg-error "AltiVec types" "" } */
+__vector _Complex long double vcld; /* { dg-error "AltiVec types" "" } */
+__vector _Complex signed char vcsc; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned char vcuc; /* { dg-error "AltiVec types" "" } */
+__vector _Complex short vcss; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned short vcus; /* { dg-error "AltiVec types" "" } */
+__vector _Complex int vcsi; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned int vcui; /* { dg-error "AltiVec types" "" } */
+__vector _Complex long vcsl; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned long vcul; /* { dg-error "AltiVec types" "" } */
+__vector _Complex long long vcsll; /* { dg-error "AltiVec types" "" } */
+__vector _Complex unsigned long long vcull; /* { dg-error "AltiVec types" "" } */
+__vector __complex float v_cf; /* { dg-error "AltiVec types" "" } */
+__vector __complex double v_cd; /* { dg-error "AltiVec types" "" } */
+__vector __complex long double v_cld; /* { dg-error "AltiVec types" "" } */
+__vector __complex signed char v_csc; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned char v_cuc; /* { dg-error "AltiVec types" "" } */
+__vector __complex short v_css; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned short v_cus; /* { dg-error "AltiVec types" "" } */
+__vector __complex int v_csi; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned int v_cui; /* { dg-error "AltiVec types" "" } */
+__vector __complex long v_csl; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned long v_cul; /* { dg-error "AltiVec types" "" } */
+__vector __complex long long v_csll; /* { dg-error "AltiVec types" "" } */
+__vector __complex unsigned long long v_cull; /* { dg-error "AltiVec types" "" } */
+
+/* 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 10:35:31.782181872 -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 10:35:31.783181720 -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 10:35:31.784181568 -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;