#   Copyright 1999, 2000 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu
#
# Test essential Machine interface (MI) operations
#
# Verify that, using the MI, we can run a simple program and look at registers.
#
# The goal is not to test gdb functionality, which is done by other tests,
# but to verify the correct output response to MI operations.
#


load_lib mi-support.exp
set MIFLAGS "-i=mi0"

gdb_exit
if [mi_gdb_start] {
    continue
}

set testfile "basics"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}

proc test_breakpoints_creation_and_listing {} {
    global mi_gdb_prompt
    global srcfile
    global hex

    # Insert some breakpoints and list them
    # Also, disable some so they do not interfere with other tests
    # Tests:
    # -break-insert
    # -break-list
    # -break-disable
    # -break-info

    mi_gdb_test "200-break-insert main" \
             "200\\^done,bkpt=\{number=\"1\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"$hex\",func=\"main\",file=\".*basics.c\",line=\"32\",times=\"0\"\}" \
             "break-insert operation"

    mi_gdb_test "204-break-list" \
                "204\\^done,BreakpointTable=\{hdr=\{.*\},bkpt=\{number=\"1\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"$hex\",func=\"main\",file=\".*basics.c\",line=\"32\",times=\"0\"\}\}" \
                "list of breakpoints"
}

proc test_running_the_program {} {
    global mi_gdb_prompt
    global hex

    # Run the program without args
    # Tests:
    # -exec-run

    # mi_gdb_test cannot be used for asynchronous commands because there are
    # two prompts involved and this can lead to a race condition.
    # FIXME: We are accepting a duplicate file and line info temporarely.
    # The following is equivalent to a send_gdb "000-exec-run\n"
    mi_run_cmd
    # The running part has been checked already by mi_run_cmd
        gdb_expect {
	    -re "\[\r\n\]*000\\*stopped,reason=\"breakpoint-hit\",bkptno=\"1\",thread-id=\"\[01\]\",frame=\{addr=\"$hex\",func=\"main\",args=\{\},file=\".*basics.c\",line=\"32\"\}\r\n$mi_gdb_prompt$" {
            pass "run to main"
          }
          -re ".*$mi_gdb_prompt$" {fail "run to main (2)"}
          timeout {fail "run to main (timeout 2)"}
        }
}

proc sparc_register_tests_no_exec { } {
	# Test the generic IDT chip.
	mi_gdb_test "111-data-list-register-values" \
		".*111\\^error,msg=\"mi_cmd_data_list_register_values: Usage: -data-list-register-values <format> \\\[<regnum1>...<regnumN>\\\]\"" \
		"wrong arguments"

	mi_gdb_test "111-data-list-register-values x" \
		".*111\\^error,msg=\"mi_cmd_data_list_register_values: No registers\.\"" \
		"no executable"
}

# These tests exercise IDT-specific MIPS registers for several
# different processor models.

# This should detect the actual processor in use and change
# the expected results appropriately.  FIXME

proc sparc_register_tests { } {
    global hex
    global decimal
    set octal "\[0-7\]+"
    set binary "\[0-1\]+"
    set float "\\-?((\[0-9\]+(\\.\[0-9\]+)?(e\[-+\]\[0-9\]+)?)|(nan\\($hex\\)))"
    set float2 "\\-?\[0-9\]+"

    mi_gdb_test "111-data-list-register-names" \
	    "111\\^done,register-names=\{\"g0\",\"g1\",\"g2\",\"g3\",\"g4\",\"g5\",\"g6\",\"g7\",\"o0\",\"o1\",\"o2\",\"o3\",\"o4\",\"o5\",\"sp\",\"o7\",\"l0\",\"l1\",\"l2\",\"l3\",\"l4\",\"l5\",\"l6\",\"l7\",\"i0\",\"i1\",\"i2\",\"i3\",\"i4\",\"i5\",\"fp\",\"i7\",\"f0\",\"f1\",\"f2\",\"f3\",\"f4\",\"f5\",\"f6\",\"f7\",\"f8\",\"f9\",\"f10\",\"f11\",\"f12\",\"f13\",\"f14\",\"f15\",\"f16\",\"f17\",\"f18\",\"f19\",\"f20\",\"f21\",\"f22\",\"f23\",\"f24\",\"f25\",\"f26\",\"f27\",\"f28\",\"f29\",\"f30\",\"f31\",\"y\",\"psr\",\"wim\",\"tbr\",\"pc\",\"npc\",\"fpsr\",\"cpsr\"\}" \
	    "list register names"

    mi_gdb_test "222-data-list-register-values x" \
	    "222\\^done,register-values=\{\{number=\"0\",value=\"$hex\"\}.*\{number=\"71\",value=\"$hex\"\}\}" \
	    "register values x"

    mi_gdb_test "333-data-list-register-values f" \
	    "333\\^done,register-values=\{\{number=\"0\",value=\"$float\"\},\{number=\"1\",value=\"$float\"\},.*\{number=\"71\",value=\"$float\"\}\}" \
	    "register values f"

    mi_gdb_test "444-data-list-register-values d" \
	    "444\\^done,register-values=\{\{number=\"0\",value=\"$decimal\"\}.*\{number=\"71\",value=\"$decimal\"\}\}" \
	    "register values d"

    mi_gdb_test "555-data-list-register-values o" \
	    "555\\^done,register-values=\{\{number=\"0\",value=\"$octal\"\}.*\{number=\"71\",value=\"$octal\"\}\}" \
	    "register values o"

    mi_gdb_test "666-data-list-register-values t" \
	    "666\\^done,register-values=\{\{number=\"0\",value=\"$binary\"\}.*\{number=\"71\",value=\"$binary\"\}\}" \
	    "register values t"

    # On the sparc, registers 0-31 are int, 32-63 float, 64-71 int

    mi_gdb_test "777-data-list-register-values N" \
	    "777\\^done,register-values=\{\{number=\"0\",value=\"$decimal\"\}.*\{number=\"31\",value=\"$decimal\"\},\{number=\"32\",value=\"$float\"\}.*\{number=\"63\",value=\"$float\"\},\{number=\"64\",value=\"$decimal\"\}.*\{number=\"71\",value=\"$decimal\"\}\}" \
	    "register values N"

    mi_gdb_test "888-data-list-register-values r" \
	    "888\\^done,register-values=\{\{number=\"0\",value=\"$hex\"\}.*\{number=\"71\",value=\"$hex\"\}\}" \
	    "register values r"

    mi_gdb_test "999-data-list-register-names 68 69 70 71" \
	    "999\\^done,register-names=\{\"pc\",\"npc\",\"fpsr\",\"cpsr\"\}" \
	    "list names of some regs"

    mi_gdb_test "001-data-list-register-values x 68 69 70 71" \
	    "001\\^done,register-values=\{\{number=\"68\",value=\"$hex\"\},\{number=\"69\",value=\"$hex\"\},\{number=\"70\",value=\"$hex\"\},\{number=\"71\",value=\"$hex\"\}\}" \
	    "list values of some regs"

    # Don't know how useful this test is

    mi_gdb_test "002-data-list-changed-registers" \
	    "002\\^done,changed-registers=\{(\"${decimal}\"(,\"${decimal}\")*)?\}" \
	    "list changed registers"
}

if [istarget "sparc-*-*"] then {
    sparc_register_tests_no_exec
    test_breakpoints_creation_and_listing
    test_running_the_program
    sparc_register_tests
} else {
    verbose "mi-regs.exp tests ignored for this target"
}

mi_gdb_exit
return 0
