# Copyright (C) 2013-2026 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/>.

# This test case is to test the speed of GDB when it is doing single step.
# There is one parameter in this test:
#  - SINGLE_STEP_COUNT is the number of single step GDB performs.

load_lib perftest.exp

require allow_perf_tests

standard_testfile .c
set executable $testfile
set expfile $testfile.exp

# make check-perf RUNTESTFLAGS='single-step.exp SINGLE_STEP_COUNT=300'
if {![info exists SINGLE_STEP_COUNT]} {
    set SINGLE_STEP_COUNT 1000
}

PerfTest::assemble {
    global srcdir subdir srcfile binfile

    if { [gdb_compile "$srcdir/$subdir/$srcfile" ${binfile} executable {debug}] != "" } {
	return -1
    }
    return 0
} {
    global binfile
    clean_restart $::testfile

    if ![runto_main] {
	return -1
    }
    return 0
} {
    global SINGLE_STEP_COUNT

    gdb_test_python_run "SingleStep\(${SINGLE_STEP_COUNT}\)"
    # Terminate the loop.
    gdb_test "set variable flag = 0"
    return 0
}
