#   Copyright 2003, 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/>.


# This is a regression test for the following bug, as of 2003-12-12:
#
# Set a breakpoint which will be hit many times.  Attach a complex set
# of commands to it, including a "continue" command.  Run the program,
# so that the breakpoint is hit, its commands get executed, and the
# program continues and hits the breakpoint again.  You will see
# messages like "warning: Invalid control type in command structure.",
# or maybe GDB will crash.
#
# When the breakpoint is hit, bpstat_stop_status copies the
# breakpoint's command tree to the bpstat.  bpstat_do_actions then
# calls execute_control_command to run the commands.  The 'continue'
# command invokes the following chain of calls:
#
#   continue_command
#     -> clear_proceed_status
#       -> bpstat_clear
#         -> free_command_lines
#            -> frees the commands we are currently running.
#
# When control does eventually return to execute_control_command, GDB
# continues to walk the tree of freed command nodes, resulting in the
# error messages and / or crashes.
#
# Since this bug depends on storage being reused between the time that
# we continue and the time that we fall back to bpstat_do_actions, the
# reproduction recipe is more delicate than I would like.  I welcome
# suggestions for improving this.

set prms_id 0
set bug_id 0

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

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

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

gdb_test "break ${srcfile}:[gdb_get_line_number "euphonium"]" "" "set breakpoint"

# The goal of all this is to make sure that there's plenty of memory
# churn, and different amounts of it each time the inferior stops;
# this seems to make GDB crash more reliably.
set lines {{if (i%2) == 0}
           {echo "even "}
           {print i}
           {else}
           {echo "odd "}
           {print i}
           {end}
           {set variable $foo = 0}
           {set variable $j = 0}
           {while $j < i}
           {set variable $foo += $j}
           {set variable $j++}
           {end}
           {print $foo}
           {if i != 40}
           {c}
           {end}
           {end}}

send_gdb "commands\n"
for {set i 0} {$i < [llength $lines]} {incr i} {
    gdb_expect {
        -re ".*>" {
            send_gdb "[lindex $lines $i]\n"
        }
        -re "$gdb_prompt $" {
            set reason "got top-level prompt early"
            break
        }
        timeout {
            set reason "timeout"
            break
        }
    }
}
if {$i >= [llength $lines]} {
    pass "send breakpoint commands"
} else {
    fail "send breakpoint commands ($reason)"
}

gdb_run_cmd

set timeout 120

gdb_test_multiple "" "run program with breakpoint commands" {
    -re "warning: Invalid control type in command structure" {
        kfail "gdb/1489" "run program with breakpoint commands"
    }
    -re "$gdb_prompt $" {
        pass "run program with breakpoint commands"
    }
    eof {
        kfail "gdb/1489" "run program with breakpoint commands (GDB died)"
    }
}
