/*
   Copyright 2009, 2010, 2011 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/* Compile with "gcc -nostdlib dw2-restore.S" */

	.text
	.globl _start
	.func	_start
_start:	call foo
	mov $0,%rax
	ret
	.endfunc

	.func	foo
foo:	.cfi_startproc
	push %rbp
	.cfi_adjust_cfa_offset 8
	mov %rsp,%rbp
	.cfi_def_cfa_register %rbp

	.cfi_remember_state
	jmp 2f
	
1:	mov %rbp,%rsp
	.cfi_restore %rbp
	pop %rbp
	.cfi_adjust_cfa_offset -8
	.cfi_def_cfa_register %rsp
	ret

	.cfi_restore_state
2: 	movq $0,%rax
	movq $0,(%rax)  /* crash here */
	jmp 1b
	.cfi_endproc
	.endfunc
