# Copyright 2013 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 file is a dejagnu "board file" and is used to run the testsuite
# with Fission support and generation of dwp files.
# http://gcc.gnu.org/wiki/DebugFission
# http://gcc.gnu.org/wiki/DebugFissionDWP
#
# Example usage:
# bash$ make check RUNTESTFLAGS='--target_board=fission-dwp'

load_board_description "fission"

set found_gcc [find_gcc]
set found_gxx [find_g++]

set contrib_dir [file normalize $srcdir/../contrib]
if ![info exists CC_FOR_TARGET] {
    set CC_FOR_TARGET "$found_gcc"
}
set CC_FOR_TARGET "/bin/sh $contrib_dir/cc-with-tweaks.sh -p $CC_FOR_TARGET"
if ![info exists CXX_FOR_TARGET] {
    set CXX_FOR_TARGET "$found_gxx"
}
set CXX_FOR_TARGET "/bin/sh $contrib_dir/cc-with-tweaks.sh -p $CXX_FOR_TARGET"

if ![info exists READELF_FOR_TARGET] {
    set READELF_FOR_TARGET "[transform readelf]"
}
# cc-with-tweaks.sh uses READELF, not READELF_FOR_TARGET.  Blech.
set env(READELF) "$READELF_FOR_TARGET"

if ![info exists DWP_FOR_TARGET] {
    set DWP_FOR_TARGET "[transform dwp]"
}
# cc-with-tweaks.sh uses DWP, not DWP_FOR_TARGET.  Blech.
set env(DWP) "$DWP_FOR_TARGET"
