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
This commit is contained in:
Olivier Hainque 2009-06-22 09:08:58 +00:00 committed by Olivier Hainque
parent 59366db692
commit 2832688098
5 changed files with 40 additions and 2 deletions

View File

@ -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.

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -0,0 +1,4 @@
procedure Raise_CE is
begin
raise Constraint_Error;
end;