aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@adacore.com>2009-06-22 09:08:58 +0000
committerOlivier Hainque <hainque@gcc.gnu.org>2009-06-22 09:08:58 +0000
commit283268809829d27d5f54909bc3a79e8e54fc48eb (patch)
tree0608f8bdc0b348c96a90ad8cff963d50ce91c87c
parent59366db692450991e990991ac8c369e6cfa9cbe7 (diff)
downloadgcc-283268809829d27d5f54909bc3a79e8e54fc48eb.zip
gcc-283268809829d27d5f54909bc3a79e8e54fc48eb.tar.gz
gcc-283268809829d27d5f54909bc3a79e8e54fc48eb.tar.bz2
pa.c (output_call): Don't optimize post call jumps into return address adjustments if...
* config/pa/pa.c (output_call): Don't optimize post call jumps into return address adjustments if the call may throw. testsuite/ * gnat.dg/raise_ce.adb: Helper for ... * gnat.dg/handle_and_return.adb: New test. From-SVN: r148780
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/pa/pa.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/handle_and_return.adb21
-rw-r--r--gcc/testsuite/gnat.dg/raise_ce.adb4
5 files changed, 40 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 308a1f7..8d17170 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2009-06-22 Olivier Hainque <hainque@adacore.com>
+
+ * config/pa/pa.c (output_call): Don't optimize post call jumps
+ into return address adjustments if the call may throw.
+
2009-06-21 Richard Earnshaw <rearnsha@arm.com>
* arm.c (thumb1_output_casesi): New function.
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index a55f2ec..c8cf714 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -7701,12 +7701,15 @@ output_call (rtx insn, rtx call_dest, int sibcall)
if (!delay_slot_filled && INSN_ADDRESSES_SET_P ())
{
/* See if the return address can be adjusted. Use the containing
- sequence insn's address. */
+ sequence insn's address. This would break the regular call/return@
+ relationship assumed by the table based eh unwinder, so only do that
+ if the call is not possibly throwing. */
rtx seq_insn = NEXT_INSN (PREV_INSN (XVECEXP (final_sequence, 0, 0)));
int distance = (INSN_ADDRESSES (INSN_UID (JUMP_LABEL (NEXT_INSN (insn))))
- INSN_ADDRESSES (INSN_UID (seq_insn)) - 8);
- if (VAL_14_BITS_P (distance))
+ if (VAL_14_BITS_P (distance)
+ && !(can_throw_internal (insn) || can_throw_external (insn)))
{
xoperands[1] = gen_label_rtx ();
output_asm_insn ("ldo %0-%1(%%r2),%%r2", xoperands);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 00dee39..089d9b4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-06-22 Olivier Hainque <hainque@adacore.com>
+
+ * gnat.dg/raise_ce.adb: Helper for ...
+ * gnat.dg/handle_and_return.adb: New test.
+
2009-06-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/40443
diff --git a/gcc/testsuite/gnat.dg/handle_and_return.adb b/gcc/testsuite/gnat.dg/handle_and_return.adb
new file mode 100644
index 0000000..b40dbaf
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/handle_and_return.adb
@@ -0,0 +1,21 @@
+-- { dg-do run }
+-- { dg-options "-gnatp -O2" }
+
+with Raise_Ce;
+
+procedure Handle_And_Return is
+begin
+ begin
+ Raise_CE;
+ return;
+ exception
+ when others => null;
+ end;
+
+ begin
+ Raise_CE;
+ return;
+ exception
+ when others => null;
+ end;
+end;
diff --git a/gcc/testsuite/gnat.dg/raise_ce.adb b/gcc/testsuite/gnat.dg/raise_ce.adb
new file mode 100644
index 0000000..f526bee
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/raise_ce.adb
@@ -0,0 +1,4 @@
+procedure Raise_CE is
+begin
+ raise Constraint_Error;
+end;