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

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# Test MI output with synthetic frames on the stack (call dummies,
# signal handlers).

if [target_info exists gdb,nosignals] {
    verbose "Skipping mi-syn-frame.exp because of nosignals."
    continue
}

load_lib mi-support.exp
set MIFLAGS "-i=mi1"

set testfile "mi-syn-frame"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

set my_mi_gdb_prompt "\\(gdb\\)\[ \]*\[\r\n\]*"

mi_gdb_exit

mi_gdb_start separate-inferior-tty
mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}

mi_run_to_main

mi_gdb_test "400-break-insert foo" \
  "400\\^done,bkpt=\{number=\"2\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"$hex\",func=\"foo\",file=\".*mi-syn-frame.c\",line=\"$decimal\",shlib=\"$binfile\",times=\"0\"\}" \
  "insert breakpoint foo"

#
# Call foo() by hand, where we'll hit a breakpoint.
#

# APPLE LOCAL [breakpoint-hit]: We emit a TIMES field. 
mi_gdb_test "401-interpreter-exec console-quoted \"p foo()\"" ".*Breakpoint .*2.*401\\^error,msg=\"The program being debugged stopped while in a function called from GDB.\\\\nWhen the function .foo. is done executing, GDB will silently\\\\nstop .instead of continuing to evaluate the expression containing\\\\nthe function call.\\.\""

mi_gdb_test "402-stack-list-frames" "402\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",fp=\"$hex\",func=\"foo\",optimized=\"0\",file=\".*mi-syn-frame.c\",line=\"$decimal\".*\},frame=\{level=\"1\",addr=\"$hex\",fp=\"$hex\",func=\"<function called from gdb>\".*\},frame=\{level=\"2\",addr=\"$hex\",fp=\"$hex\",func=\"main\",optimized=\"0\",file=\".*mi-syn-frame.c\",line=\"$decimal\".*\}.*\\\]" "backtrace from inferior function stopped at bp, showing gdb dummy frame"

#
# Continue back to main()
#

mi_gdb_test "403-exec-continue" \
  "403\\^running\[\r\n\]+${my_mi_gdb_prompt}403\\\*stopped" \
  "testing exec continue" \
  "hi in foo\[\r\n\]\+"

# APPLE LOCAL we emit extra fields
mi_gdb_test "404-stack-list-frames 0 0" \
  "404\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",fp=\"$hex\",func=\"main\",optimized=\"0\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\".*\}.*\\\]" \
  "list stack frames 1"

#
# Call have_a_very_merry_interrupt() which will eventually raise a signal
# that's caught by handler() which calls subroutine().

# APPLE LOCAL we emit a shlib field
mi_gdb_test "405-break-insert subroutine" \
  "405\\^done,bkpt=\{number=\"3\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"$hex\",func=\"subroutine\",file=\".*mi-syn-frame.c\",line=\"$decimal\",shlib=\"$binfile\",times=\"0\"\}" \
  "insert breakpoint subroutine"

# APPLE LOCAL no excess error output
mi_gdb_test "406-interpreter-exec console-quoted \"p have_a_very_merry_interrupt()\"" \
  "406\\^error,msg=\"The program being debugged stopped while in a function called from GDB.\\\\nWhen the function \\(have_a_very_merry_interrupt\\) is done executing, GDB will silently\\\\nstop \\(instead of continuing to evaluate the expression containing\\\\nthe function call\\).*\"" \
  "data evaluate expression" \
  "Waiting to get a signal\[\r\n\]+"

# We should have both a signal handler and a call dummy frame
# in this next output.

# APPLE LOCAL added to mi backtrace
mi_gdb_test "407-stack-list-frames" \
  "407\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",fp=\"$hex\",func=\"subroutine\",optimized=\"0\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\".*\},frame=\{level=\"1\",addr=\"$hex\",fp=\"$hex\",func=\"handler\",optimized=\"0\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\".*\},frame=\{level=\"2\",addr=\"$hex\",fp=\"$hex\",func=\"<signal handler called>\"\},.*frame=\{level=\"$decimal\".*,addr=\"$hex\",fp=\"$hex\",func=\"have_a_very_merry_interrupt\",optimized=\"0\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\".*\},frame=\{level=\"$decimal\".*,addr=\"$hex\",fp=\"$hex\",func=\"<function called from gdb>\"\},frame=\{level=\"$decimal\".*,addr=\"$hex\",fp=\"$hex\",func=\"main\",optimized=\"0\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\".*\}.*\\\]" \
  "list stack frames 2"

mi_gdb_test "408-exec-continue" \
  "408\\^running\[\r\n\]+${my_mi_gdb_prompt}408\\\*stopped"

# APPLE LOCAL added to mi backtrace
mi_gdb_test "409-stack-list-frames 0 0" \
  "409\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",fp=\"$hex\",func=\"main\",optimized=\"0\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\".*\}.*\\\]" \
  "list stack frames 3"

#
# Call bar() by hand, which should get an exception while running.
# 

mi_gdb_test "410-data-evaluate-expression bar()" \
  "410\\^error,msg=\"The program being debugged was signaled while in a function called from GDB.\\\\nGDB remains in the frame where the signal was received.\\\\nTo change this behavior use \\\\\"set unwindonsignal on\\\\\"\\\\nEvaluation of the expression containing the function \\(bar\\) will be abandoned.\",reason=\"signal-received\",signal-name=\".*\",signal-meaning=\".*\",thread-id=\"$decimal\"" \
  "call inferior function which raises exception" \
  "hi in bar\[\r\n\]+"

# APPLE LOCAL added to mi backtrace
mi_gdb_test "411-stack-list-frames" "411\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",fp=\"$hex\",func=\"bar\",optimized=\"0\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\".*},frame=\{level=\"1\",addr=\"$hex\",fp=\"$hex\",func=\"<function called from gdb>\"\},frame=\{level=\"2\",addr=\"$hex\",fp=\"$hex\",func=\"main\",optimized=\"0\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\".*}.*\\\]" "backtrace from inferior function at exception"

mi_gdb_exit

return 0
