Killed the terminally wounded --stop-after option.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2238 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/Makefile.am b/coregrind/Makefile.am
index 4a3ecf8..f865eee 100644
--- a/coregrind/Makefile.am
+++ b/coregrind/Makefile.am
@@ -63,7 +63,6 @@
 	vg_proxylwp.c \
 	vg_dummy_profile.c \
 	vg_signals.c \
-	vg_startup.S \
 	vg_symtab2.c \
 	vg_dwarf.c \
 	vg_stabs.c \
diff --git a/coregrind/docs/coregrind_core.html b/coregrind/docs/coregrind_core.html
index a0aaa33..24deff8 100644
--- a/coregrind/docs/coregrind_core.html
+++ b/coregrind/docs/coregrind_core.html
@@ -924,13 +924,6 @@
       </li><br>
       <p>
 
-  <li><code>--stop-after=&lt;number></code> 
-      [default: infinity, more or less]
-      <p>After &lt;number> basic blocks have been executed, shut down
-      Valgrind and switch back to running the client on the real CPU.
-      </li><br>
-      <p>
-
   <li><code>--dump-error=&lt;number></code> [default: inactive]
       <p>After the program has exited, show gory details of the
       translation of the basic block containing the &lt;number>'th
diff --git a/coregrind/vg_include.h b/coregrind/vg_include.h
index ba5a364..c2d46b4 100644
--- a/coregrind/vg_include.h
+++ b/coregrind/vg_include.h
@@ -243,8 +243,6 @@
 /* DEBUG: print pthread (mutex etc) events?  default: 0 (none), 1
    (some), 2 (all) */
 extern Int   VG_(clo_trace_pthread_level);
-/* Stop after this many basic blocks.  default: Infinity. */
-extern ULong VG_(clo_stop_after);
 /* Display gory details for the k'th most popular error.  default:
    Infinity. */
 extern Int   VG_(clo_dump_error);
@@ -822,7 +820,7 @@
       registers are not shadowed.
 
       Although the segment registers are 16 bits long, storage
-      management here, in VG_(baseBlock) and in VG_(m_state_static) is
+      management here and in VG_(baseBlock) is
       simplified if we pretend they are 32 bits. */
    UInt m_cs;
    UInt m_ss;
@@ -910,8 +908,6 @@
                             even if we wait for a long time */
       VgSrc_ExitSyscall, /* client called exit().  This is the normal
                             route out. */
-      VgSrc_BbsDone,     /* In a debugging run, the specified number of
-                            bbs has been completed. */
       VgSrc_FatalSig	 /* Killed by the default action of a fatal
 			    signal */
    }
@@ -1336,7 +1332,7 @@
 
 /* Is this a SSE/SSE2-capable CPU?  If so, we had better save/restore
    the SSE state all over the place.  This is set up very early, in
-   vg_startup.S.  We have to determine it early since we can't even
+   main().  We have to determine it early since we can't even
    correctly snapshot the startup machine state without it. */
 extern Bool VG_(have_ssestate);
 
@@ -1372,25 +1368,6 @@
 /* Path to all our library/aux files */
 extern const Char *VG_(libdir);
 
-/* A structure used as an intermediary when passing the simulated
-   CPU's state to VG_(switch_to_real_CPU)(), for --stop-after=yes.
-   Stuff is copied from baseBlock to here, because it's much easier
-   to copy the state into the real registers from this structure than
-   the baseBlock, because it's layout is simpler.
-   Alignment: the SSE state must be 16-byte aligned.  We ask for the whole
-   struct to be 16-byte aligned, and the SSE state starts at the 6+8+1+1th
-   == 16th word, so it too must be 16-byte aligned.  Consequence: change
-   this struct only _very carefully_ !  See also above comment re masking
-   MXCSR. 
-*/
-__attribute__ ((aligned (16)))
-extern UInt VG_(m_state_static) [6 /* segment regs, Intel order */
-                                 + 8 /* int regs, in Intel order */ 
-                                 + 1 /* %eflags */ 
-                                 + 1 /* %eip */
-                                 + VG_SIZE_OF_SSESTATE_W /* SSE state */
-                                ];
-
 /* Determine if %esp adjustment must be noted */
 extern Bool VG_(need_to_handle_esp_assignment) ( void );
 
