OSDN Git Service

PR tree-optimization/49618
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 Jul 2011 18:43:04 +0000 (18:43 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 Jul 2011 18:43:04 +0000 (18:43 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@175884 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-eh.c

index 184ea83..d4d1c48 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 5831d34..f10d72d 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: