OSDN Git Service

2010-10-08 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Oct 2010 15:21:29 +0000 (15:21 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Oct 2010 15:21:29 +0000 (15:21 +0000)
* lto-streamer-in.c (lto_input_ts_decl_minimal_tree_pointers):
Re-construct BLOCK_VARS.
(lto_input_ts_block_tree_pointers): Do not stream BLOCK_VARS.
* lto-streamer-out.c (lto_output_ts_block_tree_pointers): Likewise.
* tree.c (free_lang_data_in_block): Remove.
(free_lang_data_in_decl): Do not touch DECL_CONTEXT of non-PARM_DECLs.
Do not touch the BLOCK tree.
* expr.c (expand_expr_real_1): Allow externals.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165191 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c
gcc/lto-streamer-in.c
gcc/lto-streamer-out.c
gcc/tree.c

index f713eff..be4f9f7 100644 (file)
@@ -1,5 +1,16 @@
 2010-10-08  Richard Guenther  <rguenther@suse.de>
 
+       * lto-streamer-in.c (lto_input_ts_decl_minimal_tree_pointers):
+       Re-construct BLOCK_VARS.
+       (lto_input_ts_block_tree_pointers): Do not stream BLOCK_VARS.
+       * lto-streamer-out.c (lto_output_ts_block_tree_pointers): Likewise.
+       * tree.c (free_lang_data_in_block): Remove.
+       (free_lang_data_in_decl): Do not touch DECL_CONTEXT of non-PARM_DECLs.
+       Do not touch the BLOCK tree.
+       * expr.c (expand_expr_real_1): Allow externals.
+
+2010-10-08  Richard Guenther  <rguenther@suse.de>
+
        * lto-streamer-out.c (lto_output_ts_block_tree_pointers):
        Do not output BLOCK_SUBBLOCKS.
        * lto-streamer-in.c (lto_input_ts_block_tree_pointers):
index 51483f9..291b79f 100644 (file)
@@ -8448,6 +8448,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       gcc_assert (!context
                  || context == current_function_decl
                  || TREE_STATIC (exp)
+                 || DECL_EXTERNAL (exp)
                  /* ??? C++ creates functions that are not TREE_STATIC.  */
                  || TREE_CODE (exp) == FUNCTION_DECL);
 
index 8061fe3..fb27e63 100644 (file)
@@ -1915,6 +1915,13 @@ lto_input_ts_decl_minimal_tree_pointers (struct lto_input_block *ib,
 {
   DECL_NAME (expr) = lto_input_tree (ib, data_in);
   DECL_CONTEXT (expr) = lto_input_tree (ib, data_in);
+  /* We do not stream BLOCK_VARS but lazily construct it here.  */
+  if (DECL_CONTEXT (expr)
+      && TREE_CODE (DECL_CONTEXT (expr)) == BLOCK)
+    {
+      TREE_CHAIN (expr) = BLOCK_VARS (DECL_CONTEXT (expr));
+      BLOCK_VARS (DECL_CONTEXT (expr)) = expr;
+    }
   DECL_SOURCE_LOCATION (expr) = lto_input_location (ib, data_in);
 }
 
@@ -2136,7 +2143,8 @@ lto_input_ts_block_tree_pointers (struct lto_input_block *ib,
   unsigned i, len;
 
   BLOCK_SOURCE_LOCATION (expr) = lto_input_location (ib, data_in);
-  BLOCK_VARS (expr) = lto_input_chain (ib, data_in);
+  /* We do not stream BLOCK_VARS but lazily construct it when reading
+     in decls.  */
 
   len = lto_input_uleb128 (ib);
   if (len > 0)
index 0ece96b..42e37fa 100644 (file)
@@ -1055,11 +1055,15 @@ lto_output_ts_block_tree_pointers (struct output_block *ob, tree expr,
   tree t;
 
   lto_output_location (ob, BLOCK_SOURCE_LOCATION (expr));
-  lto_output_chain (ob, BLOCK_VARS (expr), ref_p);
+  /* We do not stream BLOCK_VARS but lazily construct it when reading
+     in decls.  */
 
   output_uleb128 (ob, VEC_length (tree, BLOCK_NONLOCALIZED_VARS (expr)));
   FOR_EACH_VEC_ELT (tree, BLOCK_NONLOCALIZED_VARS (expr), i, t)
-    lto_output_tree_or_ref (ob, t, ref_p);
+    {
+      gcc_assert (DECL_CONTEXT (t) != expr);
+      lto_output_tree_or_ref (ob, t, ref_p);
+    }
 
   lto_output_tree_or_ref (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
   lto_output_tree_or_ref (ob, BLOCK_ABSTRACT_ORIGIN (expr), ref_p);
index 4b3f6e6..d068a7e 100644 (file)
@@ -4443,29 +4443,6 @@ need_assembler_name_p (tree decl)
 }
 
 
-/* Remove all the non-variable decls from BLOCK.  LOCALS is the set of
-   variables in DECL_STRUCT_FUNCTION (FN)->local_decls.  Every decl
-   in BLOCK that is not in LOCALS is removed.  */
-
-static void
-free_lang_data_in_block (tree fn, tree block, struct pointer_set_t *locals)
-{
-  tree *tp, t;
-
-  tp = &BLOCK_VARS (block);
-  while (*tp)
-    {
-      if (!pointer_set_contains (locals, *tp))
-       *tp = TREE_CHAIN (*tp);
-      else
-       tp = &TREE_CHAIN (*tp);
-    }
-
-  for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
-    free_lang_data_in_block (fn, t, locals);
-}
-
-
 /* Reset all language specific information still present in symbol
    DECL.  */
 
@@ -4489,16 +4466,6 @@ free_lang_data_in_decl (tree decl)
   if (DECL_NAME (decl))
     TREE_TYPE (DECL_NAME (decl)) = NULL_TREE;
 
-  /* Ignore any intervening types, because we are going to clear their
-     TYPE_CONTEXT fields.  */
-  if (TREE_CODE (decl) != FIELD_DECL
-      && TREE_CODE (decl) != FUNCTION_DECL)
-    DECL_CONTEXT (decl) = decl_function_context (decl);
-
-  if (DECL_CONTEXT (decl)
-      && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
-    DECL_CONTEXT (decl) = NULL_TREE;
-
  if (TREE_CODE (decl) == VAR_DECL)
    {
      tree context = DECL_CONTEXT (decl);
@@ -4512,9 +4479,6 @@ free_lang_data_in_decl (tree decl)
                all vars to global ones.  */
             DECL_INITIAL (decl) = NULL_TREE;
           }
-
-        if (TREE_STATIC (decl))
-          DECL_CONTEXT (decl) = NULL_TREE;
        }
    }
 
@@ -4533,8 +4497,6 @@ free_lang_data_in_decl (tree decl)
       if (gimple_has_body_p (decl))
        {
          tree t;
-         unsigned ix;
-         struct pointer_set_t *locals;
 
          /* If DECL has a gimple body, then the context for its
             arguments must be DECL.  Otherwise, it doesn't really
@@ -4547,22 +4509,6 @@ free_lang_data_in_decl (tree decl)
             the PARM_DECL will be used in the function's body).  */
          for (t = DECL_ARGUMENTS (decl); t; t = TREE_CHAIN (t))
            DECL_CONTEXT (t) = decl;
-
-         /* Collect all the symbols declared in DECL.  */
-         locals = pointer_set_create ();
-         FOR_EACH_LOCAL_DECL (DECL_STRUCT_FUNCTION (decl), ix, t)
-           {
-             pointer_set_insert (locals, t);
-
-             /* All the local symbols should have DECL as their
-                context.  */
-             DECL_CONTEXT (t) = decl;
-           }
-
-         /* Get rid of any decl not in local_decls.  */
-         free_lang_data_in_block (decl, DECL_INITIAL (decl), locals);
-
-         pointer_set_destroy (locals);
        }
 
       /* DECL_SAVED_TREE holds the GENERIC representation for DECL.
@@ -4576,15 +4522,7 @@ free_lang_data_in_decl (tree decl)
        DECL_INITIAL (decl) = NULL_TREE;
     }
   else if (TREE_CODE (decl) == TYPE_DECL)
-    {
-      DECL_INITIAL (decl) = NULL_TREE;
-
-      /* DECL_CONTEXT is overloaded as DECL_FIELD_CONTEXT for
-        FIELD_DECLs, which should be preserved.  Otherwise,
-        we shouldn't be concerned with source-level lexical
-        nesting beyond this point. */
-      DECL_CONTEXT (decl) = NULL_TREE;
-    }
+    DECL_INITIAL (decl) = NULL_TREE;
 }