Attempt to fix #2512 and #2063; add +RTS -xm<address> -RTS option
[ghc-hetmet.git] / rts / RtsFlags.c
index 81bac4e..1cbd569 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,6 +208,7 @@ void initRtsFlagsDefaults(void)
     RtsFlags.ConcFlags.ctxtSwitchTime  = 20;  /* In milliseconds */
 
     RtsFlags.MiscFlags.install_signal_handlers = rtsTrue;
+    RtsFlags.MiscFlags.linkerMemBase    = 0;
 
 #ifdef THREADED_RTS
     RtsFlags.ParFlags.nNodes           = 1;
@@ -353,13 +355,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
@@ -474,6 +477,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:",
@@ -750,6 +757,10 @@ error = rtsTrue;
                  }
                  break;
 
+              case 'w':
+               RtsFlags.GcFlags.sweep = rtsTrue;
+               break;
+
              case 'F':
                RtsFlags.GcFlags.oldGenFactor = atof(rts_argv[arg]+2);
              
@@ -912,7 +923,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; }
                }
@@ -1141,7 +1152,7 @@ error = rtsTrue;
                if (rts_argv[arg][2] != '\0') {
                    RtsFlags.ParFlags.gcThreads
                      = strtol(rts_argv[arg]+2, (char **) NULL, 10);
-                   if (RtsFlags.ParFlags.nNodes <= 0) {
+                   if (RtsFlags.ParFlags.gcThreads <= 0) {
                      errorBelch("bad value for -g");
                      error = rtsTrue;
                    }
@@ -1253,7 +1264,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;
                        );
@@ -2337,16 +2363,17 @@ open_stats_file (
 {
     FILE *f = NULL;
 
-    if (strequal(rts_argv[arg]+2, "stderr") || strequal(rts_argv[arg]+2, "-")) {
+    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;