Blob Blame History Raw
Index: valgrind/coregrind/m_gdbserver/m_gdbserver.c
===================================================================
--- valgrind/coregrind/m_gdbserver/m_gdbserver.c	(revision 13036)
+++ valgrind/coregrind/m_gdbserver/m_gdbserver.c	(working copy)
@@ -33,6 +33,8 @@
 #include "pub_core_libcproc.h"
 #include "pub_core_libcprint.h"
 #include "pub_core_mallocfree.h"
+#include "pub_tool_libcsetjmp.h"
+#include "pub_core_threadstate.h"
 #include "pub_core_gdbserver.h"
 #include "pub_core_options.h"
 #include "pub_core_libcsetjmp.h"
@@ -68,7 +70,8 @@
       core_reason,    // gdbserver invocation by core (e.g. error encountered)
       break_reason,   // break encountered
       watch_reason,   // watchpoint detected by tool
-      signal_reason}  // signal encountered
+      signal_reason,  // signal encountered
+      exit_reason}    // process terminated
     CallReason;
 
 static char* ppCallReason(CallReason reason)
@@ -80,6 +83,7 @@
    case break_reason:   return "break_reason";
    case watch_reason:   return "watch_reason";
    case signal_reason:  return "signal_reason";
+   case exit_reason:    return "exit_reason";
    default: vg_assert (0);
    }
 }
@@ -641,6 +645,14 @@
         VG_(getpid) (), tid, VG_(name_of_ThreadStatus)(tst->status),
         tst->sched_jmpbuf_valid);
 
+   /* If we are about to die, then just run server_main() once to get
+      the message out and return immediately because most of the state
+      of this tid and process is about to be torn down. */
+   if (reason == exit_reason) {
+      server_main();
+      return;
+   }
+
    vg_assert(VG_(is_valid_tid)(tid));
    saved_pc = VG_(get_IP) (tid);
 
@@ -933,6 +945,29 @@
    }
 }
 
+void VG_(gdbserver_exit) (ThreadId tid, VgSchedReturnCode tids_schedretcode)
+{
+   dlog(1, "VG core calling VG_(gdbserver_exit) tid %d will exit\n", tid);
+   if (remote_connected()) {
+      /* Make sure vgdb knows we are about to die and why. */
+      if (tids_schedretcode == VgSrc_ExitThread
+          || tids_schedretcode == VgSrc_ExitProcess) {
+         gdbserver_process_exit ('W', VG_(threads)[tid].os_state.exitcode);
+         call_gdbserver (tid, exit_reason);
+      }
+
+      if (tids_schedretcode == VgSrc_FatalSig) {
+         gdbserver_process_exit ('X', VG_(threads)[tid].os_state.fatalsig);
+         call_gdbserver (tid, exit_reason);
+      }
+   } else {
+      dlog(1, "not connected\n");
+   }
+
+   /* Tear down the connection if it still exists. */
+   VG_(gdbserver) (0);
+}
+
 // Check if single_stepping or if there is a break requested at iaddr. 
 // If yes, call debugger
 VG_REGPARM(1)
Index: valgrind/coregrind/m_gdbserver/server.c
===================================================================
--- valgrind/coregrind/m_gdbserver/server.c	(revision 13036)
+++ valgrind/coregrind/m_gdbserver/server.c	(working copy)
@@ -765,6 +765,13 @@
          putpkt (own_buf);
       }
 
+      /* If we our status is terminal (exit or fatal signal) get out
+         as quickly as we can. We won't be able to handle any request
+         anymore.  */
+      if (status == 'W' || status == 'X') {
+         return;
+      }
+
       packet_len = getpkt (own_buf);
       if (packet_len <= 0)
          break;
Index: valgrind/coregrind/m_gdbserver/server.h
===================================================================
--- valgrind/coregrind/m_gdbserver/server.h	(revision 13036)
+++ valgrind/coregrind/m_gdbserver/server.h	(working copy)
@@ -40,9 +40,9 @@
 #include "pub_tool_libcassert.h"
 #include "pub_tool_libcbase.h"
 #include "pub_tool_options.h"
