#   Copyright 1997, 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

if $tracelevel then {
	strace $tracelevel
	}

if { ![isnative] } then {
    continue
}

set prms_id 0
set bug_id 0

# NOTE drow/2002-12-06: I don't know what the referenced kernel problem
# is, but it appears to be fixed in recent HP/UX versions.

##if [istarget "hppa2.0w-hp-hpux*"] {
##  warning "Don't run gdb.base/foll-vfork.exp until JAGaa43495 kernel problem is fixed."
##  return 0
##}

set testfile "foll-vfork"
set testfile2 "vforked-prog"
set srcfile ${testfile}.c
set srcfile2 ${testfile2}.c
set binfile ${objdir}/${subdir}/${testfile}
set binfile2 ${objdir}/${subdir}/${testfile2}

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."
}

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


# Until "set follow-fork-mode" and "catch vfork" are implemented on
# other targets...
#
if ![istarget "hppa*-hp-hpux*"] then {
    continue
}

# Test to see if we are on an HP-UX 10.20 and if so,
# do not run these tests as catching vfork is disabled for
# 10.20.

if [istarget "hppa*-hp-hpux10.20"] then {
    return 0
}

# A few of these tests require a little more time than the standard
# timeout allows.
set oldtimeout $timeout
set timeout [expr "$timeout + 10"]

proc vfork_parent_follow_through_step {} {
   global gdb_prompt

   send_gdb "set follow parent\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow parent, vfork through step"}
      timeout         {fail "set follow parent, vfork through step"}
   }
   send_gdb "next\n"
   gdb_expect {
      -re "Detaching after fork from.*13.*$gdb_prompt "\
                      {pass "vfork parent follow, through step"}
      -re "$gdb_prompt $" {fail "vfork parent follow, through step"}
      timeout         {fail "(timeout) vfork parent follow, through step" }
   }
   # The child has been detached; allow time for any output it might
   # generate to arrive, so that output doesn't get confused with
   # any gdb_expected debugger output from a subsequent testpoint.
   #
   exec sleep 1
}

proc vfork_parent_follow_to_bp {} {
   global gdb_prompt

   send_gdb "set follow parent\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow parent, vfork to bp"}
      timeout         {fail "set follow parent, vfork to bp"}
   }
   send_gdb "break 18\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "break, vfork to bp"}
      timeout         {fail "break, vfork to bp"}
   }
   send_gdb "continue\n"
   gdb_expect {
      -re ".*Detaching after fork from process.*Breakpoint.*18.*$gdb_prompt "\
                      {pass "vfork parent follow, to bp"}
      -re "$gdb_prompt $" {fail "vfork parent follow, to bp"}
      timeout         {fail "(timeout) vfork parent follow, to bp" }
   }
   # The child has been detached; allow time for any output it might
   # generate to arrive, so that output doesn't get confused with
   # any expected debugger output from a subsequent testpoint.
   #
   exec sleep 1
}

proc vfork_and_exec_child_follow_to_main_bp {} {
   global gdb_prompt
   global binfile

   send_gdb "set follow child\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow child, vfork and exec to main bp"}
      timeout         {fail "set follow child, vfork and exec to main bp"}
   }
   send_gdb "continue\n"
   gdb_expect {
      -re "Detaching from program.*Attaching after fork to.*Executing new program.*Breakpoint.*vforked-prog.c:9.*$gdb_prompt "\
                      {pass "vfork and exec child follow, to main bp"}
      -re "$gdb_prompt $" {fail "vfork and exec child follow, to main bp"}
      timeout         {fail "(timeout) vfork and exec child follow, to main bp" }
   }
   # The parent has been detached; allow time for any output it might
   # generate to arrive, so that output doesn't get confused with
   # any gdb_expected debugger output from a subsequent testpoint.
   #
   exec sleep 1

   # Explicitly kill this child, or a subsequent rerun actually runs
   # the exec'd child, not the original program...
   send_gdb "kill\n"
   gdb_expect {
      -re ".*Kill the program being debugged.*y or n. $" {
         send_gdb "y\n"
         send_gdb "file $binfile\n"
         gdb_expect {
            -re ".*Load new symbol table from.*y or n. $" {
               send_gdb "y\n"
               gdb_expect {
                  -re "Reading symbols from.*$gdb_prompt $" {}
                  timeout { fail "loading symbols (timeout)"; return }
               }
            }
            -re ".*gdb_prompt $" {}
            timeout { fail "loading symbols (timeout)"; return }
          }
      }
      -re ".*$gdb_prompt $" {}
      timeout { fail "killing inferior (timeout)" ; return }
    }
}

