This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] detect invalid altivec data types


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.

Tested on powerpc64-*-linux* with -m32 and -m64.  OK for mainline?

2004-11-23  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-23  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-23 13:19:23.000000000 -0800
+++ config/rs6000/rs6000.c	2004-11-23 13:39:14.937143344 -0800
@@ -17010,9 +17010,21 @@ 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");
 
   switch (altivec_type)
     {
@@ -17061,9 +17073,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-23 12:57:44.158037768 -0800
@@ -0,0 +1,60 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-options "-maltivec" } */
+
+/* These should be accepted.  */
+__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" "" } */
+
+/* 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" "" } */
+
+/* These should be rejected because the component types are invalid.  We
+   don't care about the actual error messages here.  */
+__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-23 12:59:06.011111272 -0800
@@ -0,0 +1,14 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-maltivec" } */
+
+/* These should get a warning.  */
+
+__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" "" } */
+__vector __bool long int vbli;		/* { dg-warning "deprecated" "" } */
--- /dev/null	2004-11-15 16:06:50.555915352 -0800
+++ gcc.dg/altivec-types-3.c	2004-11-23 13:00:37.764142040 -0800
@@ -0,0 +1,14 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-maltivec" } */
+
+/* These should be rejected.  */
+
+__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" "" } */
+__vector __bool long int vbli;		/* { dg-error "invalid for 64" "" } */
--- /dev/null	2004-11-15 16:06:50.555915352 -0800
+++ gcc.dg/altivec-types-4.c	2004-11-23 13:34:50.023074944 -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.  */
+
+__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;
+__vector __bool long int vbli;
--- /dev/null	2004-11-15 16:06:50.555915352 -0800
+++ g++.dg/ext/altivec-types-1.C	2004-11-23 13:10:26.096035424 -0800
@@ -0,0 +1,60 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-options "-maltivec" } */
+
+/* These should be accepted.  */
+__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" "" } */
+
+/* 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" "" } */
+
+/* These should be rejected because the component types are invalid.  We
+   don't care about the actual error messages here.  */
+__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-23 13:10:26.096035424 -0800
@@ -0,0 +1,14 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-maltivec" } */
+
+/* These should get a warning.  */
+
+__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" "" } */
+__vector __bool long int vbli;		/* { dg-warning "deprecated" "" } */
--- /dev/null	2004-11-15 16:06:50.555915352 -0800
+++ g++.dg/ext/altivec-types-3.C	2004-11-23 13:10:26.096035424 -0800
@@ -0,0 +1,14 @@
+/* { dg-do compile { target powerpc*-*-linux* } } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-maltivec" } */
+
+/* These should be rejected.  */
+
+__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" "" } */
+__vector __bool long int vbli;		/* { dg-error "invalid for 64" "" } */
--- /dev/null	2004-11-15 16:06:50.555915352 -0800
+++ g++.dg/ext/altivec-types-4.C	2004-11-23 13:35:07.331106104 -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.  */
+
+__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;
+__vector __bool long int vbli;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]