# 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, in extended-remote mode.
#
# 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-extended-gdbserver.exp \
#   ${my_dejagnu_dir}/boards
# bash$ cd ${build_dir}/gdb
# bash$ make check RUNTESTFLAGS="--target_board=native-extended-gdbserver"

load_generic_config "extended-gdbserver"

# By default, dejagnu makes the board remote unless the board name
# matches localhost.  Force it to be NOT remote.
global board
global board_info
set board_info($board,isremote) 0

process_multilib_options ""

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

# 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:"

# We will be using the extended GDB remote protocol.
set_board_info gdb_protocol "extended-remote"

# Test the copy of gdbserver in the build directory.
set_board_info gdb_server_prog "../gdbserver/gdbserver"

send_user "configuring for gdbserver local testing (extended-remote)\n";

# We must load this explicitly here, and rename the procedures we want
# to override.  If we didn't do this, given that mi-support.exp is
# loaded later in the test files, the procedures loaded then would
# override our definitions.
load_lib mi-support.exp

# Overriden in order to start a "gdbserver --multi" instance whenever
# GDB is started.  Note nothing is needed for gdb_exit, since
# gdbserver is started with --once, causing it to exit once GDB
# disconnects.
proc gdb_start { } {
    # Spawn GDB.
    default_gdb_start

    # And then GDBserver, ready for extended-remote mode.
    gdbserver_start_multi

    return 0
}

# Likewise, for MI.
#
if { [info procs extended_gdbserver_mi_gdb_start] == "" } {
    rename mi_gdb_start extended_gdbserver_mi_gdb_start
}
proc mi_gdb_start { args } {
    # Spawn GDB.
    set res [extended_gdbserver_mi_gdb_start $args]
    if { $res } {
	return $res
    }

    # And then GDBserver, ready for extended-remote mode.
    mi_gdbserver_start_multi
    return 0
}

# Overriden in order to set the remote exec-file whenever a file is
# loaded to gdb.
#
proc gdb_load { arg } {
    global gdb_prompt

    if { $arg != "" } {
	if [gdb_file_cmd $arg] then { return -1 }
    }

    send_gdb "set remote exec-file $arg\n"
    gdb_expect {
	-re "$gdb_prompt $" {}
	timeout {
	    perror "couldn't set the remote exec-file (timed out)."
	    return -1
	}
    }

    return 0
}

# Likewise, for MI.
#
if { [info procs extended_gdbserver_mi_gdb_load] == "" } {
    rename mi_gdb_load extended_gdbserver_mi_gdb_load
}
proc mi_gdb_load { arg } {
    global mi_gdb_prompt

    set res [extended_gdbserver_mi_gdb_load $arg]
    if { $res } then { return -1 }

    send_gdb "100-gdb-set remote exec-file $arg\n"
    gdb_expect 10 {
	-re ".*100-gdb-set remote exec-file $arg\r\n100\\\^done\r\n$mi_gdb_prompt$" {
	    verbose "set the remote exec-file to $arg."
	}
	timeout {
	    perror "couldn't set the remote exec-file (timed out)."
	}
    }

    return 0
}

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]
}
