[PATCH] PR 56043, Fix segfault in 4.7/4.8 powerpc tests

Michael Meissner meissner@linux.vnet.ibm.com
Thu Feb 7 22:34:00 GMT 2013


The following patch fixes a segmentation fault for the powerpc-none-eabi
toolchain on the vsx-mass-1.c test.  Some of the builtin functions are not
defined in that environment, and the compiler did not check whether a pointer
was NULL before using it.  I also fixed the test so that it would only run
under powerpc*-*-linux*, since the text would fail on systems like eabi because
some of the builtin functions would not call their vector counterparts in the
MASS library.

I've built both 4.8 and 4.7 with this patch, and I didn't notice any
regressions.  Is it ok to install in both the 4.7 tree and trunk?

[gcc]
2013-02-07  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/56043
	* config/rs6000/rs6000.c (rs6000_builtin_vectorized_libmass):
	If there is no implicit builtin declaration, just return NULL.

[gcc/testsuite]
2013-02-07  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/56043
	* gcc.target/powerpc/vsx-mass-1.c: Only run this test on
	powerpc*-*-linux*.

-- 
Michael Meissner, IBM
5 Technology Place Drive, M/S 2757, Westford, MA 01886-3141, USA
meissner@linux.vnet.ibm.com	fax +1 (978) 399-6899
-------------- next part --------------
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 195825)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -3699,7 +3699,8 @@ rs6000_builtin_vectorized_libmass (tree 
 	  bdecl = builtin_decl_implicit (fn);
 	  suffix = "d2";				/* pow -> powd2 */
 	  if (el_mode != DFmode
-	      || n != 2)
+	      || n != 2
+	      || !bdecl)
 	    return NULL_TREE;
 	  break;
 
@@ -3736,7 +3737,8 @@ rs6000_builtin_vectorized_libmass (tree 
 	  bdecl = builtin_decl_implicit (fn);
 	  suffix = "4";					/* powf -> powf4 */
 	  if (el_mode != SFmode
-	      || n != 4)
+	      || n != 4
+	      || !bdecl)
 	    return NULL_TREE;
 	  break;
 
@@ -3749,6 +3751,9 @@ rs6000_builtin_vectorized_libmass (tree 
 
   gcc_assert (suffix != NULL);
   bname = IDENTIFIER_POINTER (DECL_NAME (bdecl));
+  if (!bname)
+    return NULL_TREE;
+
   strcpy (name, bname + sizeof ("__builtin_") - 1);
   strcat (name, suffix);
 
Index: gcc/testsuite/gcc.target/powerpc/vsx-mass-1.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/vsx-mass-1.c	(revision 195825)
+++ gcc/testsuite/gcc.target/powerpc/vsx-mass-1.c	(working copy)
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-do compile { target { powerpc*-*-linux* } } } */
 /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
 /* { dg-require-effective-target powerpc_vsx_ok } */
 /* { dg-options "-O3 -ftree-vectorize -mcpu=power7 -ffast-math -mveclibabi=mass" } */


More information about the Gcc-patches mailing list