aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-03-28 03:23:52 -0800
committerRichard Henderson <rth@gcc.gnu.org>2001-03-28 03:23:52 -0800
commit1150a84134f2f78250f2628de4080219e1bf4797 (patch)
treeea206c02b500a596882811352820435c87511cc9 /gcc
parent83720594cedb0b10abc4c0e28b8ec71e8a5f999d (diff)
downloadgcc-1150a84134f2f78250f2628de4080219e1bf4797.zip
gcc-1150a84134f2f78250f2628de4080219e1bf4797.tar.gz
gcc-1150a84134f2f78250f2628de4080219e1bf4797.tar.bz2
sparc.c (eligible_for_epilogue_delay): False if current_function_calls_eh_return.
* config/sparc/sparc.c (eligible_for_epilogue_delay): False if current_function_calls_eh_return. (output_function_epilogue): Handle eh_return. * config/sparc/sparc.h (DOESNT_NEED_UNWINDER): Remove. (EH_RETURN_DATA_REGNO): New. (EH_RETURN_STACKADJ_RTX): New. (EH_RETURN_HANDLER_RTX): New. * config/sparc/sparc.md (call/short branch peepholes): Check can_throw_internal instead of in_same_eh_region. From-SVN: r40928
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/sparc/sparc.c18
-rw-r--r--gcc/config/sparc/sparc.h5
-rw-r--r--gcc/config/sparc/sparc.md12
4 files changed, 35 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b6d3eb9..6b66ea6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,15 @@
2001-03-28 Richard Henderson <rth@redhat.com>
+ * config/sparc/sparc.c (eligible_for_epilogue_delay): False if
+ current_function_calls_eh_return.
+ (output_function_epilogue): Handle eh_return.
+ * config/sparc/sparc.h (DOESNT_NEED_UNWINDER): Remove.
+ (EH_RETURN_DATA_REGNO): New.
+ (EH_RETURN_STACKADJ_RTX): New.
+ (EH_RETURN_HANDLER_RTX): New.
+ * config/sparc/sparc.md (call/short branch peepholes): Check
+ can_throw_internal instead of in_same_eh_region.
+
* config/rs6000/rs6000.c (rs6000_stack_info): Allocate space
for eh_return data registers.
(rs6000_emit_prologue): Save eh_return data registers.
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index e485027..9cb4c5c 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -2377,6 +2377,11 @@ eligible_for_epilogue_delay (trial, slot)
if (num_gfregs)
return 0;
+ /* If the function uses __builtin_eh_return, the eh_return machinery
+ occupies the delay slot. */
+ if (current_function_calls_eh_return)
+ return 0;
+
/* In the case of a true leaf function, anything can go into the delay slot.
A delay slot only exists however if the frame size is zero, otherwise
we will put an insn to adjust the stack after the return. */
@@ -3594,8 +3599,17 @@ output_function_epilogue (file, size, leaf_function)
if (! leaf_function)
{
+ if (current_function_calls_eh_return)
+ {
+ if (current_function_epilogue_delay_list)
+ abort ();
+ if (SKIP_CALLERS_UNIMP_P)
+ abort ();
+
+ fputs ("\trestore\n\tretl\n\tadd\t%sp, %g1, %sp\n", file);
+ }
/* If we wound up with things in our delay slot, flush them here. */
- if (current_function_epilogue_delay_list)
+ else if (current_function_epilogue_delay_list)
{
rtx delay = PATTERN (XEXP (current_function_epilogue_delay_list, 0));
@@ -3635,6 +3649,8 @@ output_function_epilogue (file, size, leaf_function)
else
fprintf (file, "\t%s\n\trestore\n", ret);
}
+ else if (current_function_calls_eh_return)
+ abort ();
/* All of the following cases are for leaf functions. */
else if (current_function_epilogue_delay_list)
{
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index cc6b014..9e49ead 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -2235,7 +2235,10 @@ LFLGRET"ID":\n\
bias if present. */
#define INCOMING_FRAME_SP_OFFSET SPARC_STACK_BIAS
-#define DOESNT_NEED_UNWINDER (! TARGET_FLAT)
+/* Describe how we implement __builtin_eh_return. */
+#define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 24 : INVALID_REGNUM)
+#define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, 1) /* %g1 */
+#define EH_RETURN_HANDLER_RTX gen_rtx_REG (Pmode, 31) /* %i7 */
/* Addressing modes, and classification of registers for them. */
diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md
index abfad79..8167af8 100644
--- a/gcc/config/sparc/sparc.md
+++ b/gcc/config/sparc/sparc.md
@@ -9453,8 +9453,7 @@
(clobber (reg:SI 15))])
(set (pc) (label_ref (match_operand 3 "" "")))]
"short_branch (INSN_UID (insn), INSN_UID (operands[3]))
- && in_same_eh_region (insn, operands[3])
- && in_same_eh_region (insn, ins1)"
+ && (USING_SJLJ_EXCEPTIONS || ! can_throw_internal (insn))"
"call\\t%a1, %2\\n\\tadd\\t%%o7, (%l3-.-4), %%o7")
(define_peephole
@@ -9463,8 +9462,7 @@
(clobber (reg:SI 15))])
(set (pc) (label_ref (match_operand 2 "" "")))]
"short_branch (INSN_UID (insn), INSN_UID (operands[2]))
- && in_same_eh_region (insn, operands[2])
- && in_same_eh_region (insn, ins1)"
+ && (USING_SJLJ_EXCEPTIONS || ! can_throw_internal (insn))"
"call\\t%a0, %1\\n\\tadd\\t%%o7, (%l2-.-4), %%o7")
(define_peephole
@@ -9475,8 +9473,7 @@
(set (pc) (label_ref (match_operand 3 "" "")))]
"TARGET_ARCH64
&& short_branch (INSN_UID (insn), INSN_UID (operands[3]))
- && in_same_eh_region (insn, operands[3])
- && in_same_eh_region (insn, ins1)"
+ && (USING_SJLJ_EXCEPTIONS || ! can_throw_internal (insn))"
"call\\t%a1, %2\\n\\tadd\\t%%o7, (%l3-.-4), %%o7")
(define_peephole
@@ -9486,8 +9483,7 @@
(set (pc) (label_ref (match_operand 2 "" "")))]
"TARGET_ARCH64
&& short_branch (INSN_UID (insn), INSN_UID (operands[2]))
- && in_same_eh_region (insn, operands[2])
- && in_same_eh_region (insn, ins1)"
+ && (USING_SJLJ_EXCEPTIONS || ! can_throw_internal (insn))"
"call\\t%a0, %1\\n\\tadd\\t%%o7, (%l2-.-4), %%o7")
(define_expand "prologue"