-#include "pub_core_gdbserver.h"
 #include "pub_tool_libcsetjmp.h"
 #include "pub_core_threadstate.h"
+#include "pub_core_gdbserver.h"
 #include "pub_core_aspacemgr.h"
 #include "pub_tool_vki.h"
 #include "valgrind.h"
@@ -208,6 +208,9 @@
    to ignore the signal, so signal can be delivered to the guest. */
 extern Bool gdbserver_deliver_signal (Int vki_sigNo);
 
+/* Called when a process is about to go with reason ('W' or 'X') and code. */
+extern void gdbserver_process_exit (unsigned char status, Int code);
+
 /* To optimise signal handling, gdb can instruct gdbserver to
    not stop on some signals. In the below, a 1 indicates the gdb_nr signal
    has to be passed directly to the guest, without asking gdb.
Index: valgrind/coregrind/m_gdbserver/target.c
===================================================================
--- valgrind/coregrind/m_gdbserver/target.c	(revision 13036)
+++ valgrind/coregrind/m_gdbserver/target.c	(working copy)
@@ -165,6 +165,14 @@
    return vki_sigNo == vki_signal_to_deliver;
 }
 
+static unsigned char exit_status_to_report;
+static int exit_code_to_report;
+void gdbserver_process_exit (unsigned char status, Int code)
+{
+   exit_status_to_report = status;
+   exit_code_to_report = code;
+}
+
 static
 char* sym (Addr addr)
 {
@@ -248,6 +256,7 @@
    unsigned long wptid;
    ThreadState *tst;
    enum target_signal sig;
+   int code;
 
    pid = VG_(getpid) ();
    dlog(1, "enter valgrind_wait pid %d\n", pid);
@@ -255,6 +264,24 @@
    regcache_invalidate();
    valgrind_update_threads(pid);
 
+   /* First see if we are done with this process. */
+   if (exit_status_to_report != 0) {
+      *ourstatus = exit_status_to_report;
+      exit_status_to_report = 0;
+
+      if (*ourstatus == 'W') {
+         code = exit_code_to_report;
+         exit_code_to_report = 0;
+         return code;
+      }
+
+      if (*ourstatus == 'X') {
+         sig = target_signal_from_host(exit_code_to_report);
+         exit_code_to_report = 0;
+         return sig;
+      }
+   }
+
    /* in valgrind, we consider that a wait always succeeds with STOPPED 'T' 
       and with a signal TRAP (i.e. a breakpoint), unless there is
       a signal to report. */
Index: valgrind/coregrind/m_libcprint.c
===================================================================
--- valgrind/coregrind/m_libcprint.c	(revision 13036)
+++ valgrind/coregrind/m_libcprint.c	(working copy)
@@ -31,7 +31,6 @@
 #include "pub_core_basics.h"
 #include "pub_core_vki.h"
 #include "pub_core_debuglog.h"
-#include "pub_core_gdbserver.h"
 #include "pub_core_libcbase.h"
 #include "pub_core_libcassert.h"
 #include "pub_core_libcfile.h"   // VG_(write)(), VG_(write_socket)()
Index: valgrind/coregrind/m_main.c
===================================================================
--- valgrind/coregrind/m_main.c	(revision 13036)
+++ valgrind/coregrind/m_main.c	(working copy)
@@ -2543,7 +2543,7 @@
 
    /* terminate gdbserver if ever it was started. We terminate it here so that it get
       the output above if output was redirected to gdb */
