re PR tree-optimization/49618 (When building uClibc with GCC 4.6.1 old_atexit is...
authorJakub Jelinek <jakub@redhat.com>
Tue, 5 Jul 2011 18:43:04 +0000 (20:43 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 5 Jul 2011 18:43:04 +0000 (20:43 +0200)
PR tree-optimization/49618
* tree-eh.c (tree_could_trap_p) <case CALL_EXPR>: For DECL_WEAK
t recurse on the decl.
<case FUNCTION_DECL, case VAR_DECL>: For DECL_WEAK decls
return true if expr isn't known to be defined in current
TU or some other LTO partition.

From-SVN: r175884

gcc/ChangeLog
gcc/tree-eh.c

index 184ea83bf118273d77cd8c3b2e977463aa90ecb2..d4d1c48036f17702ea57d5f96ac79a1692ac7179 100644 (file)
@@ -1,3 +1,12 @@
+2011-07-05  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/49618
+       * tree-eh.c (tree_could_trap_p) <case CALL_EXPR>: For DECL_WEAK
+       t recurse on the decl.
+       <case FUNCTION_DECL, case VAR_DECL>: For DECL_WEAK decls
+       return true if expr isn't known to be defined in current
+       TU or some other LTO partition.
+
 2011-07-05  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * params.def (PARAM_CASE_VALUES_THRESHOLD): New parameter to
index 5831d34826c314d5a418ee4572d7f70f3b363d5e..f10d72d1d68ae5fb73de5b6322296af840a2dce8 100644 (file)
@@ -2449,8 +2449,42 @@ tree_could_trap_p (tree expr)
     case CALL_EXPR:
       t = get_callee_fndecl (expr);
       /* Assume that calls to weak functions may trap.  */
-      if (!t || !DECL_P (t) || DECL_WEAK (t))
+      if (!t || !DECL_P (t))
        return true;
+      if (DECL_WEAK (t))
+       return tree_could_trap_p (t);
+      return false;
+
+    case FUNCTION_DECL:
+      /* Assume that accesses to weak functions may trap, unless we know
+        they are certainly defined in current TU or in some other
+        LTO partition.  */
+      if (DECL_WEAK (expr))
+       {
+         struct cgraph_node *node;
+         if (!DECL_EXTERNAL (expr))
+           return false;
+         node = cgraph_function_node (cgraph_get_node (expr), NULL);
+         if (node && node->in_other_partition)
+           return false;
+         return true;
+       }
+      return false;
+
+    case VAR_DECL:
+      /* Assume that accesses to weak vars may trap, unless we know
+        they are certainly defined in current TU or in some other
+        LTO partition.  */
+      if (DECL_WEAK (expr))
+       {
+         struct varpool_node *node;
+         if (!DECL_EXTERNAL (expr))
+           return false;
+         node = varpool_variable_node (varpool_get_node (expr), NULL);
+         if (node && node->in_other_partition)
+           return false;
+         return true;
+       }
       return false;
 
     default: