Commit bd39cb52 by Richard Guenther Committed by Richard Biener

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
parent 8686c474
2010-10-08 Richard Guenther <rguenther@suse.de> 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): * lto-streamer-out.c (lto_output_ts_block_tree_pointers):
Do not output BLOCK_SUBBLOCKS. Do not output BLOCK_SUBBLOCKS.
* lto-streamer-in.c (lto_input_ts_block_tree_pointers): * lto-streamer-in.c (lto_input_ts_block_tree_pointers):
...@@ -8448,6 +8448,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, ...@@ -8448,6 +8448,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
gcc_assert (!context gcc_assert (!context
|| context == current_function_decl || context == current_function_decl
|| TREE_STATIC (exp) || TREE_STATIC (exp)
|| DECL_EXTERNAL (exp)
/* ??? C++ creates functions that are not TREE_STATIC. */ /* ??? C++ creates functions that are not TREE_STATIC. */
|| TREE_CODE (exp) == FUNCTION_DECL); || TREE_CODE (exp) == FUNCTION_DECL);
......
...@@ -1915,6 +1915,13 @@ lto_input_ts_decl_minimal_tree_pointers (struct lto_input_block *ib, ...@@ -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_NAME (expr) = lto_input_tree (ib, data_in);
DECL_CONTEXT (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); 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, ...@@ -2136,7 +2143,8 @@ lto_input_ts_block_tree_pointers (struct lto_input_block *ib,
unsigned i, len; unsigned i, len;
BLOCK_SOURCE_LOCATION (expr) = lto_input_location (ib, data_in); 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); len = lto_input_uleb128 (ib);
if (len > 0) if (len > 0)
......
...@@ -1055,11 +1055,15 @@ lto_output_ts_block_tree_pointers (struct output_block *ob, tree expr, ...@@ -1055,11 +1055,15 @@ lto_output_ts_block_tree_pointers (struct output_block *ob, tree expr,
tree t; tree t;
lto_output_location (ob, BLOCK_SOURCE_LOCATION (expr)); 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))); output_uleb128 (ob, VEC_length (tree, BLOCK_NONLOCALIZED_VARS (expr)));
FOR_EACH_VEC_ELT (tree, BLOCK_NONLOCALIZED_VARS (expr), i, t) 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_SUPERCONTEXT (expr), ref_p);
lto_output_tree_or_ref (ob, BLOCK_ABSTRACT_ORIGIN (expr), ref_p); lto_output_tree_or_ref (ob, BLOCK_ABSTRACT_ORIGIN (expr), ref_p);
......
...@@ -4443,29 +4443,6 @@ need_assembler_name_p (tree decl) ...@@ -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 /* Reset all language specific information still present in symbol
DECL. */ DECL. */
...@@ -4489,16 +4466,6 @@ free_lang_data_in_decl (tree decl) ...@@ -4489,16 +4466,6 @@ free_lang_data_in_decl (tree decl)
if (DECL_NAME (decl)) if (DECL_NAME (decl))
TREE_TYPE (DECL_NAME (decl)) = NULL_TREE; 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) if (TREE_CODE (decl) == VAR_DECL)
{ {
tree context = DECL_CONTEXT (decl); tree context = DECL_CONTEXT (decl);
...@@ -4512,9 +4479,6 @@ free_lang_data_in_decl (tree decl) ...@@ -4512,9 +4479,6 @@ free_lang_data_in_decl (tree decl)
all vars to global ones. */ all vars to global ones. */
DECL_INITIAL (decl) = NULL_TREE; 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) ...@@ -4533,8 +4497,6 @@ free_lang_data_in_decl (tree decl)
if (gimple_has_body_p (decl)) if (gimple_has_body_p (decl))
{ {
tree t; tree t;
unsigned ix;
struct pointer_set_t *locals;
/* If DECL has a gimple body, then the context for its /* If DECL has a gimple body, then the context for its
arguments must be DECL. Otherwise, it doesn't really arguments must be DECL. Otherwise, it doesn't really
...@@ -4547,22 +4509,6 @@ free_lang_data_in_decl (tree decl) ...@@ -4547,22 +4509,6 @@ free_lang_data_in_decl (tree decl)
the PARM_DECL will be used in the function's body). */ the PARM_DECL will be used in the function's body). */
for (t = DECL_ARGUMENTS (decl); t; t = TREE_CHAIN (t)) for (t = DECL_ARGUMENTS (decl); t; t = TREE_CHAIN (t))
DECL_CONTEXT (t) = decl; 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. /* DECL_SAVED_TREE holds the GENERIC representation for DECL.
...@@ -4576,15 +4522,7 @@ free_lang_data_in_decl (tree decl) ...@@ -4576,15 +4522,7 @@ free_lang_data_in_decl (tree decl)
DECL_INITIAL (decl) = NULL_TREE; DECL_INITIAL (decl) = NULL_TREE;
} }
else if (TREE_CODE (decl) == TYPE_DECL) else if (TREE_CODE (decl) == TYPE_DECL)
{ DECL_INITIAL (decl) = NULL_TREE;
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;
}
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment