aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2009-10-08 20:52:57 +0200
committerMichael Meissner <meissner@gcc.gnu.org>2009-10-08 18:52:57 +0000
commit625f802cafd00f2a6933d7f85ff6f284237096e9 (patch)
tree36dfcd47579c82b5abe65af64b2523a5a00a1900 /gcc
parent007a178cff07dc03e9df0cc0798d5077dbd9a944 (diff)
downloadgcc-625f802cafd00f2a6933d7f85ff6f284237096e9.zip
gcc-625f802cafd00f2a6933d7f85ff6f284237096e9.tar.gz
gcc-625f802cafd00f2a6933d7f85ff6f284237096e9.tar.bz2
Fix 41626 from Jan Hubicka
From-SVN: r152569
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/cgraph.h2
-rw-r--r--gcc/cgraphbuild.c17
-rw-r--r--gcc/varasm.c2
-rw-r--r--gcc/varpool.c5
5 files changed, 26 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c128a74..14eca8e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+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>
* config/avr/avr.c (last_insn_address) Remove variable.
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index 438cd1e..016ce9d 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -459,7 +459,7 @@ struct cgraph_node *cgraph_function_versioning (struct cgraph_node *,
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 *);
-void record_references_in_initializer (tree);
+void record_references_in_initializer (tree, bool);
bool cgraph_process_new_functions (void);
bool cgraph_decide_is_function_needed (struct cgraph_node *, tree);
diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c
index d61def2..65e3d67 100644
--- a/gcc/cgraphbuild.c
+++ b/gcc/cgraphbuild.c
@@ -33,13 +33,16 @@ along with GCC; see the file COPYING3. If not see
#include "tree-pass.h"
/* 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
-record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
+record_reference (tree *tp, int *walk_subtrees, void *data)
{
tree t = *tp;
tree decl;
+ bool do_callgraph = data != NULL;
switch (TREE_CODE (t))
{
@@ -57,7 +60,7 @@ record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
/* Record dereferences to the functions. This makes the
functions reachable unconditionally. */
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));
break;
@@ -218,13 +221,15 @@ struct gimple_opt_pass pass_build_cgraph_edges =
};
/* 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
-record_references_in_initializer (tree decl)
+record_references_in_initializer (tree decl, bool only_vars)
{
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);
}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 46ec00d..4c0b9a6 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -2082,7 +2082,7 @@ assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
Without this, if the variable is placed in a
section-anchored block, the template will only be marked
when it's too late. */
- record_references_in_initializer (to);
+ record_references_in_initializer (to, false);
}
decl = to;
diff --git a/gcc/varpool.c b/gcc/varpool.c
index f7b338f..8815efd 100644
--- a/gcc/varpool.c
+++ b/gcc/varpool.c
@@ -364,10 +364,9 @@ varpool_analyze_pending_decls (void)
/* Compute the alignment early so function body expanders are
already informed about increased alignment. */
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;
}
timevar_pop (TV_CGRAPH);