# 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.
# APPLE LOCAL: Handle the case where we step into a function thunk.
test_i "stepi into function's first source line" "stepi" \
	"\(.*${decimal}.*int callee.*\|.*__i686\.get_pc_thunk\.cx.*\)" \
	".*${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
