# Copyright 1999-2005, 2007-2012 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 Machine interface (MI) operations 
# Verify that, using the MI, we can run a simple program and perform
# exec-step-instruction and exec-next-instruction.  

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

standard_testfile basics.c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested mi2-stepi.exp
     return -1
}

proc test_stepi_nexti {} {
    global mi_gdb_prompt
    global hex fullname_syntax srcfile

    set line_main_head  [gdb_get_line_number "main ("]
    set line_main_body  [expr $line_main_head + 2]
    set line_main_hello [gdb_get_line_number "Hello, World!"]

    # clang/14501 means that "step"ing from this line steps into the function
    # whereas the test expects to just step over a constant register
    # initialization. Remove the conditional once 14501 is fixed.
    if ![using_clang] {
        set line [mi_execute_to "exec-step-instruction" "end-stepping-range" \
                      "main" "" ".*basics.c" "\[0-9\]+" "" \
                      "step-instruction at main"]
        if { $line >= $line_main_body && $line <= $line_main_hello } {
             pass "step-instruction at main (line check)"
        } else {
            fail "step-instruction at main (line check)"
        }
    }

    set line [mi_execute_to "exec-next-instruction" "end-stepping-range" "main" "" \
                  ".*basics.c" "\[0-9\]+" "" "next-instruction at main"]
    if { $line >= $line_main_body && $line <= $line_main_hello } {
        pass "next-instruction at main (line check)"
    } else {
        fail "next-instruction at main (line check)"
    }

    set line [mi_execute_to "exec-next-instruction" "end-stepping-range" "main" "" \
                  ".*basics.c" "\[0-9\]+" "" "next-instruction at main 2"]
    if { $line >= $line_main_body && $line <= $line_main_hello } {
        pass "next-instruction at main 2 (line check)"
    } else {
        fail "next-instruction at main 2 (line check)"
    }
}

mi_run_to_main
test_stepi_nexti

mi_gdb_exit
return 0