-   VG_(gdbserver) (0);
+   VG_(gdbserver_exit) (tid, tids_schedretcode);
 
    /* Ok, finally exit in the os-specific way, according to the scheduler's
       return code.  In short, if the (last) thread exited by calling
Index: valgrind/coregrind/pub_core_gdbserver.h
===================================================================
--- valgrind/coregrind/pub_core_gdbserver.h	(revision 13036)
+++ valgrind/coregrind/pub_core_gdbserver.h	(working copy)
@@ -48,7 +48,10 @@
 // to handle this incoming vgdb request.                                
 extern Bool VG_(gdbserver_activity) (ThreadId tid);
 
+// Called by low level when the process is about to exit and why.
+void VG_(gdbserver_exit) (ThreadId, VgSchedReturnCode);
 
+
 /* Called by low level to insert or remove a break or watch point.
    Break or watch point implementation is done using help from the tool.
    break point support implies some (small) specific instrumentation
Index: valgrind/gdbserver_tests/Makefile.am
===================================================================
--- valgrind/gdbserver_tests/Makefile.am	(revision 13036)
+++ valgrind/gdbserver_tests/Makefile.am	(working copy)
@@ -100,7 +100,22 @@
 	nlsigvgdb.vgtest \
 	nlsigvgdb.stderr.exp \
 	nlsigvgdb.stderrB.exp \
-	nlsigvgdb.stdinB.gdb
+	nlsigvgdb.stdinB.gdb \
+	gone_abrt.stderr.exp \
+	gone_abrt.stderrB.exp \
+	gone_abrt.stdinB.gdb \
+	gone_abrt.stdoutB.exp \
+	gone_abrt.vgtest \
+	gone_exit.stderr.exp \
+	gone_exit.stderrB.exp \
+	gone_exit.stdinB.gdb \
+	gone_exit.stdoutB.exp \
+	gone_exit.vgtest \
+	gone_return.stderr.exp \
+	gone_return.stderrB.exp \
+	gone_return.stdinB.gdb \
+	gone_return.stdoutB.exp \
+	gone_return.vgtest
 
 check_PROGRAMS = \
 	clean_after_fork \
@@ -109,7 +124,8 @@
 	sleepers \
 	main_pic \
 	t \
-	watchpoints
+	watchpoints \
+	gone
 
 AM_CFLAGS   += $(AM_FLAG_M3264_PRI)
 AM_CXXFLAGS += $(AM_FLAG_M3264_PRI)
Index: valgrind/gdbserver_tests/filter_gdb
===================================================================
--- valgrind/gdbserver_tests/filter_gdb	(revision 13036)
+++ valgrind/gdbserver_tests/filter_gdb	(working copy)
@@ -49,6 +51,8 @@
 #         a.o. produced by gdb 7.2 on arm (same with standard gdbserver)
 #       delete empty lines (the last line (only made of prompts) sometimes
 #           finishes with a new line, sometimes not ???).
+#       'exited with code' and 'exited normally' are printed slightly
+#       differently between gdb versions, normalize to "Program exited...".
 sed -e '/Remote debugging using/,/vgdb launched process attached/d'                                   \
     -e 's/^\[?1034hReading symbols/Reading symbols/'                                                \
     -e '/^Missing separate debuginfo/d'                                                               \
@@ -64,6 +68,8 @@
     -e '/^Loaded symbols for .*$/d'                                                                   \
     -e '/^Current language.*/d'                                                                       \
     -e '/^The current source language is.*/d'                                                         \
+    -e 's/^.*\( exited with code [0-9]\+\).$/Program\1\./g'                              \
+    -e 's/^.*\( exited normally\).$/Program\1\./g'                              \
     -e 's/(gdb) //g'                                                                                  \
     -e 's/^>[> ]*//'                                                                                  \
     -e '/^done\.$/d'                                                                                  \
