re PR ada/62019 (gnat.dg/weak2.adb fails everywhere)
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 14 Oct 2014 21:04:05 +0000 (21:04 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 14 Oct 2014 21:04:05 +0000 (21:04 +0000)
PR ada/62019
* tree-eh.c (tree_could_trap) <FUNCTION_DECL>: Revamp and really
do not choke on null node.
<VAR_DECL>: Likewise.

From-SVN: r216223

gcc/ChangeLog
gcc/tree-eh.c

index 6839a5ec1558060f1977a3cd36346a3b595c7b85..2ba494ac85688fd3efe50ced3637a35e19d26142 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-14  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR ada/62019
+       * tree-eh.c (tree_could_trap) <FUNCTION_DECL>: Revamp and really
+       do not choke on null node.
+       <VAR_DECL>: Likewise.
+
 2014-10-14  DJ Delorie  <dj@redhat.com>
 
        * machmode.h (int_n_data_t): New.
index d8032538c0ab1fae0a8080c588518ca051e035af..6cfdcce6ec974b2aef78e7836e4d999021773675 100644 (file)
@@ -2657,15 +2657,12 @@ tree_could_trap_p (tree expr)
       /* 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) && !DECL_COMDAT (expr))
+      if (DECL_WEAK (expr) && !DECL_COMDAT (expr) && DECL_EXTERNAL (expr))
        {
-         struct cgraph_node *node;
-         if (!DECL_EXTERNAL (expr))
-           return false;
-         node = cgraph_node::get (expr)->function_symbol ();
-         if (node && node->in_other_partition)
-           return false;
-         return true;
+         cgraph_node *node = cgraph_node::get (expr);
+         if (node)
+           node = node->function_symbol ();
+         return !(node && node->in_other_partition);
        }
       return false;
 
@@ -2673,15 +2670,12 @@ tree_could_trap_p (tree expr)
       /* 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) && !DECL_COMDAT (expr))
+      if (DECL_WEAK (expr) && !DECL_COMDAT (expr) && DECL_EXTERNAL (expr))
        {
-         varpool_node *node;
-         if (!DECL_EXTERNAL (expr))
-           return false;
-         node = varpool_node::get (expr)->ultimate_alias_target ();
-         if (node && node->in_other_partition)
-           return false;
-         return true;
+         varpool_node *node = varpool_node::get (expr);
+         if (node)
+           node = node->ultimate_alias_target ();
+         return !(node && node->in_other_partition);
        }
       return false;