re PR tree-optimization/47056 (10 Ada ACATS tests fail to link with undefined referen...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 4 Jan 2011 23:22:31 +0000 (23:22 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 4 Jan 2011 23:22:31 +0000 (23:22 +0000)
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

gcc/ChangeLog
gcc/cgraphbuild.c

index 0b7a977a35723297a1e34ea43486f748ba63b8c1..01412bd09614389b69a035716b4177f02af5779d 100644 (file)
@@ -1,3 +1,10 @@
+2011-01-04  Eric Botcazou  <ebotcazou@adacore.com>
+
+       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.
+
 2011-01-04  Eric Botcazou  <ebotcazou@adacore.com>
 
        * dwarf2out.c (rtl_for_decl_init): Strip no-op conversions off the
index 7ae0e1a33c394bc8d77a3266f9cbc7012654a13a..7bfeac78581d97f96f5a5a749b03989c12f65fd2 100644 (file)
@@ -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;
 }