Commit 625f802c by Jan Hubicka Committed by Michael Meissner

Fix 41626 from Jan Hubicka

From-SVN: r152569
parent 007a178c
2009-10-08 Jan Hubicka <jh@suse.cz>
PR middle-end/41626
* cgraphbuild.c (record_reference): When parameter DATA is NULL,
do not mark cgraph nodes as needed.
(record_references_in_initializer): Add new only_vars parameter.
* cgraph.h (record_references_in_initializer): New parameter.
* varasm.c (assemble_variable): Update call.
* varpool.c (varpool_analyze_pending_decls): Always look for
referenced vars.
2009-10-08 Anatoly Sokolov <aesok@post.ru> 2009-10-08 Anatoly Sokolov <aesok@post.ru>
* config/avr/avr.c (last_insn_address) Remove variable. * config/avr/avr.c (last_insn_address) Remove variable.
...@@ -459,7 +459,7 @@ struct cgraph_node *cgraph_function_versioning (struct cgraph_node *, ...@@ -459,7 +459,7 @@ struct cgraph_node *cgraph_function_versioning (struct cgraph_node *,
bitmap); bitmap);
void tree_function_versioning (tree, tree, VEC (ipa_replace_map_p,gc)*, bool, bitmap); void tree_function_versioning (tree, tree, VEC (ipa_replace_map_p,gc)*, bool, bitmap);
struct cgraph_node *save_inline_function_body (struct cgraph_node *); struct cgraph_node *save_inline_function_body (struct cgraph_node *);
void record_references_in_initializer (tree); void record_references_in_initializer (tree, bool);
bool cgraph_process_new_functions (void); bool cgraph_process_new_functions (void);
bool cgraph_decide_is_function_needed (struct cgraph_node *, tree); bool cgraph_decide_is_function_needed (struct cgraph_node *, tree);
......
...@@ -33,13 +33,16 @@ along with GCC; see the file COPYING3. If not see ...@@ -33,13 +33,16 @@ along with GCC; see the file COPYING3. If not see
#include "tree-pass.h" #include "tree-pass.h"
/* Walk tree and record all calls and references to functions/variables. /* Walk tree and record all calls and references to functions/variables.
Called via walk_tree: TP is pointer to tree to be examined. */ Called via walk_tree: TP is pointer to tree to be examined.
When DATA is non-null, record references to callgraph.
*/
static tree static tree
record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) record_reference (tree *tp, int *walk_subtrees, void *data)
{ {
tree t = *tp; tree t = *tp;
tree decl; tree decl;
bool do_callgraph = data != NULL;
switch (TREE_CODE (t)) switch (TREE_CODE (t))
{ {
...@@ -57,7 +60,7 @@ record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) ...@@ -57,7 +60,7 @@ record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
/* Record dereferences to the functions. This makes the /* Record dereferences to the functions. This makes the
functions reachable unconditionally. */ functions reachable unconditionally. */
decl = TREE_OPERAND (*tp, 0); decl = TREE_OPERAND (*tp, 0);
if (TREE_CODE (decl) == FUNCTION_DECL) if (TREE_CODE (decl) == FUNCTION_DECL && do_callgraph)
cgraph_mark_address_taken_node (cgraph_node (decl)); cgraph_mark_address_taken_node (cgraph_node (decl));
break; break;
...@@ -218,13 +221,15 @@ struct gimple_opt_pass pass_build_cgraph_edges = ...@@ -218,13 +221,15 @@ struct gimple_opt_pass pass_build_cgraph_edges =
}; };
/* Record references to functions and other variables present in the /* Record references to functions and other variables present in the
initial value of DECL, a variable. */ initial value of DECL, a variable.
When ONLY_VARS is true, we mark needed only variables, not functions. */
void void
record_references_in_initializer (tree decl) record_references_in_initializer (tree decl, bool only_vars)
{ {
struct pointer_set_t *visited_nodes = pointer_set_create (); struct pointer_set_t *visited_nodes = pointer_set_create ();
walk_tree (&DECL_INITIAL (decl), record_reference, NULL, visited_nodes); walk_tree (&DECL_INITIAL (decl), record_reference,
only_vars ? NULL : decl, visited_nodes);
pointer_set_destroy (visited_nodes); pointer_set_destroy (visited_nodes);
} }
......
...@@ -2082,7 +2082,7 @@ assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED, ...@@ -2082,7 +2082,7 @@ assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
Without this, if the variable is placed in a Without this, if the variable is placed in a
section-anchored block, the template will only be marked section-anchored block, the template will only be marked
when it's too late. */ when it's too late. */
record_references_in_initializer (to); record_references_in_initializer (to, false);
} }
decl = to; decl = to;
......
...@@ -364,10 +364,9 @@ varpool_analyze_pending_decls (void) ...@@ -364,10 +364,9 @@ varpool_analyze_pending_decls (void)
/* Compute the alignment early so function body expanders are /* Compute the alignment early so function body expanders are
already informed about increased alignment. */ already informed about increased alignment. */
align_variable (decl, 0); align_variable (decl, 0);
if (DECL_INITIAL (decl))
record_references_in_initializer (decl);
} }
if (DECL_INITIAL (decl))
record_references_in_initializer (decl, analyzed);
changed = true; changed = true;
} }
timevar_pop (TV_CGRAPH); timevar_pop (TV_CGRAPH);
......
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