# Test Framework Driver for GDB driving a builtin simulator
#   Copyright 1994-2024 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/>.

# If we left this empty, the core of the testsuite would think we were
# connecting to the native target.
set_board_info gdb_protocol "sim"

#
# gdb_target_sim
# Set gdb to target the simulator
#
proc gdb_target_sim { } {
    global gdb_prompt
    
    set target_sim_options "[board_info target gdb,target_sim_options]"

    send_gdb "target sim $target_sim_options\n"
    gdb_expect 60 {
	-re "Connected to the simulator.*$gdb_prompt $"	{
	    verbose "Set target to sim"
	}
	timeout { 
	    perror "Couldn't set target for simulator."
	    return -1
	}
    }
    return 0
}

#
# gdb_load -- load a file into the debugger.
#             return a -1 if anything goes wrong.
#
proc gdb_load { arg } {
    global verbose
    global loadpath
    global loadfile
    global GDB
    global gdb_prompt

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

    if {[gdb_target_sim]} { return -1 }

    send_gdb "load\n"
    gdb_expect 2400 {
	-re ".*$gdb_prompt $" {
	    if {$verbose > 1} {
		send_user "Loaded $arg into $GDB\n"
	    }
	    return 0
	}
	-re "$gdb_prompt $"     {
	    if {$verbose > 1} {
		perror "GDB couldn't load."
	    }
	}
	timeout {
	    if {$verbose > 1} {
		perror "Timed out trying to load $arg."
	    }
	}
    }
    return -1
}
