# This testcase is part of GDB, the GNU debugger.

# Copyright 1997, 1998, 1999, 2000, 2002, 2001, 2003, 2004 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.  */
# step-test.exp -- Expect script to test stepping in gdb

if $tracelevel then {
    strace $tracelevel
}

set testfile step-test
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

remote_exec build "rm -f ${binfile}"
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
   fail "Can't run to main"
   return 0
}

# Set a breakpoint at line 45, if stepi then finish fails, we would
# run to the end of the program, which would mess up the rest of the tests.
  
# Vanilla step/next
#
gdb_test "next" ".*${decimal}.*x = 1;.*" "next 1"
gdb_test "step" ".*${decimal}.*y = 2;.*" "step 1"

# With count
#
gdb_test "next 2" ".*${decimal}.*w = w.*2;.*" "next 2"
gdb_test "step 3" ".*${decimal}.*z = z.*5;.*" "step 3"
gdb_test "next" ".*${decimal}.*callee.*OVER.*" "next 3"

# Step over call
#
gdb_test "next" ".*${decimal}.*callee.*INTO.*" "next over"

# Step into call
#
gdb_test "step" ".*${decimal}.*myglob.*"   "step into"

# Step out of call
#
# I wonder if this is really portable.  Are there any caller-saves
# platforms, on which `finish' will return you to some kind of pop
# instruction, which is attributed to the line containing the function
# call?

# On PA64, we end up at a different instruction than PA32.
# On IA-64, we also end up on callee instead of on the next line due
# to the restoration of the global pointer (which is a caller-save).
# Similarly on MIPS PIC targets.
set test "step out"
if { [istarget "hppa2.0w-hp-hpux*"] || [istarget "ia64-*-*"] || [istarget "mips*-*-*"]} {
    gdb_test_multiple "finish" "$test" {
        -re ".*${decimal}.*a.*5.*= a.*3.*$gdb_prompt $" {
	    pass "$test"
	}
        -re ".*${decimal}.*callee.*INTO.*$gdb_prompt $" {
	    pass "$test"
	}
    }
} else {
    gdb_test "finish" ".*${decimal}.*a.*5.*= a.*3.*" "step out"
}

### Testing nexti and stepi.
###
### test_i NAME COMMAND HERE THERE
###
### Send COMMAND to gdb over and over, while the output matches the
### regexp HERE, followed by the gdb prompt.  Pass if the output
### eventually matches the regexp THERE, followed by the gdb prompt;
### fail if we have to iterate more than a hundred times, we time out
### talking to gdb, or we get output which is neither HERE nor THERE.  :)
###
### Use NAME as the name of the test.
###
### The exact regexps used are "$HERE.*$gdb_prompt $"
###                        and "$THERE.*$gdb_prompt $"
### 
proc test_i {name command here there} {
    global gdb_prompt
    
    set i 0
    gdb_test_multiple "$command" "$name" {
	-re "$here.*$gdb_prompt $" {
	    # Have we gone for too many steps without seeing any progress?
	    if {[incr i] >= 100} {
		fail "$name (no progress after 100 steps)"
		return
	    }
	    send_gdb "$command\n"
	    exp_continue
	}
	-re "$there.*$gdb_prompt $" {
	    # We've reached the next line.  Rah.
	    pass "$name"
	    return
	}
    }
}

test_i "stepi to next line" "stepi" \
       ".*${decimal}.*a.*5.* = a.*3" \
       ".*${decimal}.*callee.*STEPI"
test_i "stepi into function" "stepi" \
       ".*${decimal}.*callee.*STEPI" \
       ".*callee \\(\\) at .*step-test\\.c" 

# Continue to step until we reach the function's body.  This makes it
# more likely that we've actually completed the prologue, so "finish"
# will work.
test_i "stepi into function's first source line" "stepi" \
	".*${decimal}.*int callee" \
	".*${decimal}.*myglob.*; return 0;"

# Have to be careful here, if the finish does not work, 
# then we may run to the end of the program, which
# will cause erroneous failures in the rest of the tests
set test "stepi: finish call"
gdb_test_multiple "finish" "$test" {
    -re ".*${decimal}.*callee.*NEXTI.*$gdb_prompt $" {
	pass "$test"
    }
    -re ".*(Program received|Program exited).*$gdb_prompt $" {
	# Oops... We ran to the end of the program...  Better reset     
	if {![runto_main]} then {
	    fail "$test (Can't run to main)"
	    return 0
	}
	if {![runto step-test.c:45]} {
	    fail "$test (Can't run to line 45)"
	    return 0
	}
	fail "$test"
    }
    -re ".*${decimal}.*callee.*STEPI.*$gdb_prompt $" {
	# On PA64, we end up at a different instruction than PA32.
	# On IA-64, we end up on callee instead of on the following line due
	# to the restoration of the global pointer.
	# Similarly on MIPS PIC targets.
	if { [istarget "hppa2.0w-hp-hpux*"] || [istarget "ia64-*-*"] || [istarget "mips*-*-*"] } {
	    test_i "$test" "stepi" \
		".*${decimal}.*callee.*STEPI"  ".*${decimal}.*callee.*NEXTI"
	} else {
	    fail "$test"
	}
    }
}

test_i "nexti over function" "nexti" \
       ".*${decimal}.*callee.*NEXTI" \
       ".*${decimal}.*y = w \\+ z;"

# On some platforms, if we try to step into a function call that
# passes a large structure by value, then we actually end up stepping
# into memcpy, bcopy, or some such --- GCC emits the call to pass the
# argument.  Opinion is bitterly divided about whether this is the
# right behavior for GDB or not, but we'll catch it here, so folks
# won't forget about it.
# Update 4/4/2002 - Regardless of which opinion you have, you would
# probably have to agree that gdb is currently behaving as designed,
# in the absence of additional code to not stop in functions used
# internally by the compiler.  Since the testsuite should be checking
# for conformance to the design, the correct behavior is to accept the
# cases where gdb stops in memcpy/bcopy.

gdb_test \
  "break [gdb_get_line_number "step-test.exp: large struct by value"]" \
  ".*Breakpoint.* at .*" \
  "set breakpoint at call to large_struct_by_value"
gdb_test "continue" \
         ".*Breakpoint ${decimal},.*large_struct_by_value.*" \
	 "run to pass large struct"
set test "large struct by value"
gdb_test_multiple "step" "$test" {
    -re ".*step-test.exp: arrive here 1.*$gdb_prompt $" {
	pass "$test"
    }
    -re ".*(memcpy|bcopy).*$gdb_prompt $" {
	send_gdb "finish\n" ; gdb_expect -re "$gdb_prompt $"
	send_gdb "step\n"
	exp_continue
    }
}

gdb_continue_to_end "step-test.exp"

return 0
