This avoids streaming PARM_DECLs both in the global type/decl and
the local function sections.  They are needed on the global level,
so properly stream them there.  Fixes part of the issues we have
with debug information for early inlining, too.

LTO Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2012-09-28  Richard Guenther  <rguent...@suse.de>

        PR lto/47799
        * lto-streamer-out.c (tree_is_indexable): Make PARM_DECLs global.
        (lto_output_tree_ref): Handle references to them.
        (output_function): Do not output function arguments again.
        * lto-streamer-in.c (input_function): Do not input arguments
        again, nor overwrite them.

Index: gcc/lto-streamer-out.c
===================================================================
*** gcc/lto-streamer-out.c.orig 2012-09-26 16:47:18.000000000 +0200
--- gcc/lto-streamer-out.c      2012-09-28 11:18:35.438055184 +0200
*************** static bool
*** 125,131 ****
  tree_is_indexable (tree t)
  {
    if (TREE_CODE (t) == PARM_DECL)
!     return false;
    else if (TREE_CODE (t) == VAR_DECL && decl_function_context (t)
           && !TREE_STATIC (t))
      return false;
--- 125,131 ----
  tree_is_indexable (tree t)
  {
    if (TREE_CODE (t) == PARM_DECL)
!     return true;
    else if (TREE_CODE (t) == VAR_DECL && decl_function_context (t)
           && !TREE_STATIC (t))
      return false;
*************** lto_output_tree_ref (struct output_block
*** 237,242 ****
--- 237,243 ----
      case VAR_DECL:
      case DEBUG_EXPR_DECL:
        gcc_assert (decl_function_context (expr) == NULL || TREE_STATIC (expr));
+     case PARM_DECL:
        streamer_write_record_start (ob, LTO_global_decl_ref);
        lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
        break;
*************** output_function (struct cgraph_node *nod
*** 806,814 ****
  
    output_struct_function_base (ob, fn);
  
-   /* Output the head of the arguments list.  */
-   stream_write_tree (ob, DECL_ARGUMENTS (function), true);
- 
    /* Output all the SSA names used in the function.  */
    output_ssa_names (ob, fn);
  
--- 807,812 ----
Index: gcc/lto-streamer-in.c
===================================================================
*** gcc/lto-streamer-in.c.orig  2012-09-21 10:59:45.000000000 +0200
--- gcc/lto-streamer-in.c       2012-09-28 11:14:53.835068419 +0200
*************** input_function (tree fn_decl, struct dat
*** 823,829 ****
    gimple *stmts;
    basic_block bb;
    struct cgraph_node *node;
-   tree args, narg, oarg;
  
    fn = DECL_STRUCT_FUNCTION (fn_decl);
    tag = streamer_read_record_start (ib);
--- 823,828 ----
*************** input_function (tree fn_decl, struct dat
*** 834,855 ****
  
    input_struct_function_base (fn, data_in, ib);
  
-   /* Read all function arguments.  We need to re-map them here to the
-      arguments of the merged function declaration.  */
-   args = stream_read_tree (ib, data_in);
-   for (oarg = args, narg = DECL_ARGUMENTS (fn_decl);
-        oarg && narg;
-        oarg = TREE_CHAIN (oarg), narg = TREE_CHAIN (narg))
-     {
-       unsigned ix;
-       bool res;
-       res = streamer_tree_cache_lookup (data_in->reader_cache, oarg, &ix);
-       gcc_assert (res);
-       /* Replace the argument in the streamer cache.  */
-       streamer_tree_cache_insert_at (data_in->reader_cache, narg, ix);
-     }
-   gcc_assert (!oarg && !narg);
- 
    /* Read all the SSA names.  */
    input_ssa_names (ib, data_in, fn);
  
--- 833,838 ----

Reply via email to