On Tue, Jan 3, 2017 at 6:28 AM, Alexandre Oliva <[email protected]> wrote:
> Various Ada RTS files failed -fcompare-debug compilation because debug
> stmts prevented EH cleanups from taking place. Adjusting
> cleanup_empty_eh to skip them fixes it.
>
> Regstrapped on x86_64-linux-gnu and i686-linux-gnu. Ok to install?
Ok.
Richard.
> for gcc/ChangeLog
>
> * gimple-iterator.h (gsi_one_nondebug_before_end_p): New.
> * tree-eh.c (cleanup_empty_eh): Skip more debug stmts.
> ---
> gcc/gimple-iterator.h | 14 ++++++++++++++
> gcc/tree-eh.c | 7 ++++---
> 2 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/gimple-iterator.h b/gcc/gimple-iterator.h
> index a58b0a4b5d..d7cd87e 100644
> --- a/gcc/gimple-iterator.h
> +++ b/gcc/gimple-iterator.h
> @@ -305,6 +305,20 @@ gsi_last_nondebug_bb (basic_block bb)
> return i;
> }
>
> +/* Return true if I is followed only by debug statements in its
> + sequence. */
> +
> +static inline bool
> +gsi_one_nondebug_before_end_p (gimple_stmt_iterator i)
> +{
> + if (gsi_one_before_end_p (i))
> + return true;
> + if (gsi_end_p (i))
> + return false;
> + gsi_next_nondebug (&i);
> + return gsi_end_p (i);
> +}
> +
> /* Iterates I statement iterator to the next non-virtual statement. */
>
> static inline void
> diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
> index db72156..e9edd97 100644
> --- a/gcc/tree-eh.c
> +++ b/gcc/tree-eh.c
> @@ -4382,7 +4382,8 @@ cleanup_empty_eh (eh_landing_pad lp)
> return false;
> }
>
> - resx = last_stmt (bb);
> + gsi = gsi_last_nondebug_bb (bb);
> + resx = gsi_stmt (gsi);
> if (resx && is_gimple_resx (resx))
> {
> if (stmt_can_throw_external (resx))
> @@ -4416,12 +4417,12 @@ cleanup_empty_eh (eh_landing_pad lp)
> resx = gsi_stmt (gsi);
> if (!e_out && gimple_call_builtin_p (resx, BUILT_IN_STACK_RESTORE))
> {
> - gsi_next (&gsi);
> + gsi_next_nondebug (&gsi);
> resx = gsi_stmt (gsi);
> }
> if (!is_gimple_resx (resx))
> return ret;
> - gcc_assert (gsi_one_before_end_p (gsi));
> + gcc_assert (gsi_one_nondebug_before_end_p (gsi));
>
> /* Determine if there are non-EH edges, or resx edges into the handler. */
> has_non_eh_pred = false;
>
> --
> Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/
> You must be the change you wish to see in the world. -- Gandhi
> Be Free! -- http://FSFLA.org/ FSF Latin America board member
> Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer