aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-eh.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2014-10-14 21:04:05 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2014-10-14 21:04:05 +0000
commit5940e204bd31aacbdb3cbb2660483f18ce750593 (patch)
treea0f65c6a010558c61c5b8218e7f5ab8016603f9e /gcc/tree-eh.c
parent9edc6e4cf97d207b3c0e12096cc1e733d36a81e1 (diff)
downloadgcc-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.c26
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;