Patchwork [google,gcc-4_8] not mapping debug expr to a deleted varpool node (issue9760043)

login
register
mail settings
Submitter Rong Xu
Date May 24, 2013, 11:26 p.m.
Message ID <20130524232659.D539841517@xur2.mtv.corp.google.com>
Download mbox | patch
Permalink /patch/246301/
State New
Headers show

Comments

Rong Xu - May 24, 2013, 11:26 p.m.
This patch fixes a bug in exposed in LIPO build (ICE in copy tree node).

Tested with bookstrap and google internal benchmarks.

-Rong

2013-05-24  Rong Xu  <xur@google.com>
        Google ref b/8963414.
	* gcc/tree-inline.c (add_local_variables): Not map
        to deleted debug expression.


--
This patch is available for review at http://codereview.appspot.com/9760043
Xinliang David Li - May 25, 2013, 2:18 a.m.
On Fri, May 24, 2013 at 4:26 PM, Rong Xu <xur@google.com> wrote:
> This patch fixes a bug in exposed in LIPO build (ICE in copy tree node).
>
> Tested with bookstrap and google internal benchmarks.
>
> -Rong
>
> 2013-05-24  Rong Xu  <xur@google.com>
>         Google ref b/8963414.
>         * gcc/tree-inline.c (add_local_variables): Not map
>         to deleted debug expression.
>
> Index: gcc/tree-inline.c
> ===================================================================
> --- gcc/tree-inline.c   (revision 199128)
> +++ gcc/tree-inline.c   (working copy)
> @@ -3788,6 +3788,17 @@ add_local_variables (struct function *callee, stru
>           {
>             tree tem = DECL_DEBUG_EXPR (var);
>             bool old_regimplify = id->regimplify;
> +
> +            /* The mapped debug expression might be deleted
> +               as a varpool node (the reachbility analysis
> +               of varpool node does not check the reference
> +               from debug expressions.
> +               Set it to 0 if that's the case.  */
> +            if (L_IPO_COMP_MODE && tem &&
> +                (TREE_STATIC (tem) || DECL_EXTERNAL(tem)) &&
> +                real_varpool_node (tem) == NULL)
> +              tem = NULL;
> +
>             id->remapping_type_depth++;
>             walk_tree (&tem, copy_tree_body_r, id, NULL);
>             id->remapping_type_depth--;


IIUC, it is the real target var-decl of VAR that gets removed from
lipo's symtab thus calling real_var_pool_node later will trigger
gcc_assert. This fix just moved the assertion earlier?

It should be ok for now to just drop the debug expr if the var is
static/global.

David

>
> --
> This patch is available for review at http://codereview.appspot.com/9760043

Patch

Index: gcc/tree-inline.c
===================================================================
--- gcc/tree-inline.c	(revision 199128)
+++ gcc/tree-inline.c	(working copy)
@@ -3788,6 +3788,17 @@  add_local_variables (struct function *callee, stru
 	  {
 	    tree tem = DECL_DEBUG_EXPR (var);
 	    bool old_regimplify = id->regimplify;
+
+            /* The mapped debug expression might be deleted
+               as a varpool node (the reachbility analysis
+               of varpool node does not check the reference
+               from debug expressions.
+               Set it to 0 if that's the case.  */
+            if (L_IPO_COMP_MODE && tem &&
+                (TREE_STATIC (tem) || DECL_EXTERNAL(tem)) &&
+                real_varpool_node (tem) == NULL)
+              tem = NULL;
+
 	    id->remapping_type_depth++;
 	    walk_tree (&tem, copy_tree_body_r, id, NULL);
 	    id->remapping_type_depth--;