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

# Perftest description file for building the "gmonster2" benchmark.
# Where does the name come from?  The benchmark is derived from one of the
# monster programs at Google.
#
# Perftest descriptions are loaded thrice:
# 1) To generate the build .exp files
#    GDB_PERFTEST_MODE=gen-build-exps
#    This step allows for parallel builds of the majority of pieces of the
#    test binary and shlibs.
# 2) To compile the "pieces" of the binary and shlibs.
#    "Pieces" are the bulk of the machine-generated sources of the test.
#    This step is driven by lib/build-piece.exp.
#    GDB_PERFTEST_MODE=build-pieces
# 3) To perform the final link of the binary and shlibs.
#    GDB_PERFTEST_MODE=compile
#
# Example usage:
# bash$ make -j5 build-perf RUNTESTFLAGS="gmonster1.exp gmonster2.exp"
# bash$ make check-perf RUNTESTFLAGS="gdb.perf/gm*-*.exp GDB=/path/to/gdb"

load_lib perftest.exp
load_lib gen-perf-test.exp

if [skip_perf_tests] {
    return 0
}

if ![info exists MONSTER] {
    set MONSTER "n"
}

proc make_testcase_config { } {
    global MONSTER

    set program_name "gmonster2"
    array set testcase [GenPerfTest::init_testcase $program_name]

    set testcase(language) c++

    # *_{sources,headers} need to be embedded in an outer list
    # because remember each element of the outer list is for each run, and
    # here we want to use the same value for all runs.
    set testcase(binary_extra_sources) { { gmonster2.cc gm-hello.cc gm-use-cerr.cc } }
    set testcase(binary_extra_headers) { { gm-utils.h gm-std.h } }
    set testcase(gen_shlib_extra_sources) { { gm-hello.cc gm-use-cerr.cc } }
    set testcase(gen_shlib_extra_headers) { { gm-utils.h gm-std.h } }
    set testcase(tail_shlib_sources) { { gm-std.cc } }
    set testcase(tail_shlib_headers) { { gm-std.h } }

    if { $MONSTER == "y" } {
	set testcase(run_names) { 10-sos 100-sos 1000-sos }
	set testcase(nr_gen_shlibs) { 10 100 1000 }
    } else {
	set testcase(run_names) { 1-so 10-sos 100-sos }
	set testcase(nr_gen_shlibs) { 1 10 100 }
    }
    set testcase(nr_compunits) 10

    set testcase(nr_extern_globals) 10
    set testcase(nr_static_globals) 10
    set testcase(nr_extern_functions) 10
    set testcase(nr_static_functions) 10

    # class_specs needs to be embedded in an outer list because remember
    # each element of the outer list is for each run, and here we want to use
    # the same value for all runs.
    set testcase(class_specs) { {
	{
	    count 1 name { class }
	    nr_members 10 nr_static_members 10
	    nr_methods 10 nr_static_methods 10
	    nr_inline_methods 10 nr_static_inline_methods 10
	}
	{
	    count 1 name { ns0 class }
	    nr_members 10 nr_static_members 10
	    nr_methods 10 nr_static_methods 10
	    nr_inline_methods 10 nr_static_inline_methods 10
	}
	{
	    count 1 name { ns0 anonymous aclass }
	    nr_members 10 nr_static_members 10
	    nr_methods 10 nr_static_methods 10
	    nr_inline_methods 10 nr_static_inline_methods 10
	}
	{
	    count 1 name { ns0 ns1 class }
	    nr_members 10 nr_static_members 10
	    nr_methods 10 nr_static_methods 10
	    nr_inline_methods 10 nr_static_inline_methods 10
	}
	{
	    count 1 name { ns0 anonymous ns1 aclass }
	    nr_members 10 nr_static_members 10
	    nr_methods 10 nr_static_methods 10
	    nr_inline_methods 10 nr_static_inline_methods 10
	}
    } }

    return [array get testcase]
}

GenPerfTest::standard_compile_driver gmonster2.exp make_testcase_config
