From: Jakub Jelinek Date: Fri, 31 Aug 2007 07:25:20 +0000 (+0200) Subject: re PR debug/32914 (ICE in rtl_for_decl_init with -g option) X-Git-Tag: releases/gcc-4.2.2~112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=db8b3d46a3711cdb286e994076de66aea4bd754f;p=thirdparty%2Fgcc.git re PR debug/32914 (ICE in rtl_for_decl_init with -g option) PR debug/32914 * dwarf2out.c (rtl_for_decl_init): If vector decl has CONSTRUCTOR initializer, use build_vector_from_ctor if possible to create VECTOR_CST out of it. If vector initializer is not VECTOR_CST even after this, return NULL. * d++.dg/debug/const3.C: New test. * d++.dg/debug/const4.C: New test. From-SVN: r127958 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0a5af766e0d8..30b9539200c5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2007-08-31 Jakub Jelinek + + PR debug/32914 + * dwarf2out.c (rtl_for_decl_init): If vector decl has CONSTRUCTOR + initializer, use build_vector_from_ctor if possible to create + VECTOR_CST out of it. If vector initializer is not VECTOR_CST + even after this, return NULL. + 2007-08-27 Jason Merrill PR c++/31337 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 15b49a05b8aa..4416fd645b18 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -10065,6 +10065,43 @@ rtl_for_decl_init (tree init, tree type) else if (initializer_constant_valid_p (init, type) && ! walk_tree (&init, reference_to_unused, NULL, NULL)) { + /* Convert vector CONSTRUCTOR initializers to VECTOR_CST if + possible. */ + if (TREE_CODE (type) == VECTOR_TYPE) + switch (TREE_CODE (init)) + { + case VECTOR_CST: + break; + case CONSTRUCTOR: + if (TREE_CONSTANT (init)) + { + VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (init); + bool constant_p = true; + tree value; + unsigned HOST_WIDE_INT ix; + + /* Even when ctor is constant, it might contain non-*_CST + elements (e.g. { 1.0/0.0 - 1.0/0.0, 0.0 }) and those don't + belong into VECTOR_CST nodes. */ + FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value) + if (!CONSTANT_CLASS_P (value)) + { + constant_p = false; + break; + } + + if (constant_p) + { + init = build_vector_from_ctor (type, elts); + break; + } + } + /* FALLTHRU */ + + default: + return NULL; + } + rtl = expand_expr (init, NULL_RTX, VOIDmode, EXPAND_INITIALIZER); /* If expand_expr returns a MEM, it wasn't immediate. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e4782da3a199..756ee3a15923 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-08-31 Jakub Jelinek + + PR debug/32914 + * d++.dg/debug/const3.C: New test. + * d++.dg/debug/const4.C: New test. + 2007-08-24 Jakub Jelinek PR middle-end/32912 diff --git a/gcc/testsuite/g++.dg/debug/const3.C b/gcc/testsuite/g++.dg/debug/const3.C new file mode 100644 index 000000000000..375c548a3b36 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/const3.C @@ -0,0 +1,3 @@ +/* { dg-do compile } */ +typedef float FloatVect __attribute__((__vector_size__(16))); +const FloatVect Foo = { 250000000.0, 0.0, 0.0, 0.0 }; diff --git a/gcc/testsuite/g++.dg/debug/const4.C b/gcc/testsuite/g++.dg/debug/const4.C new file mode 100644 index 000000000000..ec8133d778aa --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/const4.C @@ -0,0 +1,2 @@ +/* { dg-do compile } */ +const __complex__ int x = 2i;