Trim redundant import
[ghc-hetmet.git] / rts / RtsFlags.c
index 8f1b700..14f4fb0 100644 (file)
@@ -147,6 +147,7 @@ void initRtsFlagsDefaults(void)
 #endif
     RtsFlags.GcFlags.compact            = rtsFalse;
     RtsFlags.GcFlags.compactThreshold   = 30.0;
+    RtsFlags.GcFlags.sweep              = rtsFalse;
 #ifdef RTS_GTK_FRONTPANEL
     RtsFlags.GcFlags.frontpanel         = rtsFalse;
 #endif
@@ -207,11 +208,15 @@ void initRtsFlagsDefaults(void)
     RtsFlags.ConcFlags.ctxtSwitchTime  = 20;  /* In milliseconds */
 
     RtsFlags.MiscFlags.install_signal_handlers = rtsTrue;
+    RtsFlags.MiscFlags.machineReadable = rtsFalse;
+    RtsFlags.MiscFlags.linkerMemBase    = 0;
 
 #ifdef THREADED_RTS
     RtsFlags.ParFlags.nNodes           = 1;
     RtsFlags.ParFlags.migrate           = rtsTrue;
     RtsFlags.ParFlags.wakeupMigrate     = rtsFalse;
+    RtsFlags.ParFlags.parGcEnabled      = 1;
+    RtsFlags.ParFlags.parGcGen          = 1;
 #endif
 
 #ifdef PAR
@@ -316,10 +321,12 @@ void initRtsFlagsDefaults(void)
 
     RtsFlags.TraceFlags.timestamp      = rtsFalse;
     RtsFlags.TraceFlags.sched          = rtsFalse;
+    RtsFlags.TraceFlags.gc             = rtsFalse;
 
 #ifdef USE_PAPI
     /* By default no special measurements taken */
     RtsFlags.PapiFlags.eventType        = 0;
+    RtsFlags.PapiFlags.numUserEvents    = 0;
 #endif
 }
 
@@ -350,13 +357,14 @@ usage_text[] = {
 "  -c<n>    Auto-enable compaction of the oldest generation when live data is",
 "           at least <n>% of the maximum heap size set with -M (default: 30%)",
 "  -c       Enable compaction for all major collections",
+"  -w       Use mark-region for the oldest generation (experimental)",
 #if defined(THREADED_RTS)
 "  -I<sec>  Perform full GC after <sec> idle time (default: 0.3, 0 == off)",
 #endif
 "",
-"  -t<file> One-line GC statistics  (default file: <program>.stat)",
-"  -s<file> Summary  GC statistics  (with -Sstderr going to stderr)",
-"  -S<file> Detailed GC statistics",
+"  -t[<file>] One-line GC statistics (if <file> omitted, uses stderr)",
+"  -s[<file>] Summary  GC statistics (if <file> omitted, uses stderr)",
+"  -S[<file>] Detailed GC statistics (if <file> omitted, uses stderr)",
 #ifdef RTS_GTK_FRONTPANEL
 "  -f       Display front panel (requires X11 & GTK+)",
 #endif
@@ -445,6 +453,8 @@ usage_text[] = {
 #endif /* DEBUG */
 #if defined(THREADED_RTS) && !defined(NOSMP)
 "  -N<n>     Use <n> OS threads (default: 1)",
+"  -q1       Use one OS thread for GC (turns off parallel GC)",
+"  -qg<n>    Use parallel GC only for generations >= <n> (default: 1)",
 "  -qm       Don't automatically migrate threads between CPUs",
 "  -qw       Migrate a thread to the current CPU when it is woken up",
 #endif
@@ -470,6 +480,10 @@ 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(x86_64_HOST_ARCH)
+"  -xm       Base address to mmap memory in the GHCi linker",
+"            (hex; must be <80000000)",
+#endif
 #if defined(USE_PAPI)
 "  -aX       CPU performance counter measurements using PAPI",
 "            (use with the -s<file> option).  X is one of:",
@@ -683,6 +697,10 @@ error = rtsTrue;
                                &rts_argv[arg][2])) {
                       RtsFlags.MiscFlags.install_signal_handlers = rtsFalse;
                   }
+                  else if (strequal("machine-readable",
+                               &rts_argv[arg][2])) {
+                      RtsFlags.MiscFlags.machineReadable = rtsTrue;
+                  }
                   else if (strequal("info",
                                &rts_argv[arg][2])) {
                       printRtsInfo();
@@ -719,6 +737,14 @@ error = rtsTrue;
                case 'e':
                  RtsFlags.PapiFlags.eventType = PAPI_FLAG_CB_EVENTS;
                  break;
+                case '+':
+                  if (RtsFlags.PapiFlags.numUserEvents >= MAX_PAPI_USER_EVENTS) {
+                      errorBelch("maximum number of PAPI events reached");
+                      stg_exit(EXIT_FAILURE);
+                  }
+                  RtsFlags.PapiFlags.eventType = PAPI_USER_EVENTS;
+                  RtsFlags.PapiFlags.userEvents[RtsFlags.PapiFlags.numUserEvents++] = rts_argv[arg] + 3;
+                  break;
                default:
                  bad_option( rts_argv[arg] );
                }
@@ -738,6 +764,10 @@ error = rtsTrue;
                  }
                  break;
 
