# Copyright 2011-2012 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
# natively with gdbserver.
#
# To use this file:
# bash$ touch ${my_dejagnu_dir}/my-dejagnu.exp
# bash$ export DEJAGNU=${my_dejagnu_dir}/my-dejagnu.exp
# bash$ mkdir ${my_dejagnu_dir}/boards
# bash$ cp ${src_dir}/gdb/testsuite/boards/native-gdbserver.exp \
#   ${my_dejagnu_dir}/boards
# bash$ cd ${build_dir}/gdb
# bash$ make check RUNTESTFLAGS="--target_board=native-gdbserver"

load_generic_config "gdbserver"
process_multilib_options ""

# The default compiler for this target.
set_board_info compiler "[find_gcc]"

# This gdbserver can only run a process once per session.
set_board_info gdb,do_reload_on_run 1

# There's no support for argument-passing (yet).
set_board_info noargs 1

# Can't do input (or output) in the current gdbserver.
set_board_info gdb,noinferiorio 1

# gdbserver does not intercept target file operations and perform them
# on the host.
set_board_info gdb,nofileio 1

set_board_info sockethost "localhost:"
set_board_info use_gdb_stub 1

# We will be using the standard GDB remote protocol.
set_board_info gdb_protocol "remote"
# Test the copy of gdbserver in the build directory.
set_board_info gdb_server_prog "../gdbserver/gdbserver"

proc ${board}_spawn { board cmd } {
    global board_info

    set baseboard [lindex [split $board "/"] 0]

    set board_info($baseboard,isremote) 0
    set result [remote_spawn $board $cmd]
    set board_info($baseboard,isremote) 1

    return $result
}

proc ${board}_exec { hostname program args } {
    global board_info

    set baseboard [lindex [split $hostname "/"] 0]

    set board_info($baseboard,isremote) 0
    set result [remote_exec $hostname $program $args]
    set board_info($baseboard,isremote) 1

    return $result
}

proc ${board}_download { board host dest } {
    return $host
}

proc ${board}_file { dest op args } {
    if { $op == "delete" } {
	return 0
    }
    return [eval [list standard_file $dest $op] $args]
}
