# Copyright 2008-2020 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/>.

#
# Test support for stepping over longjmp.
#


standard_testfile .c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
     untested "failed to compile"
     return -1
}

if [get_compiler_info] {
    return -1
}

clean_restart ${binfile}

if ![runto_main] then {
   fail "can't run to main"
   return 0
}

set bp_miss_step_1 [gdb_get_line_number "miss_step_1"]
set bp_miss_step_2 [gdb_get_line_number "miss_step_2"]

set bp_start_test_1 [gdb_get_line_number "patt1"]
set bp_start_test_2 [gdb_get_line_number "patt2"]
set bp_start_test_3 [gdb_get_line_number "patt3"]

#
# Pattern 1 - simple longjmp.
#

delete_breakpoints

gdb_test "break $bp_start_test_1" \
    "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_1.*" \
    "breakpoint at pattern 1 start"
gdb_test "continue" "patt1.*" "continue to breakpoint at pattern 1 start"

# set safe-net break
gdb_test "break $bp_miss_step_1" \
    "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_1.*" \
    "breakpoint at miss_step_1"

gdb_test "next" "longjmps\\+\\+;.*" "next over setjmp (1)"
gdb_test "next" "longjmp \\(env, 1\\);.*" "next to longjmp (1)"

set msg "next over longjmp(1)"
gdb_test_multiple "next" $msg {
    -re ".*patt1.*$gdb_prompt $" {
	pass $msg
	gdb_test "next" "resumes\\+\\+.*" "next into else block (1)"
	gdb_test "next" "miss_step_1.*" "next into safety net (1)"
    }
    -re "miss_step_1.*$gdb_prompt $" {
	fail $msg
    }
}

#
# Pattern 2 - longjmp from an inner function.
#

delete_breakpoints

gdb_test "break $bp_start_test_2" \
    "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_2.*" \
    "breakpoint at pattern 2 start"
gdb_test "continue" "patt2.*" "continue to breakpoint at pattern 2 start"

# set safe-net break
gdb_test "break $bp_miss_step_2" \
    "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_2.*" \
    "breakpoint at miss_step_2"

gdb_test "next" "call_longjmp.*" "next over setjmp (2)"

set msg "next over call_longjmp (2)"
gdb_test_multiple "next" $msg {
    -re ".*patt2.*$gdb_prompt $" {
	pass $msg

	gdb_test "next" "resumes\\+\\+.*" "next into else block (2)"
	gdb_test "next" "miss_step_2.*" "next into safety net (2)"
    }
    -re "miss_step_2.*$gdb_prompt $" {
	fail $msg
    }
}

#
# Pattern 3 - setjmp/longjmp inside stepped-over function.
#

delete_breakpoints

gdb_test "break $bp_start_test_3" \
    "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_3.*" \
    "breakpoint at pattern 3 start"
gdb_test "continue" "patt3.*" "continue to breakpoint at pattern 3 start"

gdb_test "next" "longjmp caught.*" "next over patt3"