Index: valgrind/gdbserver_tests/gone.c
===================================================================
--- valgrind/gdbserver_tests/gone.c	(revision 0)
+++ valgrind/gdbserver_tests/gone.c	(working copy)
@@ -0,0 +1,33 @@
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int
+main (int argc, char **argv)
+{
+  fprintf(stderr, "starting ...\n");
+
+  // Three ways of going away...
+  if (argc > 1)
+    {
+      // Explicit exit() with exit code.
+      if (strcmp (argv[1], "exit") == 0)
+	{
+	  fprintf(stderr, "exiting ...\n");
+	  exit (1);
+	}
+
+      // Get killed by a signal.
+      if (strcmp (argv[1], "abort") == 0)
+	{
+	  fprintf(stderr, "aborting ...\n");
+	  kill(getpid(), SIGABRT);
+	}
+    }
+
+  // And finally, just return from main with success.
+  fprintf(stderr, "returning ...\n");
+  return 0;
+}
Index: valgrind/gdbserver_tests/gone_abrt.stderr.exp
===================================================================
--- valgrind/gdbserver_tests/gone_abrt.stderr.exp	(revision 0)
+++ valgrind/gdbserver_tests/gone_abrt.stderr.exp	(working copy)
@@ -0,0 +1,8 @@
+Nulgrind, the minimal Valgrind tool
+
+(action at startup) vgdb me ... 
+
+
+starting ...
+aborting ...
+
Index: valgrind/gdbserver_tests/gone_abrt.stderrB.exp
===================================================================
--- valgrind/gdbserver_tests/gone_abrt.stderrB.exp	(revision 0)
+++ valgrind/gdbserver_tests/gone_abrt.stderrB.exp	(working copy)
@@ -0,0 +1 @@
+relaying data between gdb and process ....
Index: valgrind/gdbserver_tests/gone_abrt.stdinB.gdb
===================================================================
--- valgrind/gdbserver_tests/gone_abrt.stdinB.gdb	(revision 0)
+++ valgrind/gdbserver_tests/gone_abrt.stdinB.gdb	(working copy)
@@ -0,0 +1,9 @@
+# connect gdb to Valgrind gdbserver:
+target remote | ./vgdb --wait=60 --vgdb-prefix=./vgdb-prefix-gone-abrt
+echo vgdb launched process attached\n
+
+continue
+# see process get a fatal signal
+continue
+# see program is gone
+quit
Index: valgrind/gdbserver_tests/gone_abrt.stdoutB.exp
===================================================================
--- valgrind/gdbserver_tests/gone_abrt.stdoutB.exp	(revision 0)
+++ valgrind/gdbserver_tests/gone_abrt.stdoutB.exp	(working copy)
@@ -0,0 +1,7 @@
+vgdb launched process attached
+Continuing.
+Program received signal SIGABRT, Aborted.
+0x........ in syscall ...
+Continuing.
+Program terminated with signal SIGABRT, Aborted.
+The program no longer exists.
Index: valgrind/gdbserver_tests/gone_abrt.vgtest
===================================================================
--- valgrind/gdbserver_tests/gone_abrt.vgtest	(revision 0)
+++ valgrind/gdbserver_tests/gone_abrt.vgtest	(working copy)
@@ -0,0 +1,12 @@
+# test that a fatal SIGABRT signal is properly passed on to gdb.
+
+prog: gone
+args: abort
+vgopts: --tool=none --vgdb=yes --vgdb-error=0 --vgdb-prefix=./vgdb-prefix-gone-abrt
+stderr_filter: filter_stderr
+prereq: test -e gdb
+progB: gdb
+argsB: --quiet -l 60 --nx ./gone
+stdinB: gone_abrt.stdinB.gdb
+stdoutB_filter: filter_gdb
+stderrB_filter: filter_gdb
Index: valgrind/gdbserver_tests/gone_exit.stderr.exp
===================================================================
--- valgrind/gdbserver_tests/gone_exit.stderr.exp	(revision 0)
+++ valgrind/gdbserver_tests/gone_exit.stderr.exp	(working copy)
@@ -0,0 +1,8 @@
+Nulgrind, the minimal Valgrind tool
+
+(action at startup) vgdb me ... 
+
+
+starting ...
+exiting ...
+
Index: valgrind/gdbserver_tests/gone_exit.stderrB.exp
===================================================================
--- valgrind/gdbserver_tests/gone_exit.stderrB.exp	(revision 0)
+++ valgrind/gdbserver_tests/gone_exit.stderrB.exp	(working copy)
@@ -0,0 +1 @@
+relaying data between gdb and process ....
Index: valgrind/gdbserver_tests/gone_exit.stdinB.gdb
===================================================================
--- valgrind/gdbserver_tests/gone_exit.stdinB.gdb	(revision 0)
+++ valgrind/gdbserver_tests/gone_exit.stdinB.gdb	(working copy)
@@ -0,0 +1,7 @@
+# connect gdb to Valgrind gdbserver:
+target remote | ./vgdb --wait=60 --vgdb-prefix=./vgdb-prefix-gone-exit
+echo vgdb launched process attached\n
+
+continue
+# see program is gone with exit code
+quit
Index: valgrind/gdbserver_tests/gone_exit.stdoutB.exp
===================================================================
--- valgrind/gdbserver_tests/gone_exit.stdoutB.exp	(revision 0)
+++ valgrind/gdbserver_tests/gone_exit.stdoutB.exp	(working copy)
@@ -0,0 +1,3 @@
+vgdb launched process attached
+Continuing.
+Program exited with code 01.
Index: valgrind/gdbserver_tests/gone_exit.vgtest
===================================================================
--- valgrind/gdbserver_tests/gone_exit.vgtest	(revision 0)
+++ valgrind/gdbserver_tests/gone_exit.vgtest	(working copy)
@@ -0,0 +1,12 @@
+# test that an exit (with return value) is properly passed on to gdb.
+
+prog: gone
+args: exit
+vgopts: --tool=none --vgdb=yes --vgdb-error=0 --vgdb-prefix=./vgdb-prefix-gone-exit
+stderr_filter: filter_stderr
+prereq: test -e gdb
+progB: gdb
+argsB: --quiet -l 60 --nx ./gone
+stdinB: gone_exit.stdinB.gdb
+stdoutB_filter: filter_gdb
+stderrB_filter: filter_gdb
Index: valgrind/gdbserver_tests/gone_return.stderr.exp
===================================================================
--- valgrind/gdbserver_tests/gone_return.stderr.exp	(revision 0)
+++ valgrind/gdbserver_tests/gone_return.stderr.exp	(working copy)
@@ -0,0 +1,8 @@
+Nulgrind, the minimal Valgrind tool
+
+(action at startup) vgdb me ... 
+
+
+starting ...
+returning ...
+
Index: valgrind/gdbserver_tests/gone_return.stderrB.exp
===================================================================
--- valgrind/gdbserver_tests/gone_return.stderrB.exp	(revision 0)
+++ valgrind/gdbserver_tests/gone_return.stderrB.exp	(working copy)
@@ -0,0 +1 @@
+relaying data between gdb and process ....
Index: valgrind/gdbserver_tests/gone_return.stdinB.gdb
===================================================================
--- valgrind/gdbserver_tests/gone_return.stdinB.gdb	(revision 0)
+++ valgrind/gdbserver_tests/gone_return.stdinB.gdb	(working copy)
@@ -0,0 +1,7 @@
+# connect gdb to Valgrind gdbserver:
+target remote | ./vgdb --wait=60 --vgdb-prefix=./vgdb-prefix-gone-return
+echo vgdb launched process attached\n
+
+continue
+# see program is gone
+quit
Index: valgrind/gdbserver_tests/gone_return.stdoutB.exp
===================================================================
--- valgrind/gdbserver_tests/gone_return.stdoutB.exp	(revision 0)
+++ valgrind/gdbserver_tests/gone_return.stdoutB.exp	(working copy)
@@ -0,0 +1,3 @@
+vgdb launched process attached
+Continuing.
+Program exited normally.
Index: valgrind/gdbserver_tests/gone_return.vgtest
===================================================================
--- valgrind/gdbserver_tests/gone_return.vgtest	(revision 0)
+++ valgrind/gdbserver_tests/gone_return.vgtest	(working copy)
@@ -0,0 +1,12 @@
+# test that a normal (successful) return is properly passed on to gdb.
+
+prog: gone
+args: return
+vgopts: --tool=none --vgdb=yes --vgdb-error=0 --vgdb-prefix=./vgdb-prefix-gone-return
+stderr_filter: filter_stderr
+prereq: test -e gdb
+progB: gdb
+argsB: --quiet -l 60 --nx ./gone
+stdinB: gone_return.stdinB.gdb
+stdoutB_filter: filter_gdb
+stderrB_filter: filter_gdb
Index: valgrind/gdbserver_tests/mcleak.stderrB.exp
===================================================================
--- valgrind/gdbserver_tests/mcleak.stderrB.exp	(revision 13036)
+++ valgrind/gdbserver_tests/mcleak.stderrB.exp	(working copy)
@@ -95,4 +95,3 @@
    by 0x........: f (leak-delta.c:28)
    by 0x........: main (leak-delta.c:60)
 
