Index: gcc/reg-notes.def
===================================================================
--- gcc/reg-notes.def	(revision 164490)
+++ gcc/reg-notes.def	(working copy)
@@ -165,6 +165,13 @@ REG_NOTE (CFA_RESTORE)
    to the argument, if it is a MEM, it is ignored.  */
 REG_NOTE (CFA_SET_VDRAP)
 
+/* Temporarily set the CFA for just one insn.  This saves the old
+   state, sets the CFA, and then restores the state after the insn.
+   The pattern for this note is the new CFA value.  This is used by
+   the split stack code to support unwinding through the call into the
+   split stack routine.  */
+REG_NOTE (CFA_TEMPORARY)
+
 /* Indicates that REG holds the exception context for the function.
    This context is shared by inline functions, so the code to acquire
    the real exception context is delayed until after inlining.  */
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 164490)
+++ gcc/dwarf2out.c	(working copy)
@@ -473,6 +473,7 @@ static void output_call_frame_info (int)
 static void dwarf2out_note_section_used (void);
 static bool clobbers_queued_reg_save (const_rtx);
 static void dwarf2out_frame_debug_expr (rtx, const char *);
+static void dwarf2out_frame_debug_remember_state (void);
 
 /* Support for complex CFA locations.  */
 static void output_cfa_loc (dw_cfi_ref);
@@ -2832,6 +2833,17 @@ dwarf2out_frame_debug (rtx insn, bool af
 	handled_one = true;
 	break;
 
+      case REG_CFA_TEMPORARY:
+	if (!after_p)
+	  {
+	    dwarf2out_frame_debug_remember_state ();
+	    dwarf2out_frame_debug_def_cfa (XEXP (note, 0), label);
+	  }
+	else
+	  dwarf2out_frame_debug_restore_state ();
+	handled_one = true;
+	break;
+
       default:
 	break;
       }
@@ -2924,9 +2936,17 @@ dwarf2out_cfi_begin_epilogue (rtx insn)
     }
   emit_note_before (NOTE_INSN_CFA_RESTORE_STATE, i);
 
+  dwarf2out_frame_debug_remember_state ();
+}
+
+/* Remember the current state.  */
+
+static void
+dwarf2out_frame_debug_remember_state (void)
+{
   emit_cfa_remember = true;
 
-  /* And emulate the state save.  */
+  /* Emulate the state save.  */
   gcc_assert (!cfa_remember.in_use);
   cfa_remember = cfa;
   cfa_remember.in_use = 1;
