diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2011-01-04 23:22:31 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2011-01-04 23:22:31 +0000 |
commit | 3ebb5ca6cc306dd91af6fd129033971a47da6c8c (patch) | |
tree | 43ec5b0dbace605297b2fc9ace2c7aace41aeef2 /gcc/cgraphbuild.c | |
parent | c5a62c6fde09060ca31dc302807d1f49fb95eacf (diff) | |
download | gcc-3ebb5ca6cc306dd91af6fd129033971a47da6c8c.zip gcc-3ebb5ca6cc306dd91af6fd129033971a47da6c8c.tar.gz gcc-3ebb5ca6cc306dd91af6fd129033971a47da6c8c.tar.bz2 |
re PR tree-optimization/47056 (10 Ada ACATS tests fail to link with undefined reference on ia64-linux)
PR tree-optimization/47056
* cgraphbuild.c (mark_address): Remove ATTRIBUTE_UNUSED markers.
(mark_load): Likewise. Handle FUNCTION_DECL specially.
(mark_store): Likewise. Pass STMT to ipa_record_reference.
From-SVN: r168493
Diffstat (limited to 'gcc/cgraphbuild.c')
-rw-r--r-- | gcc/cgraphbuild.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c index 7ae0e1a..7bfeac7 100644 --- a/gcc/cgraphbuild.c +++ b/gcc/cgraphbuild.c @@ -234,8 +234,7 @@ compute_call_stmt_bb_frequency (tree decl, basic_block bb) /* Mark address taken in STMT. */ static bool -mark_address (gimple stmt ATTRIBUTE_UNUSED, tree addr, - void *data ATTRIBUTE_UNUSED) +mark_address (gimple stmt, tree addr, void *data) { addr = get_base_address (addr); if (TREE_CODE (addr) == FUNCTION_DECL) @@ -268,12 +267,21 @@ mark_address (gimple stmt ATTRIBUTE_UNUSED, tree addr, /* Mark load of T. */ static bool -mark_load (gimple stmt ATTRIBUTE_UNUSED, tree t, - void *data ATTRIBUTE_UNUSED) +mark_load (gimple stmt, tree t, void *data) { t = get_base_address (t); - if (t && TREE_CODE (t) == VAR_DECL - && (TREE_STATIC (t) || DECL_EXTERNAL (t))) + if (t && TREE_CODE (t) == FUNCTION_DECL) + { + /* ??? This can happen on platforms with descriptors when these are + directly manipulated in the code. Pretend that it's an address. */ + struct cgraph_node *node = cgraph_node (t); + cgraph_mark_address_taken_node (node); + ipa_record_reference ((struct cgraph_node *)data, NULL, + node, NULL, + IPA_REF_ADDR, stmt); + } + else if (t && TREE_CODE (t) == VAR_DECL + && (TREE_STATIC (t) || DECL_EXTERNAL (t))) { struct varpool_node *vnode = varpool_node (t); int walk_subtrees; @@ -293,8 +301,7 @@ mark_load (gimple stmt ATTRIBUTE_UNUSED, tree t, /* Mark store of T. */ static bool -mark_store (gimple stmt ATTRIBUTE_UNUSED, tree t, - void *data ATTRIBUTE_UNUSED) +mark_store (gimple stmt, tree t, void *data) { t = get_base_address (t); if (t && TREE_CODE (t) == VAR_DECL @@ -310,7 +317,7 @@ mark_store (gimple stmt ATTRIBUTE_UNUSED, tree t, vnode = vnode->extra_name; ipa_record_reference ((struct cgraph_node *)data, NULL, NULL, vnode, - IPA_REF_STORE, NULL); + IPA_REF_STORE, stmt); } return false; } |