#   Copyright (C) 2001, 2002, 2004 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# 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 gcc
set prof_ext gcda
set perf_ext tim

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

if $tracelevel then {
    strace $tracelevel
}

# Load support procs.
load_lib profopt.exp

set profile_options "-fprofile-arcs"
set feedback_options "-fbranch-probabilities"
if {[check_profiling_available "-ftree-based-profiling"]} {
    lappend profile_options "-ftree-based-profiling -fprofile-arcs"
    lappend feedback_options "-ftree-based-profiling -fbranch-probabilities"
}

foreach profile_option $profile_options feedback_option $feedback_options {
    foreach src [lsort [glob -nocomplain $srcdir/$subdir/bprob-*.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
    }
}
