Hi!

Before http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=168951
set_mem_attributes_minus_bitpos would set MEM_NOTRAP_P for decls
based on whether they are DECL_WEAK or not, but now it is set only
from !tree_could_trap_p.

These patches adjust tree_could_trap_p to say that references
to weak vars/functions may trap (for calls it was doing that already).

The first version of the patch is intended for 4.7 and only handles
that way weak vars/functions that aren't known to be defined somewhere
(either in current CU, or in the CUs included in -flto build).
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

The second version is simplified one which always treats DECL_WEAK
vars as maybe trapping.  Ok for 4.6?

        Jakub
2011-07-04  Jakub Jelinek  <ja...@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.

--- gcc/tree-eh.c.jj    2011-06-17 11:02:19.000000000 +0200
+++ gcc/tree-eh.c       2011-07-04 14:27:01.000000000 +0200
@@ -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:
2011-07-04  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/49618
        * tree-eh.c (tree_could_trap_p) <case FUNCTION_DECL, case VAR_DECL>:
        For DECL_WEAK decls return true.

--- gcc/tree-eh.c.jj    2011-05-11 17:01:05.000000000 +0200
+++ gcc/tree-eh.c       2011-07-04 14:32:54.000000000 +0200
@@ -2459,6 +2459,13 @@ tree_could_trap_p (tree expr)
        return true;
       return false;
 
+    case VAR_DECL:
+    case FUNCTION_DECL:
+      /* Assume that accesses to weak vars or functions may trap.  */
+      if (DECL_WEAK (expr))
+        return true;
+      return false;
+
     default:
       return false;
     }

Reply via email to