# Copyright (C) 1997, 1998, 1999 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

# use this to debug:
#
#log_user 1

# ending-run.exp -- Expect script to test ending a test run in gdb

if $tracelevel then {
    strace $tracelevel
}

set testfile ending-run
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

remote_exec build "rm -f ${binfile}"
remote_exec build "rm -f core"


if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}



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

# CHFts23469: Test that you can "clear" a bp set at
# a line _before_ the routine (which will default to the
# first line in the routine, which turns out to correspond
# to the prolog--that's another bug...)
#
gdb_test "b 1" ".*Breakpoint.*line 1.*" "bpt at line before routine"
gdb_test "b 13" ".*Note.*also.*Breakpoint.*2.*"

# Set up to go to the next-to-last line of the program
#
gdb_test "b 31" ".*Breakpoint.*3.*"

# Expect to hit the bp at line "1", but symbolize this
# as line "13".  Then try to clear it--this should work.
#
if [target_info exists use_gdb_stub] {
  gdb_test "continue" ".*Breakpoint.*1.*callee.*13.*"
} else {
  gdb_test "r" ".*Breakpoint.*1.*callee.*13.*"
}
gdb_test "cle" ".*Deleted breakpoints 2 1.*" "clear worked"
send_gdb "i b\n"
gdb_expect {
    -re ".*breakpoint.*breakpoint.*$gdb_prompt $" { fail "clear bp" }
    -re ".*3.*main.*31.*$gdb_prompt $" { pass "cleared bp at line before routine" }
    -re ".*$gdb_prompt $" { fail "info b" }
}

# Test some other "clear" combinations
#
gdb_test "b 1" ".*Breakpoint.*4.*"
gdb_test "b 13" ".*Note.*also.*Breakpoint.*5.*"
gdb_test "cle 13" ".*Deleted breakpoint 5.*" "Only cleared 1 by line"

send_gdb "inf line 13\n"
gdb_expect {
    -re ".*address (0x\[0-9a-fA-F]*).*$gdb_prompt $" {
        set line_eight $expect_out(1,string)
        gdb_test "b 13" ".*Breakpoint.*6.*"
        gdb_test "cle *$line_eight" ".*Deleted breakpoints 6 4.*" "Clear 2 by address"
    }
    -re ".*$gdb_prompt $" {
        fail "need to fix test for new compile outcome"
    }
}

send_gdb "inf line 14\n"
gdb_expect {
    -re ".*address (0x\[0-9a-fA-F]*).*$gdb_prompt $" {
        set line_nine $expect_out(1,string)
        gdb_test "b 14"       ".*Breakpoint.*7.*"
        gdb_test "b *$line_nine" ".*Note.*also.*Breakpoint.*8.*"
        gdb_test "c" ".*Breakpoint.*7.*callee.*14.*"
        gdb_test "cle" ".*Deleted breakpoints 8 7.*" "Clear 2 by default"
    }
    -re ".*$gdb_prompt $" {
        fail "need to fix test for new compile outcome"
    }
}

send_gdb "i b\n"
gdb_expect {
    -re ".*breakpoint.*breakpoint.*$gdb_prompt $" {
        fail "didn't clear bps" 
    }
    -re ".*3.*main.*31.*$gdb_prompt $" {
        pass "all set to continue"
    }
    -re ".*$gdb_prompt $" {
        fail "missing bp at end"
    }
}


# See if we can step out with control.  The "1 2 3" stuff
# is output from the program.
#
gdb_test "cont" ".*Breakpoint.*31.*"
gdb_test "next" ".*1 2 7 14 23 34 47 62 79  Goodbye!.*32.*" "Step to return"

set old_timeout $timeout
set timeout 50
send_gdb "next\n"
gdb_expect {
    -re "33.*$gdb_prompt $" {
	# sometimes we stop at the closing brace, if so, do another next
	send_gdb "next\n"
	gdb_expect {
	    -re ".*Unable to find return pc for this frame.*$gdb_prompt $" {
		fail "Old bug came back!"
		gdb_test "n" ".*" ""
	    }
	    -re ".*in.*start.*$gdb_prompt $" { 
		pass "step out of main"
	    }
	    -re ".*in .nope ().*$gdb_prompt $" {
		# This is what happens on Solaris currently -sts 1999-08-25
		pass "step out of main on Solaris"
	    }
	    -re ".*in.*\\\$START\\\$.*from.*dld.sl.*$gdb_prompt $" { 
		pass "step out of main"
	    }
            -re ".*$gdb_prompt $" { fail "step at end 2" }
	    timeout { fail "hang or timeout on step at end 2" }
	}
    }
    -re ".*Unable to find return pc for this frame.*$gdb_prompt $" {
        fail "Old bug came back!"
        gdb_test "n" ".*" ""
    }
    -re ".*in.*start.*$gdb_prompt $" { 
        pass "step out of main"
    }
    -re ".*in.*\\\$START\\\$.*from.*dld.sl.*$gdb_prompt $"  {
        pass "step out of main 2"
    }
    -re ".*in.*currently asm.*$gdb_prompt $" { 
        pass "step out of main into assembler"
    }
    -re ".*Program received signal SIGTRAP.*$gdb_prompt $" {
        pass "Cygmon stopped in ending trap."
    }
    -re ".*$gdb_prompt $" { fail "step at end 1" }
    timeout { fail "hang or timeout on step at end 1" }
}

if {![target_info exists use_cygmon] || ![target_info use_cygmon]} {
    send_gdb "n\n"
    gdb_expect {
	-re "Program exited normally.*$gdb_prompt $" {
	    # If we actually have debug info for the start function,
	    # then we won't get the "Single-stepping until function
	    # exit" message.
	    pass "step to end of run 1"
	}
	-re ".*Single.*Program exited.*$gdb_prompt $" {
	    pass "step to end of run 1"
	}
	-re ".*Single.*in exit.*from.*dld.sl.*$gdb_prompt $" {
	    pass "step to end of run 2" 
	    gdb_test "c" ".*" "continue after exit"
	}
	timeout { fail "(timeout) step to end of run" }
    }

  set timeout $old_timeout
  
  gdb_test "n" ".*The program is not being run.*" "don't step after run"
  
  set exec_output [remote_exec host "ls core"]
  
  
  if [ regexp "core not found" $exec_output]  {
    pass "No core dumped on quit"
  } else {
    if [ regexp "No such file or directory" $exec_output] {
      pass "ls: core: No core dumped on quit"
    } else {
      remote_exec build "rm -f core"
      fail "Core dumped on quit"
    }
  }
}

#remote_exec build "rm -f ${binfile}"
return 0




