aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-10-07 13:53:21 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-10-07 13:53:21 -0700
commit9a1ba437e83c401c742656a9b3dc6debf816409f (patch)
treee6c9280ad9279c2c012c17a733ade27da717cd96 /gcc
parent9ab916b8ed43541ad87ded43671f473671370b0b (diff)
downloadgcc-9a1ba437e83c401c742656a9b3dc6debf816409f.zip
gcc-9a1ba437e83c401c742656a9b3dc6debf816409f.tar.gz
gcc-9a1ba437e83c401c742656a9b3dc6debf816409f.tar.bz2
calls.c (expand_call): Disallow sibcalls to noreturn functions.
* calls.c (expand_call): Disallow sibcalls to noreturn functions. * flow.c (make_edges): Revert last change. * config/alpha/alpha.h (FUNCTION_OK_FOR_SIBCALL): Don't test TREE_THIS_VOLATILE. * config/pa/pa.h (FUNCTION_OK_FOR_SIBCALL): Likewise. From-SVN: r36781
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/calls.c1
-rw-r--r--gcc/config/alpha/alpha.h3
-rw-r--r--gcc/config/pa/pa.h3
-rw-r--r--gcc/flow.c10
5 files changed, 15 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fea8809..b4a53e9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2000-10-07 Richard Henderson <rth@cygnus.com>
+
+ * calls.c (expand_call): Disallow sibcalls to noreturn functions.
+ * flow.c (make_edges): Revert last change.
+
+ * config/alpha/alpha.h (FUNCTION_OK_FOR_SIBCALL): Don't test
+ TREE_THIS_VOLATILE.
+ * config/pa/pa.h (FUNCTION_OK_FOR_SIBCALL): Likewise.
+
2000-10-06 David O'Brien <obrien@dragon.nuxi.com>
* config/alpha/elf.h: Standardize the formatting.
diff --git a/gcc/calls.c b/gcc/calls.c
index 2163e51..775d03d 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -2463,6 +2463,7 @@ expand_call (exp, target, ignore)
before the sibcall_epilogue. */
|| fndecl == NULL_TREE
|| (flags & (ECF_RETURNS_TWICE | ECF_LONGJMP))
+ || TREE_THIS_VOLATILE (fndecl)
|| !FUNCTION_OK_FOR_SIBCALL (fndecl)
/* If this function requires more stack slots than the current
function, we cannot change it into a sibling call. */
diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h
index 74b98e4..21d23bb 100644
--- a/gcc/config/alpha/alpha.h
+++ b/gcc/config/alpha/alpha.h
@@ -1187,8 +1187,7 @@ extern int alpha_memory_latency;
#define FUNCTION_OK_FOR_SIBCALL(DECL) \
(DECL \
&& ((TREE_ASM_WRITTEN (DECL) && !flag_pic) \
- || ! TREE_PUBLIC (DECL) \
- || (0 && TREE_THIS_VOLATILE (DECL))))
+ || ! TREE_PUBLIC (DECL)))
/* Try to output insns to set TARGET equal to the constant C if it can be
done in less than N insns. Do all computations in MODE. Returns the place
diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h
index feb531b..3d26e04 100644
--- a/gcc/config/pa/pa.h
+++ b/gcc/config/pa/pa.h
@@ -2014,8 +2014,7 @@ while (0)
#define FUNCTION_OK_FOR_SIBCALL(DECL) \
(DECL \
&& ! TARGET_64BIT \
- && (! TREE_PUBLIC (DECL) \
- || TREE_THIS_VOLATILE (DECL)))
+ && ! TREE_PUBLIC (DECL))
#define PREDICATE_CODES \
{"reg_or_0_operand", {SUBREG, REG, CONST_INT}}, \
diff --git a/gcc/flow.c b/gcc/flow.c
index 52eed8d..0cb8428 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -1152,12 +1152,8 @@ make_edges (label_value_list)
wouldn't have created the sibling call in the first place. */
if (code == CALL_INSN && SIBLING_CALL_P (insn))
- {
- if (! find_reg_note (insn, REG_NORETURN, NULL_RTX))
- make_edge (edge_cache, bb, EXIT_BLOCK_PTR,
- EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
- }
- else
+ make_edge (edge_cache, bb, EXIT_BLOCK_PTR,
+ EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
/* If this is a CALL_INSN, then mark it as reaching the active EH
handler for this CALL_INSN. If we're handling asynchronous
@@ -1165,7 +1161,7 @@ make_edges (label_value_list)
Also mark the CALL_INSN as reaching any nonlocal goto handler. */
- if (code == CALL_INSN || asynchronous_exceptions)
+ else if (code == CALL_INSN || asynchronous_exceptions)
{
/* Add any appropriate EH edges. We do this unconditionally
since there may be a REG_EH_REGION or REG_EH_RETHROW note