proc vfork_and_exec_child_follow_through_step {} {
   global gdb_prompt
   global binfile

# This test cannot be performed prior to HP-UX 10.30, because ptrace-based
# debugging of a vforking program basically doesn't allow the child to do
# things like hit a breakpoint between a vfork and exec.  This means that
# saying "set follow child; next" at a vfork() call won't work, because
# the implementation of "next" sets a "step resume" breakpoint at the
# return from the vfork(), which the child will hit on its way to exec'ing.
#
   if { ![istarget "hppa*-*-hpux11.*"] } {
      verbose "vfork child-following next test ignored for non-hppa or pre-HP/UX-10.30 targets."
      return 0
   }

   send_gdb "set follow child\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow child, vfork and exec through step"}
      timeout         {fail "set follow child, vfork and exec through step"}
   }
   send_gdb "next\n"
   gdb_expect {
      -re "Detaching from program.*Attaching after fork to.*Executing new program.*Breakpoint.*vforked-prog.c:9.*$gdb_prompt "\
                      {pass "vfork and exec child follow, through step"}
      -re "$gdb_prompt $" {fail "vfork and exec child follow, through step"}
      timeout         {fail "(timeout) vfork and exec child follow, through step" }
   }
   # The parent has been detached; allow time for any output it might
   # generate to arrive, so that output doesn't get confused with
   # any expected debugger output from a subsequent testpoint.
   #
   exec sleep 1

   # Explicitly kill this child, or a subsequent rerun actually runs
   # the exec'd child, not the original program...
   send_gdb "kill\n"
   gdb_expect {
      -re ".*Kill the program being debugged.*y or n. $" {
         send_gdb "y\n"
         send_gdb "file $binfile\n"
         gdb_expect {
            -re ".*Load new symbol table from.*y or n. $" {
               send_gdb "y\n"
               gdb_expect {
                  -re "Reading symbols from.*$gdb_prompt $" {}
                  timeout { fail "loading symbols (timeout)"; return }
               }
            }
            -re ".*gdb_prompt $" {}
            timeout { fail "loading symbols (timeout)"; return }
          }
      }
      -re ".*$gdb_prompt $" {}
      timeout { fail "killing inferior (timeout)" ; return }
    }
}

proc tcatch_vfork_then_parent_follow {} {
   global gdb_prompt
   global srcfile

   send_gdb "set follow parent\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow parent, tcatch vfork"}
      timeout         {fail "set follow parent, tcatch vfork"}
   }
   send_gdb "tcatch vfork\n"
   gdb_expect {
      -re "Catchpoint .*(vfork).*$gdb_prompt $"\
                      {pass "vfork parent follow, set tcatch vfork"}
      -re "$gdb_prompt $" {fail "vfork parent follow, set tcatch vfork"}
      timeout         {fail "(timeout) vfork parent follow, set tcatch vfork"}
   }
   send_gdb "continue\n"
# HP-UX 10.20 seems to stop you in "vfork", while more recent HP-UXs
# stop you in "_vfork".
   gdb_expect {
      -re "0x\[0-9a-fA-F\]*.*vfork.*$gdb_prompt "\
                      {pass "vfork parent follow, tcatch vfork"}
      -re "0x\[0-9a-fA-F\]*.*_vfork.*$gdb_prompt "\
                      {pass "vfork parent follow, tcatch vfork"}
      -re "$gdb_prompt $" {fail "vfork parent follow, tcatch vfork"}
      timeout         {fail "(timeout) vfork parent follow, tcatch vfork"}
   }
   send_gdb "finish\n"
   gdb_expect {
      -re "Run till exit from.*vfork.*0x\[0-9a-fA-F\]* in main .* at .*${srcfile}:12.*$gdb_prompt "\
                      {pass "vfork parent follow, finish after tcatch vfork"}
      -re "$gdb_prompt $" {fail "vfork parent follow, finish after tcatch vfork"}
      timeout         {fail "(timeout) vfork parent follow, finish after tcatch vfork" }
   }
   # The child has been detached; allow time for any output it might
   # generate to arrive, so that output doesn't get confused with
   # any expected debugger output from a subsequent testpoint.
   #
   exec sleep 1
}

