From: Jakub Jelinek Date: Wed, 7 May 2014 16:10:35 +0000 (+0200) Subject: backport: re PR middle-end/59011 (ICE in make_decl_rtl, at varasm.c:1147) X-Git-Tag: releases/gcc-4.7.4~98 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3d114c8f878d4407c0cee985fa56f484cd51881e;p=thirdparty%2Fgcc.git backport: re PR middle-end/59011 (ICE in make_decl_rtl, at varasm.c:1147) Backported from mainline 2013-12-03 Jakub Jelinek PR middle-end/59011 * gimplify.c (nonlocal_vla_vars): New variable. (gimplify_var_or_parm_decl): Put VAR_DECLs for VLAs into nonlocal_vla_vars chain. (gimplify_body): Call declare_vars on nonlocal_vla_vars chain if outer_bind has DECL_INITIAL (current_function_decl) block. * gcc.dg/pr59011.c: New test. From-SVN: r210179 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c32f18179fe9..c1595650e509 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,15 @@ 2014-05-07 Jakub Jelinek Backported from mainline + 2013-12-03 Jakub Jelinek + + PR middle-end/59011 + * gimplify.c (nonlocal_vla_vars): New variable. + (gimplify_var_or_parm_decl): Put VAR_DECLs for VLAs into + nonlocal_vla_vars chain. + (gimplify_body): Call declare_vars on nonlocal_vla_vars chain + if outer_bind has DECL_INITIAL (current_function_decl) block. + 2013-11-26 Jakub Jelinek PR tree-optimization/59014 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 531565e6499f..abb580f8958b 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1922,6 +1922,9 @@ gimplify_conversion (tree *expr_p) /* Nonlocal VLAs seen in the current function. */ static struct pointer_set_t *nonlocal_vlas; +/* The VAR_DECLs created for nonlocal VLAs for debug info purposes. */ +static tree nonlocal_vla_vars; + /* Gimplify a VAR_DECL or PARM_DECL. Return GS_OK if we expanded a DECL_VALUE_EXPR, and it's worth re-examining things. */ @@ -1968,14 +1971,13 @@ gimplify_var_or_parm_decl (tree *expr_p) ctx = ctx->outer_context; if (!ctx && !pointer_set_insert (nonlocal_vlas, decl)) { - tree copy = copy_node (decl), block; + tree copy = copy_node (decl); lang_hooks.dup_lang_specific_decl (copy); SET_DECL_RTL (copy, 0); TREE_USED (copy) = 1; - block = DECL_INITIAL (current_function_decl); - DECL_CHAIN (copy) = BLOCK_VARS (block); - BLOCK_VARS (block) = copy; + DECL_CHAIN (copy) = nonlocal_vla_vars; + nonlocal_vla_vars = copy; SET_DECL_VALUE_EXPR (copy, unshare_expr (value_expr)); DECL_HAS_VALUE_EXPR_P (copy) = 1; } @@ -8057,6 +8059,21 @@ gimplify_body (tree fndecl, bool do_parms) if (nonlocal_vlas) { + if (nonlocal_vla_vars) + { + /* tree-nested.c may later on call declare_vars (..., true); + which relies on BLOCK_VARS chain to be the tail of the + gimple_bind_vars chain. Ensure we don't violate that + assumption. */ + if (gimple_bind_block (outer_bind) + == DECL_INITIAL (current_function_decl)) + declare_vars (nonlocal_vla_vars, outer_bind, true); + else + BLOCK_VARS (DECL_INITIAL (current_function_decl)) + = chainon (BLOCK_VARS (DECL_INITIAL (current_function_decl)), + nonlocal_vla_vars); + nonlocal_vla_vars = NULL_TREE; + } pointer_set_destroy (nonlocal_vlas); nonlocal_vlas = NULL; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eeda6f55c31c..f098fe5cbc01 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2014-05-07 Jakub Jelinek Backported from mainline + 2013-12-03 Jakub Jelinek + + PR middle-end/59011 + * gcc.dg/pr59011.c: New test. + 2013-11-28 Jakub Jelinek PR c++/59297 diff --git a/gcc/testsuite/gcc.dg/pr59011.c b/gcc/testsuite/gcc.dg/pr59011.c new file mode 100644 index 000000000000..2fb8187ad552 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr59011.c @@ -0,0 +1,22 @@ +/* PR middle-end/59011 */ +/* { dg-do compile } */ +/* { dg-options "-std=gnu99" } */ + +void +foo (int m) +{ + int a[m]; + void + bar (void) + { + { + int + baz (void) + { + return a[0]; + } + } + a[0] = 42; + } + bar (); +}