#   Copyright 1998, 1999, 2007, 2008, 2009, 2010
#   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
