diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree-eh.c | 26 |
2 files changed, 17 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6839a5e..2ba494a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index d803253..6cfdcce 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -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; |