+              case 'w':
+               RtsFlags.GcFlags.sweep = rtsTrue;
+               break;
+
              case 'F':
                RtsFlags.GcFlags.oldGenFactor = atof(rts_argv[arg]+2);
              
@@ -859,10 +889,6 @@ error = rtsTrue;
              case 'H':
                RtsFlags.GcFlags.heapSizeSuggestion = 
                  decode(rts_argv[arg]+2) / BLOCK_SIZE;
-
-               if (RtsFlags.GcFlags.heapSizeSuggestion <= 0) {
-                 bad_option(rts_argv[arg]);
-               }
                break;
 
 #ifdef RTS_GTK_FRONTPANEL
@@ -904,7 +930,7 @@ error = rtsTrue;
                { 
                    int r;
                    r = open_stats_file(arg, *argc, argv,
-                                       *rts_argc, rts_argv, STAT_FILENAME_FMT,
+                                       *rts_argc, rts_argv, NULL,
                                        &RtsFlags.GcFlags.statsFile);
                    if (r == -1) { error = rtsTrue; }
                }
@@ -1117,15 +1143,47 @@ error = rtsTrue;
                      errorBelch("bad value for -N");
                      error = rtsTrue;
                    }
+#if defined(PROFILING)
+                    if (RtsFlags.ParFlags.nNodes > 1) {
+                        errorBelch("bad option %s: only -N1 is supported with profiling", rts_argv[arg]);
+                     error = rtsTrue;
+                    }
+#endif
                }
                ) break;
 
+             case 'g':
+               THREADED_BUILD_ONLY(
+                   switch (rts_argv[arg][2]) {
+                    case '1':
+                        // backwards compat only
+                        RtsFlags.ParFlags.parGcEnabled = rtsFalse;
+                        break;
+                   default:
+                       errorBelch("unknown RTS option: %s",rts_argv[arg]);
+                       error = rtsTrue;
+                       break;
+                    }
+                    ) break;
+
              case 'q':
                    switch (rts_argv[arg][2]) {
                    case '\0':
                        errorBelch("incomplete RTS option: %s",rts_argv[arg]);
                        error = rtsTrue;
                        break;
+                    case '1':
+                        RtsFlags.ParFlags.parGcEnabled = rtsFalse;
+                        break;
+                    case 'g':
+                        if (rts_argv[arg][3] != '\0') {
+                            RtsFlags.ParFlags.parGcGen
+                                = strtol(rts_argv[arg]+3, (char **) NULL, 10);
+                        } else {
+                            errorBelch("bad value for -qg");
+                            error = rtsTrue;
+                        }
+                        break;
                    case 'm':
                        RtsFlags.ParFlags.migrate = rtsFalse;
                        break;
@@ -1196,6 +1254,9 @@ error = rtsTrue;
                case 's':
                    RtsFlags.TraceFlags.sched = rtsTrue;
                    break;
+               case 'g':
+                   RtsFlags.TraceFlags.gc = rtsTrue;
+                   break;
                default:
                    errorBelch("unknown RTS option: %s",rts_argv[arg]);
                    error = rtsTrue;
@@ -1222,7 +1283,22 @@ error = rtsTrue;
                     }
                     break;
 
-                  case 'c': /* Debugging tool: show current cost centre on an exception */
+#if defined(x86_64_HOST_ARCH)
+                case 'm': /* linkerMemBase */
+                    if (rts_argv[arg][3] != '\0') {
+                        RtsFlags.MiscFlags.linkerMemBase
+                            = strtol(rts_argv[arg]+3, (char **) NULL, 16);
+                        if (RtsFlags.MiscFlags.linkerMemBase > 0x80000000) {
+                            errorBelch("-xm: value must be <80000000");
+                            error = rtsTrue;
+                        }
+                    } else {
+                        RtsFlags.MiscFlags.linkerMemBase = 0;
+                    }
+                    break;
+#endif
+
+                case 'c': /* Debugging tool: show current cost centre on an exception */
                     PROFILING_BUILD_ONLY(
                        RtsFlags.ProfFlags.showCCSOnException = rtsTrue;
                        );
@@ -2306,16 +2382,17 @@ open_stats_file (
 {
     FILE *f = NULL;
 
-    if (strequal(rts_argv[arg]+2, "stderr")) { /* use debugBelch */
+    if (strequal(rts_argv[arg]+2, "stderr")
+        || (FILENAME_FMT == NULL && rts_argv[arg][2] == '\0')) {
         f = NULL; /* NULL means use debugBelch */
     } else {
-       if (rts_argv[arg][2] != '\0') {  /* stats file specified */
-           f = fopen(rts_argv[arg]+2,"w");
-       } else {
-           char stats_filename[STATS_FILENAME_MAXLEN]; /* default <program>.<ext> */
-           sprintf(stats_filename, FILENAME_FMT, argv[0]);
-           f = fopen(stats_filename,"w");
-       }
+        if (rts_argv[arg][2] != '\0') {  /* stats file specified */
+            f = fopen(rts_argv[arg]+2,"w");
+        } else {
+            char stats_filename[STATS_FILENAME_MAXLEN]; /* default <program>.<ext> */
+            sprintf(stats_filename, FILENAME_FMT, argv[0]);
+            f = fopen(stats_filename,"w");
+        }
        if (f == NULL) {
            errorBelch("Can't open stats file %s\n", rts_argv[arg]+2);
            return -1;