# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009
# 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 essential Machine interface (MI) operations
#
# Verify that, using the MI, we can run a simple program and perform basic
# debugging activities like: insert breakpoints, run the program,
# step, next, continue until it ends and, last but not least, quit.
#
# 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=mi2"

gdb_exit
if [mi_gdb_start] {
    continue
}

set testfile "basics"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/mi2-watch
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {
     untested mi2-watch.exp
     return -1
}

proc test_watchpoint_creation_and_listing {type} {
    global mi_gdb_prompt
    global srcfile
    global hex

    set line_callee4_head [gdb_get_line_number "callee4 ("]
    set line_callee4_body [expr $line_callee4_head + 2]

    # Insert a watchpoint and list
    # Tests:
    # -break-watch C
    # -break-list

    mi_gdb_test "111-break-watch C" \
             "111\\^done,wpt=\{number=\"2\",exp=\"C\"\}" \
             "break-watch operation"

    mi_gdb_test "222-break-list" \
	    "222\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhdr=\"What\".*\\\],body=\\\[bkpt=\{number=\"2\",type=\".*watchpoint\",disp=\"keep\",enabled=\"y\",addr=\"\",what=\"C\",times=\"0\",original-location=\"C\"\}\\\]\}" \
                "list of watchpoints"

}

# UNUSED at the time
proc test_awatch_creation_and_listing {type} {
    global mi_gdb_prompt
    global srcfile
    global hex

    set line_main_head [gdb_get_line_number "main ("]
    set line_main_body [expr $line_main_head + 2]

    # Insert an access watchpoint and list it
    # Tests:
    # -break-watch -a A
    # -break-list

    mi_gdb_test "333-break-watch -a A" \
             "333\\^done,bkpt=\{number=\"1\",addr=\"$hex\",file=\".*basics.c\",line=\"$line_main_body\"\}" \
             "break-watch -a operation"

    mi_gdb_test "444-break-list" \
	    "444\\^done,BreakpointTable=\{.*,hdr=\\\[.*\\\],body=\\\[bkpt=\{number=\"3\",type=\"watchpoint\",disp=\"del\",enabled=\"y\",addr=\"$hex\",func=\"main\",file=\".*basics.c\",line=\"$line_main_body\",times=\"0\"\},.*\}\\\]\}" \
                "list of watchpoints awatch"

    mi_gdb_test "777-break-delete 3" \
	    "777\\^done" \
	    "delete access watchpoint"
}

# UNUSED at the time
proc test_rwatch_creation_and_listing {type} {
    global mi_gdb_prompt
    global srcfile
    global hex

    set line_main_head [gdb_get_line_number "main ("]
    set line_main_body [expr $line_main_head + 2]

    # Insert a read watchpoint and list it.
    # Tests:
    # -break-insert -r B
    # -break-list

    mi_gdb_test "200-break-watch -r C" \
             "200\\^done,bkpt=\{number=\"5\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"$hex\",func=\"callee4\",file=\".*basics.c\",line=\"$line_main_body\",times=\"0\"\}" \
             "break-insert -r operation"

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

    mi_gdb_test "177-break-delete 4" \
	    "177\\^done" \
	    "delete read watchpoint"
}

proc test_watchpoint_triggering {type} {
    global mi_gdb_prompt
    global hex

    set line_callee4_return_0     [gdb_get_line_number "return 0;"]
    set line_callee3_head         [gdb_get_line_number "callee3 ("]
    set line_callee3_close_brace  [expr $line_callee3_head + 3]

    # Continue execution until the watchpoint is reached,  continue again, 
    # to see the watchpoint go out of scope.
    # Does:
    # -exec-continue (Here wp triggers)
    # -exec-continue (Here wp goes out of scope)

    mi_execute_to "exec-continue" "watchpoint-trigger" "callee4" "" \
        ".*basics.c" $line_callee4_return_0 \
        {"" "wpt=\{number=\"2\",exp=\"C\"\},value=\{old=\".*\",new=\"3\"\}"} \
        "watchpoint trigger"

    if { $type == "sw" } {
      setup_xfail *-*-*
    }
    mi_execute_to "exec-continue" "watchpoint-scope" "callee3" ".*" \
        ".*basics.c" $line_callee3_close_brace \
        {"" "wpnum=\"2\""} \
        "watchpoint trigger"
    clear_xfail *-*-*
}

proc test_watchpoint_all {type} {
    global pf_prefix
    upvar srcdir srcdir
    upvar subdir subdir
    upvar binfile binfile

    set old_prefix $pf_prefix
    lappend pf_prefix "$type:"

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

    mi_runto callee4
    test_watchpoint_creation_and_listing $type
    #test_rwatch_creation_and_listing $type
    #test_awatch_creation_and_listing $type
    test_watchpoint_triggering $type

    set pf_prefix $old_prefix
}

# Run the tests twice, once using software watchpoints...
mi_gdb_test "567-gdb-set can-use-hw-watchpoints 0" \
	"567\\^done" \
	"hw watchpoints toggle (1)"
test_watchpoint_all sw

mi_gdb_exit

# ... and unless requested otherwise...
if [target_info exists gdb,no_hardware_watchpoints] {
    return 0
}

mi_gdb_start

# ... once using hardware watchpoints (if available).
mi_gdb_test "890-gdb-set can-use-hw-watchpoints 1" \
	"890\\^done" \
	"hw watchpoints toggle (2)"
test_watchpoint_all hw

mi_gdb_exit
return 0
