# Copyright 2008-2021 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 {
   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"
