This is a regression present on the mainline and 4.7 branch. The attached testcase now fails because the function lacks a stack frame that would yield the unique CFA expected by the unwinder.
Bootstrapped/regtested on PowerPC/Linux, applied on mainline and 4.7 branch. 2012-05-12 Eric Botcazou <ebotca...@adacore.com> * function.c (requires_stack_frame_p): If the function can throw non-call exceptions, return true if the insn can throw internally. 2012-05-12 Eric Botcazou <ebotca...@adacore.com> * gnat.dg/null_pointer_deref3.adb: New test. -- Eric Botcazou
Index: function.c =================================================================== --- function.c (revision 187393) +++ function.c (working copy) @@ -5316,6 +5316,10 @@ requires_stack_frame_p (rtx insn, HARD_R if (CALL_P (insn)) return !SIBLING_CALL_P (insn); + /* We need a frame to get the unique CFA expected by the unwinder. */ + if (cfun->can_throw_non_call_exceptions && can_throw_internal (insn)) + return true; + CLEAR_HARD_REG_SET (hardregs); for (df_rec = DF_INSN_DEFS (insn); *df_rec; df_rec++) {
-- { dg-do run } -- { dg-options "-O -gnatp" } -- This test requires architecture- and OS-specific support code for unwinding -- through signal frames (typically located in *-unwind.h) to pass. Feel free -- to disable it if this code hasn't been implemented yet. procedure Null_Pointer_Deref3 is procedure Leaf is type Int_Ptr is access all Integer; function n return Int_Ptr is begin return null; end; Data : Int_Ptr := n; begin Data.all := 0; end; begin Leaf; exception when others => null; end;