diff options
Diffstat (limited to 'rts/OptParse.c')
-rw-r--r-- | rts/OptParse.c | 120 |
1 files changed, 66 insertions, 54 deletions
diff --git a/rts/OptParse.c b/rts/OptParse.c index b85fac50b9..561f03e60d 100644 --- a/rts/OptParse.c +++ b/rts/OptParse.c @@ -44,66 +44,69 @@ RtsFlagName rtsFlags[] = { - [HELP] = {SAFE, VOID, "help", "?" , false}, - [INSTALL_SIGNAL_HANDLERS] = {UNSAFE, BOOL, "install-signal-handlers", NULL, false}, - [INSTALL_SEH_HANDLERS] = {UNSAFE, BOOL, "install-seh-handlers", NULL, false}, - [GENERATE_STACK_TRACES] = {UNSAFE, BOOL, "generate-stack-traces", NULL, false}, - [GENERATE_CRASH_DUMPS] = {UNSAFE, BOOL, "generate-crash-dumps", NULL, false}, - [NULL_EVENTLOG_WRITER] = {UNSAFE, BOOL, "null-eventlog-writer", NULL, false}, - [MACHINE_READABLE] = {UNSAFE, BOOL, "machine-readable", NULL, false}, - [DISABLE_OS_MEM_RET] = {UNSAFE, BOOL, "disable-delayed-os-memory-return", NULL, false}, - [INTERNAL_COUNTERS] = {SAFE, BOOL, "internal-counters", NULL, false}, - [IO_MANAGER_FLAG] = {UNSAFE, ENUM, "io-manager", NULL, true}, - [INFO] = {SAFE, VOID, "info", NULL, false}, - [EVENTLOG_FLUSH_INTERVAL] = {SAFE, DOUBLE, "eventlog-flush-interval", NULL, true}, - [COPYING_GC] = {SAFE, VOID, "copying-gc", NULL, false}, - [NONMOVING_GC] = {SAFE, VOID, "nonmoving-gc", NULL, false}, - [LARGE_OBJ_ALLOC_AREA] = {UNSAFE, STGWORD64, "large-object-allocation", "AL", true}, - [MIN_ALLOC_AREA] = {UNSAFE, STGWORD64, "minimum-allocation-area-size", "A", true}, + [HELP] = {SAFE, VOID, "help", "?" , false}, + [INSTALL_SIGNAL_HANDLERS] = {UNSAFE, BOOL, "install-signal-handlers", NULL, false}, + [INSTALL_SEH_HANDLERS] = {UNSAFE, BOOL, "install-seh-handlers", NULL, false}, + [GENERATE_STACK_TRACES] = {UNSAFE, BOOL, "generate-stack-traces", NULL, false}, + [GENERATE_CRASH_DUMPS] = {UNSAFE, BOOL, "generate-crash-dumps", NULL, false}, + [NULL_EVENTLOG_WRITER] = {UNSAFE, BOOL, "null-eventlog-writer", NULL, false}, + [MACHINE_READABLE] = {UNSAFE, BOOL, "machine-readable", NULL, false}, + [DISABLE_OS_MEM_RET] = {UNSAFE, BOOL, "disable-delayed-os-memory-return", NULL, false}, + [INTERNAL_COUNTERS] = {SAFE, BOOL, "internal-counters", NULL, false}, + [IO_MANAGER_FLAG] = {UNSAFE, ENUM, "io-manager", NULL, true}, + [INFO] = {SAFE, VOID, "info", NULL, false}, + [EVENTLOG_FLUSH_INTERVAL] = {SAFE, DOUBLE, "eventlog-flush-interval", NULL, true}, + [COPYING_GC] = {SAFE, VOID, "copying-gc", NULL, false}, + [NONMOVING_GC] = {SAFE, VOID, "nonmoving-gc", NULL, false}, + [LARGE_OBJ_ALLOC_AREA] = {UNSAFE, STGWORD64, "large-object-allocation", "AL", true}, + [MIN_ALLOC_AREA] = {UNSAFE, STGWORD64, "minimum-allocation-area-size", "A", true}, // #if defined(THREADED_RTS) // #if defined(mingw32_HOST_OS) - [IO_MANAGER_THREADS] = {UNSAFE, STGWORD64, "io-manager-threads", NULL, true}, + [IO_MANAGER_THREADS] = {UNSAFE, STGWORD64, "io-manager-threads", NULL, true}, // #endif - [NUMA] = {SAFE, STGWORD64, "numa", NULL, false}, + [NUMA] = {SAFE, STGWORD64, "numa", NULL, false}, // #endif // #if defined(DEBUG) && defined(THREADED_RTS) - [DEBUG_NUMA] = {SAFE, STGWORD64, "debug-numa", NULL, true}, + [DEBUG_NUMA] = {SAFE, STGWORD64, "debug-numa", NULL, true}, // #endif - [LONG_GC_SYNC] = {SAFE, DOUBLE, "long-gc-sync", NULL, true}, - [NO_AUTO_HEAP_SAMPLES] = {UNSAFE, BOOL, "no-automatic-heap-samples", NULL, false}, - [NURSERY_CHUNK_SIZE] = {UNSAFE, STGWORD64, "alloc-area-chunksize", "n", true}, - [GC_BELL] = {UNSAFE, VOID, "gc-bell", "B", false}, - [COMPACT_GC] = {UNSAFE, DOUBLE, "compact-gc", "c", false}, - [USE_MARK_REGION] = {UNSAFE, VOID, "use-mark-region", "w", false}, - [OLD_GEN_FACTOR] = {UNSAFE, DOUBLE, "old-gen-factor", "F", true}, - [RETURN_DECAY_FACTOR] = {UNSAFE, DOUBLE, "return-decay-factor", "Fd", true}, + [LONG_GC_SYNC] = {SAFE, DOUBLE, "long-gc-sync", NULL, true}, + [NO_AUTO_HEAP_SAMPLES] = {UNSAFE, BOOL, "no-automatic-heap-samples", NULL, false}, + [NURSERY_CHUNK_SIZE] = {UNSAFE, STGWORD64, "alloc-area-chunksize", "n", true}, + [GC_BELL] = {UNSAFE, VOID, "gc-bell", "B", false}, + [COMPACT_GC] = {UNSAFE, DOUBLE, "compact-gc", "c", false}, + [USE_MARK_REGION] = {UNSAFE, VOID, "use-mark-region", "w", false}, + [OLD_GEN_FACTOR] = {UNSAFE, DOUBLE, "old-gen-factor", "F", true}, + [RETURN_DECAY_FACTOR] = {UNSAFE, DOUBLE, "return-decay-factor", "Fd", true}, // #if defined(DEBUG) - [DEBUG_SCHEDULER] = {SAFE, VOID, "debug-scheduler", "Ds", false}, - [DEBUG_INTERPRETER] = {SAFE, VOID, "debug-interpreter", "Di", false}, - [DEBUG_WEAK] = {SAFE, VOID, "debug-weak", "Dw", false}, - [DEBUG_GCCAFS] = {SAFE, VOID, "debug-gccafs", "DG", false}, - [DEBUG_GC] = {SAFE, VOID, "debug-gc", "Dg", false}, - [DEBUG_NONMOVING_GC] = {SAFE, VOID, "debug-nonmoving-gc", "Dn", false}, - [DEBUG_BLOCK_ALLOC] = {SAFE, VOID, "debug-block-alloc", "Db", false}, - [DEBUG_SANITY] = {SAFE, VOID, "debug-sanity", "DS", false}, - [DEBUG_ZERO_IN_GC] = {SAFE, VOID, "debug-zero-on-gc", "DZ", false}, - [DEBUG_STABLE] = {SAFE, VOID, "debug-stable", "Dt", false}, - [DEBUG_PROF] = {SAFE, VOID, "debug-prof", "Dp", false}, - [DEBUG_LINKER] = {SAFE, VOID, "debug-linker", "Dl", false}, - [DEBUG_LINKER_VERBOSE] = {SAFE, VOID, "debug-linker-verbose", "DL", false}, - [DEBUG_APPLY] = {SAFE, VOID, "debug-apply", "Da", false}, - [DEBUG_STM] = {SAFE, VOID, "debug-stm", "Dm", false}, - [DEBUG_SQUEEZE] = {SAFE, VOID, "debug-squeeze", "Dz", false}, - [DEBUG_HPC] = {SAFE, VOID, "debug-hpc", "Dc", false}, - [DEBUG_SPARKS] = {SAFE, VOID, "debug-sparks", "Dr", false}, - [DEBUG_COMPACT] = {SAFE, VOID, "debug-compact", "DC", false}, -// #endif - [MAX_STACK_SIZE] = {UNSAFE, STGWORD64, "stack-max-size", "K", true}, - [STACK_CHUNK_SIZE] = {UNSAFE, STGWORD64, "stack-chunk-size", "kc", true}, - [STACK_CHUNK_BUFFER_SIZE] = {UNSAFE, STGWORD64, "stack-chunk-buffer-size", "kb", true}, - [STACK_INITIAL_SIZE] = {UNSAFE, STGWORD64, "stack-initial-size", "ki", true}, + [DEBUG_SCHEDULER] = {SAFE, VOID, "debug-scheduler", "Ds", false}, + [DEBUG_INTERPRETER] = {SAFE, VOID, "debug-interpreter", "Di", false}, + [DEBUG_WEAK] = {SAFE, VOID, "debug-weak", "Dw", false}, + [DEBUG_GCCAFS] = {SAFE, VOID, "debug-gccafs", "DG", false}, + [DEBUG_GC] = {SAFE, VOID, "debug-gc", "Dg", false}, + [DEBUG_NONMOVING_GC] = {SAFE, VOID, "debug-nonmoving-gc", "Dn", false}, + [DEBUG_BLOCK_ALLOC] = {SAFE, VOID, "debug-block-alloc", "Db", false}, + [DEBUG_SANITY] = {SAFE, VOID, "debug-sanity", "DS", false}, + [DEBUG_ZERO_IN_GC] = {SAFE, VOID, "debug-zero-on-gc", "DZ", false}, + [DEBUG_STABLE] = {SAFE, VOID, "debug-stable", "Dt", false}, + [DEBUG_PROF] = {SAFE, VOID, "debug-prof", "Dp", false}, + [DEBUG_LINKER] = {SAFE, VOID, "debug-linker", "Dl", false}, + [DEBUG_LINKER_VERBOSE] = {SAFE, VOID, "debug-linker-verbose", "DL", false}, + [DEBUG_APPLY] = {SAFE, VOID, "debug-apply", "Da", false}, + [DEBUG_STM] = {SAFE, VOID, "debug-stm", "Dm", false}, + [DEBUG_SQUEEZE] = {SAFE, VOID, "debug-squeeze", "Dz", false}, + [DEBUG_HPC] = {SAFE, VOID, "debug-hpc", "Dc", false}, + [DEBUG_SPARKS] = {SAFE, VOID, "debug-sparks", "Dr", false}, + [DEBUG_COMPACT] = {SAFE, VOID, "debug-compact", "DC", false}, +// #endif + [MAX_STACK_SIZE] = {UNSAFE, STGWORD64, "stack-max-size", "K", true}, + [STACK_CHUNK_SIZE] = {UNSAFE, STGWORD64, "stack-chunk-size", "kc", true}, + [STACK_CHUNK_BUFFER_SIZE] = {UNSAFE, STGWORD64, "stack-chunk-buffer-size", "kb", true}, + [STACK_INITIAL_SIZE] = {UNSAFE, STGWORD64, "stack-initial-size", "ki", true}, + [HEAP_LIMIT_GRACE] = {UNSAFE, STGWORD64, "heap-limit-grace", "Mgrace", true}, + [HEAP_LIMIT_SIZE] = {UNSAFE, STGWORD64, "heap-limit-size", "M", true}, + // The 'NULL' of flags. Long name just for debugging - [UNKNOWN_RTS_OPTION] = {SAFE, VOID, "UNKNOWN_RTS_OPTION", NULL, false}, + [UNKNOWN_RTS_OPTION] = {SAFE, VOID, "UNKNOWN_RTS_OPTION", NULL, false}, }; static RtsFlagValue @@ -351,7 +354,7 @@ parse_flag_value(RtsFlagKey i, bool isLongName, char *arg0, bool *error) // account for '=' that is used with long-form names // some long-from names can have no value though so account for that as well if (isLongName && arg[offset] == '=') offset++; - if (hasValue && !is_valid_size(&arg[offset])) { + if (hasValue && !is_valid_size(arg + offset)) { BAD_VALUE(error, arg); } StgWord64 min; @@ -430,8 +433,17 @@ parse_flag_value(RtsFlagKey i, bool isLongName, char *arg0, bool *error) value = decodeSize(arg, offset, min, max, error); break; } + + case HEAP_LIMIT_GRACE: + case HEAP_LIMIT_SIZE: { + min = BLOCK_SIZE; + max = HS_WORD_MAX; + value = decodeSize(arg, offset, min, max, error); + break; + } } - if (*error) { + + if (*error) { // TODO: this can be other error - need abstraction here OUT_OF_RANGE(error, arg, min, max); } return STGWORD64_VAL(i, value); |