#   Copyright (C) 2001, 2002, 2004, 2007 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.
#
# Test the functionality of programs compiled with profile-directed block
# ordering using -fprofile-arcs followed by -fbranch-probabilities.

load_lib target-supports.exp

# Some targets don't have any implementation of __bb_init_func or are
# missing other needed machinery.
if { ![check_profiling_available "-fprofile-arcs"] } {
    return
}

# The procedures in profopt.exp need these parameters.
set tool g++
set prof_ext "gcda gcno"

if $tracelevel then {
    strace $tracelevel
}

# Override the list defined in profopt.exp.
set PROFOPT_OPTIONS [list \
	{ -g } \
	{ -O0 } \
	{ -O1 } \
	{ -O2 } \
	{ -O3 } \
	{ -O3 -g } \
	{ -Os } ]

if $tracelevel then {
    strace $tracelevel
}

# Load support procs.
load_lib profopt.exp

set profile_options "-fprofile-arcs"
set feedback_options "-fbranch-probabilities"

# Main loop.
foreach profile_option $profile_options feedback_option $feedback_options {
    foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] {
        # If we're only testing specific files and this isn't one of them, skip it.
        if ![runtest_file_p $runtests $src] then {
            continue
        }
        profopt-execute $src
    }
}
