#   Copyright 1997, 1999, 2007, 2008, 2009, 2010
#   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/>.

if { [is_remote target] || ![isnative] } then {
    continue
}


# 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
##}

global srcfile
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}] != "" } {
     untested foll-vfork.exp
     return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug}] != "" } {
     untested foll-vfork.exp
     return -1
}


# Until "set follow-fork-mode" and "catch vfork" are implemented on
# other targets...
#
if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} 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 check_vfork_catchpoints {} {
  global gdb_prompt
  global has_vfork_catchpoints

  # Verify that the system supports "catch vfork".
  gdb_test "catch vfork" "Catchpoint \[0-9\]* \\(vfork\\)" "insert first vfork catchpoint"
  set has_vfork_catchpoints 0
  gdb_test_multiple "continue" "continue to first vfork catchpoint" {
    -re ".*Your system does not support vfork catchpoints.*$gdb_prompt $" {
      unsupported "continue to first vfork catchpoint"
    }
    -re ".*Catchpoint.*$gdb_prompt $" {
      set has_vfork_catchpoints 1
      pass "continue to first vfork catchpoint"
    }
  }

  if {$has_vfork_catchpoints == 0} {
    unsupported "vfork catchpoints"
    return -code return
  }
}

proc vfork_parent_follow_through_step {} {
   global gdb_prompt

   send_gdb "set follow-fork parent\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow-fork parent, vfork through step"}
      timeout         {fail "set follow-fork 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
   global srcfile

   send_gdb "set follow-fork parent\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow-fork parent, vfork to bp"}
      timeout         {fail "set follow-fork parent, vfork to bp"}
   }
   send_gdb "break ${srcfile}: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 child 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-fork child\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow-fork child, vfork and exec to main bp"}
      timeout         {fail "set follow-fork child, vfork and exec to main bp"}
   }
   send_gdb "continue\n"
   gdb_expect {
      -re "Attaching after.* vfork to.*xecuting 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-fork 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-fork child\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow-fork child, vfork and exec through step"}
      timeout         {fail "set follow-fork child, vfork and exec through step"}
   }
   send_gdb "next\n"
   gdb_expect {
      -re "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-fork parent\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow-fork parent, tcatch vfork"}
      timeout         {fail "set follow-fork 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|__kernel_v?syscall).*$gdb_prompt "\
                      {pass "vfork parent follow, tcatch vfork"}
      -re "vfork \\(\\) at.*$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 "Run till exit from.*__kernel_v?syscall.*0x\[0-9a-fA-F\]* in vfork .*$gdb_prompt " {
	  send_gdb "finish\n"
	  exp_continue
      }
      -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 srcfile
   global srcfile2

   send_gdb "set follow-fork child\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow-fork child, tcatch vfork"}
      timeout         {fail "set follow-fork 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 "vfork \\(\\) at .*$gdb_prompt $"\
                      {pass "vfork child follow, tcatch vfork"}
      -re "0x\[0-9a-fA-F\]*.*(vfork|__kernel_v?syscall).*$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.*${srcfile}:12.*$gdb_prompt "\
                      {pass "vfork child follow, finish after tcatch vfork"}
      -re "Run till exit from.*__kernel_v?syscall.*0x\[0-9a-fA-F\]* in vfork .*$gdb_prompt " {
	  send_gdb "finish\n"
	  exp_continue
      }
      -re "Run till exit from.*vfork.*${srcfile2}:9.*$gdb_prompt "\
                      {pass "vfork child follow, finish after tcatch vfork (followed exec)"}
      -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

   # Check that vfork catchpoints are supported, as an indicator for whether
   # vfork-following is supported.
   if [runto_main] then { check_vfork_catchpoints }

   # 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}

# The "Detaching..." and "Attaching..." messages may be hidden by
# default.
gdb_test_no_output "set verbose"

# 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
