summaryrefslogtreecommitdiff
path: root/gcc/ipa-reference.c
diff options
context:
space:
mode:
authordberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>2006-01-19 00:28:07 +0000
committerdberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>2006-01-19 00:28:07 +0000
commit2116cc0c7a703ada98fb7703425053d722f42daa (patch)
tree316d8ff0fe2b1de172204faffd748aa6915642e6 /gcc/ipa-reference.c
parenta1df6fbeac215bf9c2a7cd22ff817774dd41e810 (diff)
downloadgcc-2116cc0c7a703ada98fb7703425053d722f42daa.tar.gz
2006-01-18 Daniel Berlin <dberlin@dberlin.org>
* ipa-reference.c (check_operand): Allow FUNCTION_DECL. (look_for_address_of): Ditto. (ipa_init): Walk the function decls. (static_execute): Don't set readonly on FUNCTION_DECL's. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109932 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-reference.c')
-rw-r--r--gcc/ipa-reference.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c
index ec8d3b8e595..fe2f807d3e8 100644
--- a/gcc/ipa-reference.c
+++ b/gcc/ipa-reference.c
@@ -286,7 +286,7 @@ check_operand (ipa_reference_local_vars_info_t local,
{
if (!t) return;
- if ((TREE_CODE (t) == VAR_DECL)
+ if ((TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == FUNCTION_DECL)
&& (has_proper_scope_for_analysis (t)))
{
if (checking_write)
@@ -343,7 +343,7 @@ look_for_address_of (tree t)
if (TREE_CODE (t) == ADDR_EXPR)
{
tree x = get_base_var (t);
- if (TREE_CODE (x) == VAR_DECL)
+ if (TREE_CODE (x) == VAR_DECL || TREE_CODE (x) == FUNCTION_DECL)
if (has_proper_scope_for_analysis (x))
bitmap_set_bit (module_statics_escape, DECL_UID (x));
}
@@ -741,6 +741,7 @@ merge_callee_local_info (struct cgraph_node *target,
static void
ipa_init (void)
{
+ struct cgraph_node *node;
memory_identifier_string = build_string(7, "memory");
reference_vars_to_consider =
@@ -751,6 +752,10 @@ ipa_init (void)
module_statics_written = BITMAP_ALLOC (&ipa_obstack);
all_module_statics = BITMAP_ALLOC (&ipa_obstack);
+ /* This will add NODE->DECL to the splay trees. */
+ for (node = cgraph_nodes; node; node = node->next)
+ has_proper_scope_for_analysis (node->decl);
+
/* There are some shared nodes, in particular the initializers on
static declarations. We do not need to scan them more than once
since all we would be interested in are the addressof
@@ -964,6 +969,11 @@ static_execute (void)
{
tree var = get_static_decl (index);
+ /* Readonly on a function decl is very different from the
+ variable. */
+ if (TREE_CODE (var) == FUNCTION_DECL)
+ continue;
+
/* Ignore variables in named sections - changing TREE_READONLY
changes the section flags, potentially causing conflicts with
other variables in the same named section. */