# Copyright 2013-2021 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 "$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 "$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"
