# 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 is handling
# the shared libraries of inferior are loaded and unloaded.
# There are two parameters in this test:
#  - SOLIB_COUNT is the number of shared libraries program will load
#    and unload
#  - SOLIB_DLCLOSE_REVERSED_ORDER controls the order of dlclose shared
#    libraries.  If it is set, program dlclose shared libraries in a
#    reversed order of loading.

load_lib perftest.exp

require allow_perf_tests

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

# make check-perf RUNTESTFLAGS='solib.exp SOLIB_COUNT=1024'
if ![info exists SOLIB_COUNT] {
    set SOLIB_COUNT 128
}

PerfTest::assemble {
    global SOLIB_COUNT
    global srcdir subdir srcfile binfile

    for {set i 0} {$i < $SOLIB_COUNT} {incr i} {

	# Produce source files.
	set libname "solib-lib$i"
	set src [standard_output_file $libname.c]
	set exe [standard_output_file $libname]

	gdb_produce_source $src "int shr$i (void) {return 0;}"

	# Compile.
	if { [gdb_compile_shlib $src $exe {debug}] != "" } {
	    return -1
	}

	# Delete object files to save some space.
	file delete [standard_output_file  "solib-lib$i.c.o"]
    }

    set compile_flags {debug shlib_load}
    global SOLIB_DLCLOSE_REVERSED_ORDER

    if [info exists SOLIB_DLCLOSE_REVERSED_ORDER] {
	lappend compile_flags "additional_flags=-DSOLIB_DLCLOSE_REVERSED_ORDER"
    }

    if { [gdb_compile "$srcdir/$subdir/$srcfile" ${binfile} executable  $compile_flags] != "" } {
	return -1
    }

    return 0
} {
    global binfile

    clean_restart $binfile

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

    gdb_test_python_run "SolibLoadUnload\($SOLIB_COUNT\)"
    return 0
}
