#   Copyright 2003, 2007, 2008, 2009, 2010, 2011
#   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 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 prev_timeout $timeout
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)"
    }
}

set timeout $prev_timeout
