Add an --install-signal-handlers=<yes|no> RTS flag; fixes trac #804
[ghc-hetmet.git] / rts / RtsFlags.c
index e439afe..2dbd241 100644 (file)
@@ -11,7 +11,6 @@
 #include "Rts.h"
 #include "RtsFlags.h"
 #include "RtsUtils.h"
-#include "BlockAlloc.h"
 #include "Profiling.h"
 
 #ifdef HAVE_CTYPE_H
@@ -166,6 +165,7 @@ void initRtsFlagsDefaults(void)
     RtsFlags.DebugFlags.par            = rtsFalse;
     RtsFlags.DebugFlags.linker         = rtsFalse;
     RtsFlags.DebugFlags.squeeze                = rtsFalse;
+    RtsFlags.DebugFlags.hpc            = rtsFalse;
 #endif
 
 #if defined(PROFILING) || defined(PAR)
@@ -178,6 +178,7 @@ void initRtsFlagsDefaults(void)
     RtsFlags.ProfFlags.includeTSOs        = rtsFalse;
     RtsFlags.ProfFlags.showCCSOnException = rtsFalse;
     RtsFlags.ProfFlags.maxRetainerSetSize = 8;
+    RtsFlags.ProfFlags.ccsLength          = 25;
     RtsFlags.ProfFlags.modSelector        = NULL;
     RtsFlags.ProfFlags.descrSelector      = NULL;
     RtsFlags.ProfFlags.typeSelector       = NULL;
@@ -193,6 +194,8 @@ void initRtsFlagsDefaults(void)
     RtsFlags.MiscFlags.tickInterval    = 50;  /* In milliseconds */
     RtsFlags.ConcFlags.ctxtSwitchTime  = 50;  /* In milliseconds */
 
+    RtsFlags.MiscFlags.install_signal_handlers = rtsTrue;
+
 #ifdef THREADED_RTS
     RtsFlags.ParFlags.nNodes           = 1;
     RtsFlags.ParFlags.migrate           = rtsTrue;
@@ -301,6 +304,11 @@ void initRtsFlagsDefaults(void)
 
     RtsFlags.TraceFlags.timestamp      = rtsFalse;
     RtsFlags.TraceFlags.sched          = rtsFalse;
+
+#ifdef USE_PAPI
+    /* By default no special measurements taken */
+    RtsFlags.PapiFlags.eventType        = 0;
+#endif
 }
 
 static const char *
@@ -370,6 +378,9 @@ usage_text[] = {
 "    -hb<bio>...  closures with specified biographies (lag,drag,void,use)",
 "",
 "  -R<size>       Set the maximum retainer set size (default: 8)",
+"", 
+"  -L<chars>      Maximum length of a cost-centre stack in a heap profile",
+"                 (default: 25)",
 "",
 "  -i<sec>        Time between heap samples (seconds, default: 0.1)",
 "",
@@ -419,6 +430,7 @@ usage_text[] = {
 "  -Dl  DEBUG: linker",
 "  -Dm  DEBUG: stm",
 "  -Dz  DEBUG: stack squezing",
+"  -Dc  DEBUG: program coverage",
 "",
 #endif /* DEBUG */
 #if defined(THREADED_RTS) && !defined(NOSMP)
@@ -426,6 +438,8 @@ usage_text[] = {
 "  -qm       Don't automatically migrate threads between CPUs",
 "  -qw       Migrate a thread to the current CPU when it is woken up",
 #endif
+"  --install-signal-handlers=<yes|no>",
+"            Install signal handlers (default: yes)",
 #if defined(THREADED_RTS) || defined(PAR)
 "  -e<size>  Size of spark pools (default 100)",
 #endif
@@ -446,6 +460,17 @@ usage_text[] = {
 #if defined(GRAN)  /* ToDo: fill in decent Docu here */
 "  -b...     All GranSim options start with -b; see GranSim User's Guide for details",
 #endif
+#if defined(USE_PAPI)
+"  -aX       CPU performance counter measurements using PAPI",
+"            (use with the -s<file> option).  X is one of:",
+"",
+/* "            y - cycles", */
+"            1 - level 1 cache misses",
+"            2 - level 2 cache misses",
+"            b - branch mispredictions",
+"            s - stalled cycles",
+"            e - cache miss and branch misprediction events",
+#endif
 "",
 "RTS options may also be specified using the GHCRTS environment variable.",
 "",
@@ -636,6 +661,23 @@ error = rtsTrue;
                error = rtsTrue;
                break;
 
+              /* This isn't going to allow us to keep related options
+                 together as we add more --* flags. We really need a
+                 proper options parser. */
+             case '-':
+                  if (strequal("install-signal-handlers=yes",
+                               &rts_argv[arg][2])) {
+                      RtsFlags.MiscFlags.install_signal_handlers = rtsTrue;
+                  }
+                  else if (strequal("install-signal-handlers=no",
+                               &rts_argv[arg][2])) {
+                      RtsFlags.MiscFlags.install_signal_handlers = rtsFalse;
+                  }
+                  else {
+                     errorBelch("unknown RTS option: %s",rts_argv[arg]);
+                     error = rtsTrue;
+                  }
+                 break;
              case 'A':
                RtsFlags.GcFlags.minAllocAreaSize
                  = decode(rts_argv[arg]+2) / BLOCK_SIZE;
@@ -644,6 +686,30 @@ error = rtsTrue;
                }
                break;
 
+#ifdef USE_PAPI
+             case 'a':
+               switch(rts_argv[arg][2]) {
+               case '1':
+                 RtsFlags.PapiFlags.eventType = PAPI_FLAG_CACHE_L1;
+                 break;
+               case '2':
+                 RtsFlags.PapiFlags.eventType = PAPI_FLAG_CACHE_L2;
+                 break;
+               case 'b':
+                 RtsFlags.PapiFlags.eventType = PAPI_FLAG_BRANCH;
+                 break;
+               case 's':
+                 RtsFlags.PapiFlags.eventType = PAPI_FLAG_STALLS;
+                 break;
+               case 'e':
+                 RtsFlags.PapiFlags.eventType = PAPI_FLAG_CB_EVENTS;
+                 break;
+               default:
+                 bad_option( rts_argv[arg] );
+               }
+               break;
+#endif
+
              case 'B':
                RtsFlags.GcFlags.ringBell = rtsTrue;
                break;
@@ -716,6 +782,9 @@ error = rtsTrue;
                      case 'z':
                          RtsFlags.DebugFlags.squeeze = rtsTrue;
                          break;
+                     case 'c':
+                         RtsFlags.DebugFlags.hpc = rtsTrue;
+                         break;
                      default:
                          bad_option( rts_argv[arg] );
                      }
@@ -859,7 +928,13 @@ error = rtsTrue;
                  PROFILING_BUILD_ONLY(
                      RtsFlags.ProfFlags.maxRetainerSetSize = atof(rts_argv[arg]+2);
                  ) break;
-
+             case 'L':
+                 PROFILING_BUILD_ONLY(
+                     RtsFlags.ProfFlags.ccsLength = atof(rts_argv[arg]+2);
+                      if(RtsFlags.ProfFlags.ccsLength <= 0) {
+                       bad_option(rts_argv[arg]);
+                      }
+                 ) break;
              case 'h': /* serial heap profile */
 #if !defined(PROFILING) && defined(DEBUG)
                switch (rts_argv[arg][2]) {