diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2014-10-14 21:04:05 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2014-10-14 21:04:05 +0000 |
commit | 5940e204bd31aacbdb3cbb2660483f18ce750593 (patch) | |
tree | a0f65c6a010558c61c5b8218e7f5ab8016603f9e /gcc/tree-eh.c | |
parent | 9edc6e4cf97d207b3c0e12096cc1e733d36a81e1 (diff) | |
download | gcc-5940e204bd31aacbdb3cbb2660483f18ce750593.zip gcc-5940e204bd31aacbdb3cbb2660483f18ce750593.tar.gz gcc-5940e204bd31aacbdb3cbb2660483f18ce750593.tar.bz2 |
re PR ada/62019 (gnat.dg/weak2.adb fails everywhere)
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
Diffstat (limited to 'gcc/tree-eh.c')
-rw-r--r-- | gcc/tree-eh.c | 26 |
1 files changed, 10 insertions, 16 deletions
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; |