-Remote connection closed
Index: valgrind/gdbserver_tests/mcleak.stdoutB.exp
===================================================================
--- valgrind/gdbserver_tests/mcleak.stdoutB.exp	(revision 13036)
+++ valgrind/gdbserver_tests/mcleak.stdoutB.exp	(working copy)
@@ -45,3 +45,4 @@
 #1  0x........ in f () at leak-delta.c:48
 48	   fprintf(stderr, "expecting details 32 (+32) bytes lost, 33 (-32) bytes reachable\n"); fflush(stderr); breakme();
 Continuing.
+Program exited normally.
Index: valgrind/gdbserver_tests/mcmain_pic.stderrB.exp
===================================================================
--- valgrind/gdbserver_tests/mcmain_pic.stderrB.exp	(revision 13036)
+++ valgrind/gdbserver_tests/mcmain_pic.stderrB.exp	(working copy)
@@ -1,3 +1,2 @@
 relaying data between gdb and process ....
 vgdb-error value changed from 0 to 999999
-Remote connection closed
Index: valgrind/gdbserver_tests/mcmain_pic.stdoutB.exp
===================================================================
--- valgrind/gdbserver_tests/mcmain_pic.stdoutB.exp	(revision 13036)
+++ valgrind/gdbserver_tests/mcmain_pic.stdoutB.exp	(working copy)
@@ -6,3 +6,4 @@
 $2 = (int (*)(int, char **)) 0x........ <main>
 $3 = (void (*)(char *)) 0x........ <another_func>
 Continuing.
