From bd39cb5225a1a8b3a7ac15ef7a50231205a64ff8 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 8 Oct 2010 15:21:29 +0000 Subject: [PATCH] lto-streamer-in.c (lto_input_ts_decl_minimal_tree_pointers): Re-construct BLOCK_VARS. 2010-10-08 Richard Guenther * 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 --- gcc/ChangeLog | 11 +++++++++ gcc/expr.c | 1 + gcc/lto-streamer-in.c | 10 +++++++- gcc/lto-streamer-out.c | 8 +++++-- gcc/tree.c | 64 +------------------------------------------------- 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 + * 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 + * 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; } -- 2.7.4