#   Copyright 1998, 1999, 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/>.  */

if $tracelevel then {
	strace $tracelevel
	}

set prms_id 0
set bug_id 0

clear_xfail "*-*-*"

set testfile "jump"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# Build the test case
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
     untested jump.exp
     return -1
    }


# Start with a fresh gdb

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

if ![runto_main] then {
  perror "Couldn't run to main"
  return -1
}

# Set a breakpoint on the statement that we're about to jump to.
# The statement doesn't contain a function call.
#
send_gdb "break 22\n"
set bp_on_non_call 0
gdb_expect {
  -re "\[Bb\]reakpoint (\[0-9\]*) at 0x\[0-9a-fA-F\]*: file .*${srcfile}, line 22.*$gdb_prompt $"\
          {set bp_on_non_call $expect_out(1,string)
           pass "break before jump to non-call"}
  -re "$gdb_prompt $"\
          {fail "break before jump to non-call"}
  timeout {fail "(timeout) break before jump to non-call"}
}

# Can we jump to the statement?  Do we stop there?
#
send_gdb "jump 22\n"
gdb_expect {
  -re "Breakpoint \[0-9\]*, .*${srcfile}:22.*$gdb_prompt $"\
          {pass "jump to non-call"}
  -re "$gdb_prompt $"\
          {fail "jump to non-call"}
  timeout {fail "(timeout) jump to non-call"}
}

# Set a breakpoint on the statement that we're about to jump to.
# The statement does contain a function call.
#
send_gdb "break 21\n"
set bp_on_call 0
gdb_expect {
  -re "\[Bb\]reakpoint (\[0-9\]*) at 0x\[0-9a-fA-F\]*: file .*${srcfile}, line 21.*$gdb_prompt $"\
          {set bp_on_call $expect_out(1,string)
           pass "break before jump to call"}
  -re "$gdb_prompt $"\
          {fail "break before jump to call"}
  timeout {fail "(timeout) break before jump to call"}
}

# Can we jump to the statement?  Do we stop there?
#
send_gdb "jump 21\n"
gdb_expect {
  -re "Breakpoint \[0-9\]*, .*${srcfile}:21.*$gdb_prompt $"\
          {pass "jump to call"}
  -re "$gdb_prompt $"\
          {fail "jump to call"}
  timeout {fail "(timeout) jump to call"}
}

# If we disable the breakpoint at the function call, and then
# if we jump to that statement, do we not stop there, but at
# the following breakpoint?
#
send_gdb "disable $bp_on_call\n"
gdb_expect {
  -re "$gdb_prompt $"\
          {pass "disable breakpoint on call"}
  timeout {fail "(timeout) disable breakpoint on call"}
}

send_gdb "jump 21\n"
gdb_expect {
  -re "Breakpoint \[0-9\]*, .*${srcfile}:22.*$gdb_prompt $"\
          {pass "jump to call with disabled breakpoint"}
  -re "$gdb_prompt $"\
          {fail "jump to call with disabled breakpoint"}
  timeout {fail "(timeout) jump to call with disabled breakpoint"}
}

# Verify that GDB responds gracefully to the "jump" command without
# an argument.
#
send_gdb "jump\n"
gdb_expect {
  -re "Argument required .starting address..*$gdb_prompt $"\
          {pass "jump without argument disallowed"}
  -re "$gdb_prompt $"\
          {fail "jump without argument disallowed"}
  timeout {fail "(timeout) jump without argument disallowed"}
}

# Verify that GDB responds gracefully to the "jump" command with
# trailing junk.
#
send_gdb "jump 21 100\n"
gdb_expect {
  -re "Junk at end of line specification: 100.*$gdb_prompt $"\
          {pass "jump with trailing argument junk"}
  -re "$gdb_prompt $"\
          {fail "jump with trailing argument junk"}
  timeout {fail "(timeout) jump with trailing argument junk"}
}

# Verify that GDB responds gracefully to a request to jump out of
# the current function.  (Note that this will very likely cause the
# inferior to die.  Be prepared to rerun the inferior, if further
# testing is desired.)
#
# Try it both ways: confirming and not confirming the jump.
#
send_gdb "jump 12\n"
gdb_expect {
  -re "Line 12 is not in `main'.  Jump anyway.*y or n. $"\
          {send_gdb "n\n"
           gdb_expect {
             -re "Not confirmed.*$gdb_prompt $"\
                     {pass "aborted jump out of current function"}
             -re "$gdb_prompt $"\
                     {fail "aborted jump out of current function"}
             timeout {fail "(timeout) aborted jump out of current function"}
           }
          }
  -re "$gdb_prompt $"\
          {fail "aborted jump out of current function"}
  timeout {fail "(timeout) aborted jump out of current function"}
}

send_gdb "jump 12\n"
gdb_expect {
  -re "Line 12 is not in `main'.  Jump anyway.*y or n. $"\
          {send_gdb "y\n"
           gdb_expect {
             -re "Continuing at.*$gdb_prompt $"\
                     {pass "jump out of current function"}
             -re "$gdb_prompt $"\
                     {fail "jump out of current function"}
             timeout {fail "(timeout) jump out of current function"}
           }
          }
  -re "$gdb_prompt $"\
          {fail "jump out of current function"}
  timeout {fail "(timeout) jump out of current function"}
}

gdb_exit
return 0