proc tcatch_vfork_then_child_follow {} {
   global gdb_prompt
   global srcfile2

   send_gdb "set follow child\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow child, tcatch vfork"}
      timeout         {fail "set follow child, tcatch vfork"}
   }
   send_gdb "tcatch vfork\n"
   gdb_expect {
      -re "Catchpoint .*(vfork).*$gdb_prompt $"\
                      {pass "vfork child follow, set tcatch vfork"}
      -re "$gdb_prompt $" {fail "vfork child follow, set tcatch vfork"}
      timeout         {fail "(timeout) vfork child follow, set tcatch vfork"}
   }
   send_gdb "continue\n"
# HP-UX 10.20 seems to stop you in "vfork", while more recent HP-UXs
# stop you in "_vfork".
   gdb_expect {
      -re "0x\[0-9a-fA-F\]*.*vfork.*$gdb_prompt "\
                      {pass "vfork child follow, tcatch vfork"}
      -re "0x\[0-9a-fA-F\]*.*_vfork.*$gdb_prompt "\
                      {pass "vfork child follow, tcatch vfork"}
      -re "$gdb_prompt $" {fail "vfork child follow, tcatch vfork"}
      timeout         {fail "(timeout) vfork child follow, tcatch vfork"}
   }
   send_gdb "finish\n"
   gdb_expect {
      -re "Run till exit from.*vfork.*${srcfile2}:9.*$gdb_prompt "\
                      {pass "vfork child follow, finish after tcatch vfork"}
      -re "$gdb_prompt $" {fail "vfork child follow, finish after tcatch vfork"}
      timeout         {fail "(timeout) vfork child follow, finish after tcatch vfork" }
   }
   # The parent has been detached; allow time for any output it might
   # generate to arrive, so that output doesn't get confused with
   # any expected debugger output from a subsequent testpoint.
   #
   exec sleep 1
}

proc do_vfork_and_exec_tests {} {
   global gdb_prompt

   # Try following the parent process by stepping through a call to
   # vfork.  Do this without catchpoints.
   if [runto_main] then { vfork_parent_follow_through_step }

   # Try following the parent process by setting a breakpoint on the
   # other side of a vfork, and running to that point.  Do this
   # without catchpoints.
   if [runto_main] then { vfork_parent_follow_to_bp }

   # Try following the child process by just continuing through the
   # vfork, and letting the parent's breakpoint on "main" be auto-
   # magically reset in the child.
   #
   if [runto_main] then { vfork_and_exec_child_follow_to_main_bp }

   # Try following the child process by stepping through a call to
   # vfork.  The child also executes an exec.  Since the child cannot
   # be debugged until after it has exec'd, and since there's a bp on
   # "main" in the parent, and since the bp's for the parent are
   # recomputed in the exec'd child, the step through a vfork should
   # land us in the "main" for the exec'd child, too.
   #
   if [runto_main] then { vfork_and_exec_child_follow_through_step }

   # Try catching a vfork, and stepping out to the parent.
   #
   if [runto_main] then { tcatch_vfork_then_parent_follow }

   # Try catching a vfork, and stepping out to the child.
   #
   if [runto_main] then { tcatch_vfork_then_child_follow }

   # Test the ability to follow both child and parent of a vfork.  Do
   # this without catchpoints.
   # ??rehrauer: NYI.  Will add testpoints here when implemented.
   #

   # Test the ability to have the debugger ask the user at vfork-time
   # whether to follow the parent, child or both.  Do this without
   # catchpoints.
   # ??rehrauer: NYI.  Will add testpoints here when implemented.
   #
}

# Start with a fresh gdb

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


# This is a test of gdb's ability to follow the parent or child
# of a Unix vfork() system call.  (The child will subsequently
# call a variant of a Unix exec() system call.)
#
do_vfork_and_exec_tests

set timeout $oldtimeout
return 0