+Program exited normally.
Index: valgrind/gdbserver_tests/mcwatchpoints.stdoutB.exp
===================================================================
--- valgrind/gdbserver_tests/mcwatchpoints.stdoutB.exp	(revision 13036)
+++ valgrind/gdbserver_tests/mcwatchpoints.stdoutB.exp	(working copy)
@@ -32,3 +32,4 @@
 49	   fprintf(stderr, "after writing 8\n");
 Delete all breakpoints? (y or n) [answered Y; input not from terminal]
 Continuing.
+Program exited normally.
Index: valgrind/gdbserver_tests/nlcontrolc.stdoutB.exp
===================================================================
--- valgrind/gdbserver_tests/nlcontrolc.stdoutB.exp	(revision 13036)
+++ valgrind/gdbserver_tests/nlcontrolc.stdoutB.exp	(working copy)
@@ -21,3 +21,4 @@
 $6 = 0
 $7 = 0
 Continuing.
+Program exited normally.
Index: valgrind/gdbserver_tests/nlpasssigalrm.stderrB.exp
===================================================================
--- valgrind/gdbserver_tests/nlpasssigalrm.stderrB.exp	(revision 13036)
+++ valgrind/gdbserver_tests/nlpasssigalrm.stderrB.exp	(working copy)
@@ -1,3 +1,2 @@
 relaying data between gdb and process ....
 vgdb-error value changed from 0 to 999999
-Remote connection closed
Index: valgrind/gdbserver_tests/nlpasssigalrm.stdoutB.exp
===================================================================
--- valgrind/gdbserver_tests/nlpasssigalrm.stdoutB.exp	(revision 13036)
+++ valgrind/gdbserver_tests/nlpasssigalrm.stdoutB.exp	(working copy)
@@ -19,3 +19,4 @@
 Program received signal SIG34, Real-time event 34.
 0x........ in syscall ...
 Continuing.
