aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-10-08 15:21:29 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-10-08 15:21:29 +0000
commitbd39cb5225a1a8b3a7ac15ef7a50231205a64ff8 (patch)
treecd4458364349dd314a008566cb2ca44b9b869fc3
parent8686c474f718468adeaf5663f0ad4e0721ef2ab0 (diff)
downloadgcc-bd39cb5225a1a8b3a7ac15ef7a50231205a64ff8.zip
gcc-bd39cb5225a1a8b3a7ac15ef7a50231205a64ff8.tar.gz
gcc-bd39cb5225a1a8b3a7ac15ef7a50231205a64ff8.tar.bz2
lto-streamer-in.c (lto_input_ts_decl_minimal_tree_pointers): Re-construct BLOCK_VARS.
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. From-SVN: r165191
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/expr.c1
-rw-r--r--gcc/lto-streamer-in.c10
-rw-r--r--gcc/lto-streamer-out.c8
-rw-r--r--gcc/tree.c64
5 files changed, 28 insertions, 66 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f713eff..be4f9f7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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):
diff --git a/gcc/expr.c b/gcc/expr.c
index 51483f9..291b79f 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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);
diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
index 8061fe3..fb27e63 100644
--- a/gcc/lto-streamer-in.c
+++ b/gcc/lto-streamer-in.c
@@ -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)
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index 0ece96b..42e37fa 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -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);
diff --git a/gcc/tree.c b/gcc/tree.c
index 4b3f6e6..d068a7e 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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;
}