#   Copyright 2019-2024 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/>.

standard_testfile

set epilogue [have_epilogue_line_info]

if { [prepare_for_testing "failed to prepare" "skip-inline" \
			  {skip-inline.c skip1.c } \
			  {debug nowarnings}] } {
    return -1
}

set srcfile skip-inline.c
set srcfile1 skip1.c

proc_with_prefix single_step { } {
    if ![runto_main] {
	return
    }

    gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
    gdb_test "step" ".*" "step into baz, since foo will be skipped"
    gdb_test "bt" "\\s*\\#0\\s+baz.*" "in the baz, since foo was skipped"
    gdb_step_until ".*x = 0; x = baz \\(foo \\(\\)\\).*"
    gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main"
    gdb_test "step" ".*" "step again into baz, since foo will be skipped"
    gdb_test "bt" "\\s*\\#0\\s+baz.*" "again in the baz"
    gdb_step_until "main \\(\\) at .*" "step back to main, again"
    gdb_test "bt" "\\s*\\#0.*main.*" "again back to main"
}

proc_with_prefix double_step { } {
    if ![runto_main] {
	return
    }

    with_test_prefix "double step" {
	gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
	gdb_test "step 2" ".*" "step into baz, since foo will be skipped"
	gdb_test "bt" "\\s*\\#0\\s+baz.*" "still in the baz"
	gdb_test "step" ".*" "step back to main"
	gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main"
	gdb_test "step 2" ".*" "step again into baz, since foo will be skipped"
	gdb_test "bt" "\\s*\\#0\\s+baz.*" "again in the baz"
	gdb_test "step" ".*" "step back to main, again"
	gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
    }
}

proc_with_prefix triple_step { } {
    if ![runto_main] {
	return
    }

    with_test_prefix "triple step" {
	gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
	gdb_test "step 3" ".*" "step over baz"
	gdb_test "bt" "\\s*\\#0\\s+main.*" "again in the main"
	gdb_test "step 3" ".*" "step over baz, again"
	gdb_test "bt" "\\s*\\#0\\s+main.*" "again back to main"
    }
}

proc_with_prefix skip_current_frame { } {
    if ![runto_main] {
	return
    }

    gdb_test "skip delete" ".*" "skip delete"

    gdb_test "bt" "\\s*\\#0\\s+main.*" "in the main"
    gdb_test "step" ".*" "step into foo"
    gdb_test "bt" "\\s*\\#0\\s+foo.*" "in the foo"
    gdb_test "skip" "Function foo will be skipped when stepping\." "skip"
}

# Create a skiplist entry for a specified file and function.

gdb_test "skip function foo" "Function foo will be skipped when stepping\."

single_step

# Some compilers link the epilogue of functions to the line containing the
# closing brace, while others dont.  The behavior ends up so out of sync
# with multiple steps at a time, that completely different procs would need
# to be made, and it is frankly unnecessary.
if {$epilogue} {
    double_step
    triple_step
}

skip_current_frame