+Program exited normally.
--- valgrind-3.8.1/gdbserver_tests/Makefile.in.orig	2012-10-13 16:35:43.846865557 +0200
+++ valgrind-3.8.1/gdbserver_tests/Makefile.in	2012-10-13 16:36:37.445641004 +0200
@@ -56,7 +56,7 @@
 
 check_PROGRAMS = clean_after_fork$(EXEEXT) fork_chain$(EXEEXT) \
 	passsigalrm$(EXEEXT) sleepers$(EXEEXT) main_pic$(EXEEXT) \
-	t$(EXEEXT) watchpoints$(EXEEXT)
+	t$(EXEEXT) watchpoints$(EXEEXT) gone$(EXEEXT)
 subdir = gdbserver_tests
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/configure.in
@@ -74,6 +74,10 @@
 fork_chain_OBJECTS = fork_chain.$(OBJEXT)
 fork_chain_LDADD = $(LDADD)
 fork_chain_DEPENDENCIES =
+gone_SOURCES = gone.c
+gone_OBJECTS = gone.$(OBJEXT)
+gone_LDADD = $(LDADD)
+gone_DEPENDENCIES =
 main_pic_SOURCES = main_pic.c
 main_pic_OBJECTS = main_pic-main_pic.$(OBJEXT)
 main_pic_LDADD = $(LDADD)
@@ -105,9 +109,9 @@
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = clean_after_fork.c fork_chain.c main_pic.c passsigalrm.c \
-	sleepers.c t.c watchpoints.c
-DIST_SOURCES = clean_after_fork.c fork_chain.c main_pic.c \
+SOURCES = clean_after_fork.c fork_chain.c gone.c main_pic.c \
+	passsigalrm.c sleepers.c t.c watchpoints.c
+DIST_SOURCES = clean_after_fork.c fork_chain.c gone.c main_pic.c \
 	passsigalrm.c sleepers.c t.c watchpoints.c
 ETAGS = etags
 CTAGS = ctags
@@ -487,7 +491,22 @@
 	nlsigvgdb.vgtest \
 	nlsigvgdb.stderr.exp \
 	nlsigvgdb.stderrB.exp \
-	nlsigvgdb.stdinB.gdb
+	nlsigvgdb.stdinB.gdb \
+	gone_abrt.stderr.exp \
+	gone_abrt.stderrB.exp \
+	gone_abrt.stdinB.gdb \
+	gone_abrt.stdoutB.exp \
+	gone_abrt.vgtest \
+	gone_exit.stderr.exp \
+	gone_exit.stderrB.exp \
+	gone_exit.stdinB.gdb \
+	gone_exit.stdoutB.exp \
+	gone_exit.vgtest \
+	gone_return.stderr.exp \
+	gone_return.stderrB.exp \
+	gone_return.stdinB.gdb \
+	gone_return.stdoutB.exp \
+	gone_return.vgtest
 
 LDADD = -lpthread
 main_pic_LDFLAGS = -pie
@@ -535,6 +554,9 @@
 fork_chain$(EXEEXT): $(fork_chain_OBJECTS) $(fork_chain_DEPENDENCIES) 
 	@rm -f fork_chain$(EXEEXT)
 	$(LINK) $(fork_chain_OBJECTS) $(fork_chain_LDADD) $(LIBS)
+gone$(EXEEXT): $(gone_OBJECTS) $(gone_DEPENDENCIES) 
+	@rm -f gone$(EXEEXT)
+	$(LINK) $(gone_OBJECTS) $(gone_LDADD) $(LIBS)
 main_pic$(EXEEXT): $(main_pic_OBJECTS) $(main_pic_DEPENDENCIES) 
 	@rm -f main_pic$(EXEEXT)
 	$(main_pic_LINK) $(main_pic_OBJECTS) $(main_pic_LDADD) $(LIBS)
@@ -559,6 +581,7 @@
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clean_after_fork.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fork_chain.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gone.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main_pic-main_pic.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passsigalrm.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sleepers.Po@am__quote@