@@ -1643,12 +1620,6 @@
 			Int *child_tid, Int *parent_tid);
 
 /* ---------------------------------------------------------------------
-   Exports of vg_startup.S
-   ------------------------------------------------------------------ */
-
-extern void VG_(switch_to_real_CPU) ( void );
-
-/* ---------------------------------------------------------------------
    Exports of vg_dispatch.S
    ------------------------------------------------------------------ */
 
diff --git a/coregrind/vg_main.c b/coregrind/vg_main.c
index ebbb33a..08a6fe4 100644
--- a/coregrind/vg_main.c
+++ b/coregrind/vg_main.c
@@ -163,8 +163,6 @@
 
 /* 64-bit counter for the number of basic blocks done. */
 ULong VG_(bbs_done);
-/* 64-bit counter for the number of bbs to go before a debug exit. */
-ULong VG_(bbs_to_go);
 
 /* This is the ThreadId of the last thread the scheduler ran. */
 ThreadId VG_(last_run_tid) = 0;
@@ -1425,7 +1423,6 @@
 Bool   VG_(clo_trace_symtab)   = False;
 Bool   VG_(clo_trace_sched)    = False;
 Int    VG_(clo_trace_pthread_level) = 0;
-ULong  VG_(clo_stop_after)     = 1000000000000000LL;
 Int    VG_(clo_dump_error)     = 0;
 Int    VG_(clo_backtrace_size) = 4;
 Char*  VG_(clo_weird_hacks)    = NULL;
@@ -1528,8 +1525,6 @@
 "    --trace-symtab=no|yes     show symbol table details? [no]\n"
 "    --trace-sched=no|yes      show thread scheduler details? [no]\n"
 "    --trace-pthread=none|some|all  show pthread event details? [none]\n"
-"    --stop-after=<number>     switch to real CPU after executing\n"
-"                              <number> basic blocks [infinity]\n"
 "    --wait-for-gdb=yes|no     pause on startup to wait for gdb attach\n"
 "\n"
 "  debugging options for Valgrind tools that report errors\n"
@@ -1860,9 +1855,6 @@
       else if (VG_CLO_STREQ(arg, "--lowlat-syscalls=no"))
 	 VG_(clo_lowlat_syscalls) = False;
 
-      else if (VG_CLO_STREQN(13, arg, "--stop-after="))
-         VG_(clo_stop_after) = VG_(atoll)(&arg[13]);
-
       else if (VG_CLO_STREQN(13, arg, "--dump-error="))
          VG_(clo_dump_error) = (Int)VG_(atoll)(&arg[13]);
 
@@ -2058,8 +2050,6 @@
       config_error("Can't use --gen-suppressions=yes with this skin,\n"
                    "   as it doesn't generate errors.");
    }
-
-   VG_(bbs_to_go) = VG_(clo_stop_after);
 }
 
 
@@ -2098,7 +2088,7 @@
 
 
 /*====================================================================*/
-/*=== m_state_static + baseBlock: definition, setup, copying       ===*/
+/*=== baseBlock: definition + setup                                ===*/
 /*====================================================================*/
 
 /* The variables storing offsets. */
@@ -2188,15 +2178,6 @@
 /* This is the actual defn of baseblock. */
 UInt VG_(baseBlock)[VG_BASEBLOCK_WORDS];
 
