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;

Reply via email to