X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FRtsFlags.c;h=2dbd241f04053b43c48c86d217731abe2b87f9c9;hp=e439afe00cb28a34e6abda7f4124c3dc46ae3aa2;hb=4cc37e5758909aaec9ede20604ec4f01c04b54ea;hpb=ddf8b805caafdfb5e3bbc3356aaed66af6f0b5e9 diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c index e439afe..2dbd241 100644 --- a/rts/RtsFlags.c +++ b/rts/RtsFlags.c @@ -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... closures with specified biographies (lag,drag,void,use)", "", " -R Set the maximum retainer set size (default: 8)", +"", +" -L Maximum length of a cost-centre stack in a heap profile", +" (default: 25)", "", " -i 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=", +" Install signal handlers (default: yes)", #if defined(THREADED_RTS) || defined(PAR) " -e 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 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]) {