# Copyright (C) 2013-2023 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 performance of GDB when it analyzes the
# function prologue.
# There is one parameter in this test:
# - SKIP_PROLOGUE_COUNT is the number that GDB inserts breakpoints on
#   function f1 and f2 and removes them.

load_lib perftest.exp

require allow_perf_tests

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

# make check-perf RUNTESTFLAGS='skip-prologue.exp SKIP_PROLOGUE_COUNT=500'
if ![info exists SKIP_PROLOGUE_COUNT] {
    set SKIP_PROLOGUE_COUNT 500
}

PerfTest::assemble {
    global srcdir subdir srcfile binfile

    if [info exists COMPILE] {
	set opts {debug}
    } else {
	set opts {nodebug}
    }

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

    return 0
} {
    global binfile
    global gdb_prompt

    clean_restart $binfile

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

    gdb_test_python_run "SkipPrologue\($SKIP_PROLOGUE_COUNT\)" "run"
    return 0
}
