aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraphbuild.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2011-01-04 23:22:31 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2011-01-04 23:22:31 +0000
commit3ebb5ca6cc306dd91af6fd129033971a47da6c8c (patch)
tree43ec5b0dbace605297b2fc9ace2c7aace41aeef2 /gcc/cgraphbuild.c
parentc5a62c6fde09060ca31dc302807d1f49fb95eacf (diff)
downloadgcc-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.c25
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;
}