# Copyright 2020-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/>.

# Test running an inferior with arguments.

# This does not work on boards that don't support inferior arguments.
if [target_info exists noargs] then {
    verbose "skipping gdb.base/inferior-args.exp because of noargs"
    return
}

standard_testfile .c

if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} {
    return
}

proc do_test { method } {
    global binfile hex

    # The second arg is an empty string on purpose.
    set inferior_args { "first arg" "" "third-arg" }

    clean_restart $binfile

    if { $method == "start" } {
	# The start command does not make sense for a stub.
	if { [use_gdb_stub] } {
	    return;
	}

	if { [gdb_start_cmd $inferior_args] < 0 } {
	    fail "could not issue start command"
	    return -1
	}

	# Consume up to the GDB prompt after the stop.
	gdb_test "" ".*main.*" "stop at main"

    } elseif { $method == "starti" } {
	# The starti command does not make sense for a stub.
	if { [use_gdb_stub] } {
	    return;
	}

	if { [gdb_starti_cmd $inferior_args] < 0 } {
	    fail "could not issue start command"
	    return -1
	}

	# Consume up to the GDB prompt after the stop.
	gdb_test "" "" "stop at first instruction"

	# Put a breakpoint and continue until main.
	if { ![gdb_breakpoint "main" message] } {
	    fail "could not set breakpoint on main"
	    return -1
	}

	if { [gdb_continue "main"] != 0 } {
	    fail "could not continue to main"
	    return -1
	}

    } elseif { $method == "run" } {
	if { ![gdb_breakpoint "main" message] } {
	    fail "could not set breakpoint on main"
	    return -1
	}

	# The run command does not make sense for a stub, but GDB_RUN_CMD
	# does the right thing when the target is a stub (start the stub,
	# connect to it, and "continue").
	#
	# This allows us to test arguments passed on the gdbserver command
	# line.
	if { [gdb_run_cmd $inferior_args] < 0 } {
	    fail "could not run"
	    return -1
	}

	# Consume up to the GDB prompt after the stop.
	gdb_test "" ".*main.*" "stop at main"

    } elseif { $method == "set args" } {
	# Using "set args" does not make sense with a stub.
	if { [use_gdb_stub] } {
	    return;
	}

	gdb_test_no_output "set args $inferior_args"

	if { ![runto_main] } {
	    return -1
	}

    } else {
	error "invalid method $method"
    }

    # Now that we are stopped at main, inspect argc/argv.
    gdb_test "print argc" " = 4"
    gdb_test "print argv\[0\]" " = $hex \".*\""
    gdb_test "print argv\[1\]" " = $hex \"first arg\""
    gdb_test "print argv\[2\]" " = $hex \"\""
    gdb_test "print argv\[3\]" " = $hex \"third-arg\""
}

foreach_with_prefix method { "start" "starti" "run" "set args" } {
    do_test $method
}