-/* See comment about this in vg_include.h.  Change only with great care. */
-__attribute__ ((aligned (16)))
-UInt VG_(m_state_static) [6 /* segment regs, Intel order */
-                          + 8 /* int regs, in Intel order */ 
-                          + 1 /* %eflags */ 
-                          + 1 /* %eip */
-                          + VG_SIZE_OF_SSESTATE_W /* FPU state */
-                         ];
-
 /* Words. */
 static Int baB_off = 0;
 
@@ -2224,36 +2205,6 @@
    return ret;
 }
 
-static void copy_baseBlock_to_m_state_static( void )
-{
-   Int i;
-   VG_(m_state_static)[ 0/4] = VG_(baseBlock)[VGOFF_(m_cs)];
-   VG_(m_state_static)[ 4/4] = VG_(baseBlock)[VGOFF_(m_ss)];
-   VG_(m_state_static)[ 8/4] = VG_(baseBlock)[VGOFF_(m_ds)];
-   VG_(m_state_static)[12/4] = VG_(baseBlock)[VGOFF_(m_es)];
-   VG_(m_state_static)[16/4] = VG_(baseBlock)[VGOFF_(m_fs)];
-   VG_(m_state_static)[20/4] = VG_(baseBlock)[VGOFF_(m_gs)];
-
-   VG_(m_state_static)[24/4] = VG_(baseBlock)[VGOFF_(m_eax)];
-   VG_(m_state_static)[28/4] = VG_(baseBlock)[VGOFF_(m_ecx)];
-   VG_(m_state_static)[32/4] = VG_(baseBlock)[VGOFF_(m_edx)];
-   VG_(m_state_static)[36/4] = VG_(baseBlock)[VGOFF_(m_ebx)];
-   VG_(m_state_static)[40/4] = VG_(baseBlock)[VGOFF_(m_esp)];
-   VG_(m_state_static)[44/4] = VG_(baseBlock)[VGOFF_(m_ebp)];
-   VG_(m_state_static)[48/4] = VG_(baseBlock)[VGOFF_(m_esi)];
-   VG_(m_state_static)[52/4] = VG_(baseBlock)[VGOFF_(m_edi)];
-
-   VG_(m_state_static)[56/4] 
-      = VG_(insertDflag)(VG_(baseBlock)[VGOFF_(m_eflags)],
-                         VG_(baseBlock)[VGOFF_(m_dflag)]);
-   VG_(m_state_static)[60/4] = VG_(baseBlock)[VGOFF_(m_eip)];
-
-   for (i = 0; i < VG_SIZE_OF_SSESTATE_W; i++)
-      VG_(m_state_static)[64/4 + i] 
-         = VG_(baseBlock)[VGOFF_(m_ssestate) + i];
-}
-
-
 /* Returns the offset, in words. */
 static Int alloc_BaB ( Int words )
 {
@@ -2872,7 +2823,7 @@
    SK_(post_clo_init)();
 
    //--------------------------------------------------------------
-   // Set up baseBlock, copy machine state (m_state_static)
+   // Set up baseBlock
    //   p: {pre,post}_clo_init()  [for tool helper registration]
    //      load_client()          [for 'client_eip']
    //      setup_client_stack()   [for 'esp_at_startup']
@@ -3104,25 +3055,6 @@
          VG_(core_panic)("entered the afterlife in main() -- Deadlock");
          break;
 
-      case VgSrc_BbsDone: 
-         /* Tricky; we have to try and switch back to the real CPU.
-            This is all very dodgy and won't work at all in the
-            presence of threads, or if the client happened to be
-            running a signal handler. */
-         /* Prepare to restore state to the real CPU. */
-         VG_(sigshutdown_actions)();
-         VG_(load_thread_state)(1 /* root thread */ );
-         copy_baseBlock_to_m_state_static();
-
-	 VG_(proxy_shutdown)();
-
-         /* This pushes a return address on the simulator's stack,
-            which is abandoned.  We call vg_sigshutdown_actions() at
-            the end of vg_switch_to_real_CPU(), so as to ensure that
-            the original stack and machine state is restored before
-            the real signal mechanism is restored.  */
-         VG_(switch_to_real_CPU)();
-
       case VgSrc_FatalSig:
 	 /* We were killed by a fatal signal, so replicate the effect */
 	 vg_assert(VG_(fatal_sigNo) != -1);
diff --git a/coregrind/vg_scheduler.c b/coregrind/vg_scheduler.c
index 8e9a677..75ad420 100644
--- a/coregrind/vg_scheduler.c
+++ b/coregrind/vg_scheduler.c
@@ -517,7 +517,6 @@
    volatile UInt trc = 0;
    vg_assert(VG_(is_valid_tid)(tid));
    vg_assert(VG_(threads)[tid].status == VgTs_Runnable);
-   vg_assert(VG_(bbs_to_go) > 0);
    vg_assert(!VG_(scheduler_jmpbuf_valid));
 
    VGP_PUSHCC(VgpRun);
@@ -901,10 +900,6 @@
          or declare deadlock, or sleep if there are no runnable
          threads but some are blocked on I/O.  */
 
-      /* Was a debug-stop requested? */
-      if (VG_(bbs_to_go) == 0) 
-         goto debug_stop;
-
       /* Do the following loop until a runnable thread is found, or
          deadlock is detected. */
       while (True) {
@@ -996,10 +991,7 @@
          decrement is done before the bb is actually run, so you
          always get at least one decrement even if nothing happens.
       */
-      if (VG_(bbs_to_go) >= VG_SCHEDULING_QUANTUM)
-         VG_(dispatch_ctr) = VG_SCHEDULING_QUANTUM + 1;
-      else
-         VG_(dispatch_ctr) = (UInt)VG_(bbs_to_go) + 1;
+      VG_(dispatch_ctr) = VG_SCHEDULING_QUANTUM + 1;
 
       /* ... and remember what we asked for. */
       dispatch_ctr_SAVED = VG_(dispatch_ctr);
@@ -1186,7 +1178,6 @@
 
       done_this_time = (Int)dispatch_ctr_SAVED - (Int)VG_(dispatch_ctr) - 1;
       vg_assert(done_this_time >= 0);
-      VG_(bbs_to_go)   -= (ULong)done_this_time;
       VG_(bbs_done)    += (ULong)done_this_time;
 
       if (0 && trc != VG_TRC_INNER_FASTMISS)
@@ -1207,18 +1198,12 @@
             /* Explicit yield.  Let a new thread be scheduled,
                simply by doing nothing, causing us to arrive back at
                Phase 1. */
-            if (VG_(bbs_to_go) == 0) {
-               goto debug_stop;
-            }
             break;
 
          case VG_TRC_INNER_COUNTERZERO:
             /* Timeslice is out.  Let a new thread be scheduled,
                simply by doing nothing, causing us to arrive back at
                Phase 1. */
-            if (VG_(bbs_to_go) == 0) {
-               goto debug_stop;
-            }
             vg_assert(VG_(dispatch_ctr) == 0);
             break;
 
@@ -1256,20 +1241,6 @@
    /* NOTREACHED */
    VG_(core_panic)("scheduler: post-main-loop ?!");
    /* NOTREACHED */
-
-  debug_stop:
-   /* If we exited because of a debug stop, print the translation 
-      of the last block executed -- by translating it again, and 
-      throwing away the result. */
-   VG_(printf)(
-      "======vvvvvvvv====== LAST TRANSLATION ======vvvvvvvv======\n");
-   VG_(translate)( tid, 
-                   VG_(threads)[tid].m_eip, NULL, NULL, NULL, NULL );
-   VG_(printf)("\n");
-   VG_(printf)(
-      "======^^^^^^^^====== LAST TRANSLATION ======^^^^^^^^======\n");
-
-   return VgSrc_BbsDone;
 }
 
 void VG_(need_resched) ( ThreadId prefer )
diff --git a/coregrind/vg_startup.S b/coregrind/vg_startup.S
deleted file mode 100644
index c2d60f6..0000000
--- a/coregrind/vg_startup.S
+++ /dev/null
@@ -1,85 +0,0 @@
-
-##--------------------------------------------------------------------##
-##--- Startup and shutdown code for Valgrind.                      ---##
-##---                                                 vg_startup.S ---##
-##--------------------------------------------------------------------##
-
-/*
-  This file is part of Valgrind, an extensible x86 protected-mode
-  emulator for monitoring program execution on x86-Unixes.
-
-  Copyright (C) 2000-2004 Julian Seward 
-     jseward@acm.org
-
-  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.
-
-  The GNU General Public License is contained in the file COPYING.
-*/
-
-#include "vg_constants.h"
-#include "config.h"
-
-.section .text
-	
-
-	
-.global	VG_(switch_to_real_CPU)
-VG_(switch_to_real_CPU):
-	# Once Valgrind has decided it needs to exit,
-	# because the specified number of insns have been completed
-	# during a debugging run, it jumps here, which copies the
-	# simulators state into the real machine state.  Execution
-	# of the rest of the program continues on the real CPU,
-	# and there is no way for the simulator to regain control
-	# after this point.
-
-	pushfl
-	cmpb	$0, VG_(have_ssestate)
-	jz	qq4nosse
-	andl	$0x0000FFBF, VG_(m_state_static)+64+24
-	fxrstor	VG_(m_state_static)+64
-	jmp	qq4merge
-qq4nosse:
-	frstor	VG_(m_state_static)+64
-qq4merge:
-	popfl
-	
-	movl	VG_(m_state_static)+56, %eax
-	pushl	%eax
-	popfl
-	/* some of these are apparently illegal */
-	/* movw	VG_(m_state_static)+0, %cs */
-	movw	VG_(m_state_static)+4, %ss
-	movw	VG_(m_state_static)+8, %ds
-	movw	VG_(m_state_static)+12, %es
-	movw	VG_(m_state_static)+16, %fs
-	movw	VG_(m_state_static)+20, %gs
-	movl	VG_(m_state_static)+24, %eax
-	movl	VG_(m_state_static)+28, %ecx
-	movl	VG_(m_state_static)+32, %edx
-	movl	VG_(m_state_static)+36, %ebx
-	movl	VG_(m_state_static)+40, %esp
-	movl	VG_(m_state_static)+44, %ebp
-	movl	VG_(m_state_static)+48, %esi
-	movl	VG_(m_state_static)+52, %edi
-
-	jmp	*VG_(m_state_static)+60
-
-
-
-##--------------------------------------------------------------------##
-##--- end                                             vg_startup.S ---##
-##--------------------------------------------------------------------##
diff --git a/coregrind/vg_translate.c b/coregrind/vg_translate.c
index b0f9d70..58e70de 100644
--- a/coregrind/vg_translate.c
+++ b/coregrind/vg_translate.c
@@ -1509,28 +1509,6 @@
    Int*    last_live_before;
    FlagSet future_dead_flags;
 
-#  if 0
-   /* DEBUGGING HOOK */
-   {
-   static int n_done=0;
-   if (VG_(clo_stop_after) > 1000000000) {
-      if (n_done > (VG_(clo_stop_after) - 1000000000)) {
-         dis=False;
-         VG_(clo_trace_codegen)  = 0;
-         return;
-       }
-       if (n_done == (VG_(clo_stop_after) - 1000000000)) {
-         VG_(printf)("\n");
-         VG_(pp_UCodeBlock) ( cb, "Incoming:" );
-         dis = True;
-         VG_(clo_trace_codegen)  = 31;
-       }
-       n_done++;
-     }
-   }
-   /* end DEBUGGING HOOK */
-#  endif /* 0 */
-
    if (dis) 
       VG_(printf) ("Improvements:\n");