From 1b448af3491b387007237149ebb6bef85b8d0f75 Mon Sep 17 00:00:00 2001 From: hainque Date: Mon, 22 Jun 2009 09:08:58 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@148780 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/config/pa/pa.c | 7 +++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gnat.dg/handle_and_return.adb | 21 +++++++++++++++++++++ gcc/testsuite/gnat.dg/raise_ce.adb | 4 ++++ 5 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/handle_and_return.adb create mode 100644 gcc/testsuite/gnat.dg/raise_ce.adb 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 + + * 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 * 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 + + * gnat.dg/raise_ce.adb: Helper for ... + * gnat.dg/handle_and_return.adb: New test. + 2009-06-22 Paul Thomas 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; -- 2.7.4