diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2014-01-06 11:39:41 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2014-01-06 11:39:41 +0000 |
commit | b5cd2a02573975f60ea28f5f24ee564e750c87b9 (patch) | |
tree | e57506ad36440ad7f660454e126f1e278aca85eb | |
parent | 04ba12ef8d883480ed9a178cef4e1e36be919c54 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr59510.C | 82 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr59350-2.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr59350.c | 2 | ||||
-rw-r--r-- | gcc/var-tracking.c | 24 |
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 |