# Copyright 2011-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
# natively with gdbserver, in extended-remote mode.
#
# To use this file:
# bash$ cd ${build_dir}/gdb
# bash$ make check RUNTESTFLAGS="--target_board=native-extended-gdbserver"

load_generic_config "extended-gdbserver"
load_board_description "gdbserver-base"

# 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

set_board_info sockethost "localhost:"

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

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
}
