# Copyright (C) 2013-2020 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

if [skip_perf_tests] {
    return 0
}

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] {
	fail "can't run to main"
	return -1
    }
    return 0
} {
    global SOLIB_COUNT

    gdb_test_no_output "python SolibLoadUnload\($SOLIB_COUNT\).run()"
    return 0
}
