aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2014-01-06 11:39:41 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2014-01-06 11:39:41 +0000
commitb5cd2a02573975f60ea28f5f24ee564e750c87b9 (patch)
treee57506ad36440ad7f660454e126f1e278aca85eb /gcc
parent04ba12ef8d883480ed9a178cef4e1e36be919c54 (diff)
downloadgcc-b5cd2a02573975f60ea28f5f24ee564e750c87b9.zip
gcc-b5cd2a02573975f60ea28f5f24ee564e750c87b9.tar.gz
gcc-b5cd2a02573975f60ea28f5f24ee564e750c87b9.tar.bz2
re PR debug/59350 (ICE: in vt_expand_var_loc_chain, at var-tracking.c:8212)
PR debug/59350 PR debug/59510 * var-tracking.c (add_stores): Preserve the value of the source even if we don't record the store. From-SVN: r206356
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/pr59510.C82
-rw-r--r--gcc/testsuite/gcc.dg/pr59350-2.c29
-rw-r--r--gcc/testsuite/gcc.dg/pr59350.c2
-rw-r--r--gcc/var-tracking.c24
6 files changed, 141 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 33548a0..a810fa2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-01-06 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR debug/59350
+ PR debug/59510
+ * var-tracking.c (add_stores): Preserve the value of the source even if
+ we don't record the store.
+
2014-01-06 Terry Guo <terry.guo@arm.com>
* config.gcc (arm*-*-*): Check --with-arch against arm-arches.def.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c46c8df..e2b84c5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-06 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.dg/pr59350.c: Tweak.
+ * gcc.dg/pr59350-2.c: New test.
+ * g++.dg/pr59510.C: Likewise.
+
2014-01-06 Janus Weil <janus@gcc.gnu.org>
PR fortran/59023
diff --git a/gcc/testsuite/g++.dg/pr59510.C b/gcc/testsuite/g++.dg/pr59510.C
new file mode 100644
index 0000000..dcdf860
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr59510.C
@@ -0,0 +1,82 @@
+// PR debug/59510
+// { dg-do compile }
+// { dg-options "-O2 -g --param=large-stack-frame-growth=1" }
+
+template <typename _Iterator>
+struct _Iter_base
+{
+ typedef _Iterator iterator_type;
+};
+template <typename _CharT>
+struct basic_ostream;
+template <typename _CharT>
+struct basic_ostringstream;
+template <typename _CharT>
+struct ostreambuf_iterator;
+typedef basic_ostringstream <char>ostringstream;
+template <typename _Iterator> struct _Miter_base : _Iter_base <_Iterator>
+{
+};
+template <typename _Iterator>
+typename _Miter_base <_Iterator>::iterator_type __miter_base (_Iterator);
+template <typename _CharT>
+ostreambuf_iterator <_CharT>
+__copy_move_a2 (ostreambuf_iterator <_CharT>);
+template <typename _II, typename _OI>
+_OI copy (_II __first, _II __last, _OI __result)
+{
+ __copy_move_a2 <false> (__first, __miter_base (__last), __result);
+}
+struct ios_base {
+ struct _Words {
+ int *_M_pword;
+ long _M_iword;
+ };
+ _Words _M_local_word[8];
+};
+template <typename _CharT>
+struct basic_streambuf
+{
+ typedef _CharT char_type;
+ int sputn (char_type *, int);
+};
+template <typename _CharT>
+struct ostreambuf_iterator
+{
+ typedef basic_streambuf <_CharT> streambuf_type;
+ typedef basic_ostream <_CharT> ostream_type;
+ streambuf_type *_M_sbuf;
+ bool _M_failed;
+ ostreambuf_iterator (ostream_type __s) : _M_sbuf (__s.rdbuf ()), _M_failed () {}
+ void _M_put (_CharT * __ws, int __len)
+ {
+ if (_M_failed && _M_sbuf->sputn (__ws, __len) != __len) _M_failed = true;
+ }
+};
+template <bool, typename _CharT>
+void __copy_move_a2 (_CharT * __first,_CharT * __last,ostreambuf_iterator <_CharT> __result)
+{
+ int __num = __last - __first;
+ __result._M_put (__first, __num);
+}
+template <typename _CharT>
+struct basic_ios : ios_base
+{
+ basic_streambuf <_CharT> *rdbuf ();
+};
+template <typename _CharT>
+struct basic_ostream : public basic_ios <_CharT>
+{
+};
+template <typename _CharT>
+struct basic_ostringstream : public basic_ostream <_CharT>
+{
+};
+void
+test01 () {
+ char data1[] = "foo";
+ char *beg1 = data1;
+ ostringstream oss1;
+ ostreambuf_iterator <char> out1 (oss1);
+ out1 = copy (beg1, beg1, out1);
+}
diff --git a/gcc/testsuite/gcc.dg/pr59350-2.c b/gcc/testsuite/gcc.dg/pr59350-2.c
new file mode 100644
index 0000000..2fea85f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr59350-2.c
@@ -0,0 +1,29 @@
+/* PR debug/59350 */
+
+/* { dg-do compile } */
+/* { dg-options "-O -g " } */
+
+typedef struct
+{
+ void *v;
+ int len;
+ int sign;
+} ZVALUE;
+
+extern int pred (ZVALUE);
+
+static unsigned long
+small_factor (ZVALUE z)
+{
+ if (z.len > 0)
+ return 0;
+
+ return pred (z) ? -1 : 0;
+}
+
+unsigned long
+zfactor (ZVALUE z)
+{
+ z.sign = 0;
+ return small_factor (z);
+}
diff --git a/gcc/testsuite/gcc.dg/pr59350.c b/gcc/testsuite/gcc.dg/pr59350.c
index be18687..fa63245 100644
--- a/gcc/testsuite/gcc.dg/pr59350.c
+++ b/gcc/testsuite/gcc.dg/pr59350.c
@@ -1,4 +1,4 @@
-/* PR rtl-optimization/59350 */
+/* PR debug/59350 */
/* Testcase by Ryan Mansfield <rmansfield@qnx.com> */
/* { dg-do compile } */
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index ee16aed..cfa7850 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -5930,6 +5930,13 @@ add_stores (rtx loc, const_rtx expr, void *cuip)
if (type != MO_VAL_SET)
goto log_and_return;
+ v = find_use_val (oloc, mode, cui);
+
+ if (!v)
+ goto log_and_return;
+
+ resolve = preserve = !cselib_preserved_value_p (v);
+
/* We cannot track values for multiple-part variables, so we track only
locations for tracked parameters passed either by invisible reference
or directly in multiple locations. */
@@ -5943,14 +5950,15 @@ add_stores (rtx loc, const_rtx expr, void *cuip)
&& XEXP (DECL_INCOMING_RTL (REG_EXPR (loc)), 0) != arg_pointer_rtx)
|| (GET_CODE (DECL_INCOMING_RTL (REG_EXPR (loc))) == PARALLEL
&& XVECLEN (DECL_INCOMING_RTL (REG_EXPR (loc)), 0) > 1)))
- goto log_and_return;
-
- v = find_use_val (oloc, mode, cui);
-
- if (!v)
- goto log_and_return;
-
- resolve = preserve = !cselib_preserved_value_p (v);
+ {
+ /* Although we don't use the value here, it could be used later by the
+ mere virtue of its existence as the operand of the reverse operation
+ that gave rise to it (typically extension/truncation). Make sure it
+ is preserved as required by vt_expand_var_loc_chain. */
+ if (preserve)
+ preserve_value (v);
+ goto log_and_return;
+ }
if (loc == stack_pointer_rtx
&& hard_frame_pointer_adjustment != -1