# Copyright 2011-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
# 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"
load_board_description "local-board"

# 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 } {
    global gdbserver_reconnect_p

    # Spawn GDB.
    set res [extended_gdbserver_mi_gdb_start $args]
    if { $res } {
	return $res
    }

    # And then spawn GDBserver and connect to it in extended-remote
    # mode, unless the test wants to explicitly test reconnection.
    if {![info exists gdbserver_reconnect_p] || !$gdbserver_reconnect_p} {
	mi_gdbserver_start_multi
    }
    return 0
}

# Helper that runs "set remote exec-file" with the last loaded file.

proc extended_gdbserver_load_last_file {} {
    global gdb_prompt
    global last_loaded_file

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

    return 0
}

# Overriden in order to set the remote exec-file whenever a file is
# loaded to gdb.
#
if { [info procs extended_gdbserver_gdb_file_cmd] == "" } {
    rename gdb_file_cmd extended_gdbserver_gdb_file_cmd
}
proc gdb_file_cmd { arg } {
    if [extended_gdbserver_gdb_file_cmd $arg] {
	return -1
    }
    return [extended_gdbserver_load_last_file]
}

proc gdb_reload { {inferior_args {}} } {
    return [extended_gdbserver_load_last_file]
}

# With the two procedure overrides above, it shouldn't be necessary to
# override this one too.  However, not doing so regresses
# gdb.base/dbx.exp.  See comments above gdb.base/dbx.exp:gdb_file_cmd.
# Once testing of the "symbol-file"/"exec-file" commands is moved out
# to a separate non-dbx testcase, we should be able to remove this.
proc gdb_load { arg } {
    if { $arg != "" } {
	if [gdb_file_cmd $arg] then { return -1 }
    }

    return [extended_gdbserver_load_last_file]
}


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