X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FPapi.c;h=62f5d0d3963bd1bf0eb3bbb67b4c0a39381f0780;hb=cd47700887365ca2a6af17d03e731efce65cf2ac;hp=4d54c726826db91b699c267fbf2a2077985a3ece;hpb=81c95f7d9854521a568179bb19199299835b7a53;p=ghc-hetmet.git diff --git a/rts/Papi.c b/rts/Papi.c index 4d54c72..62f5d0d 100644 --- a/rts/Papi.c +++ b/rts/Papi.c @@ -15,6 +15,11 @@ #ifdef USE_PAPI /* ugly */ #include +/* The posix symbols get defined in a header included from papi.h. + * undefind them here to allow redefinition in PosixSource.h */ +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#undef _XOPEN_SOURCE #include "PosixSource.h" #include "Rts.h" @@ -74,6 +79,7 @@ int papi_error; /* Arbitrary, to avoid using malloc */ #define MAX_PAPI_EVENTS 10 +static char papiNativeEventNames[MAX_PAPI_EVENTS][PAPI_MAX_STR_LEN]; static nat n_papi_events = 0; @@ -86,10 +92,10 @@ long_long GC0Counters[MAX_PAPI_EVENTS]; long_long GC1Counters[MAX_PAPI_EVENTS]; long_long start_mutator_cycles; -long_long mutator_cycles; +long_long mutator_cycles = 0; long_long start_gc_cycles; -long_long gc0_cycles; -long_long gc1_cycles; +long_long gc0_cycles = 0; +long_long gc1_cycles = 0; @@ -145,11 +151,20 @@ init_countable_events(void) } else if (RtsFlags.PapiFlags.eventType==PAPI_USER_EVENTS) { nat i; char *name; + char *asciiEventCode; int code; for (i = 0; i < RtsFlags.PapiFlags.numUserEvents; i++) { + if(RtsFlags.PapiFlags.userEventsKind[i] == PAPI_PRESET_EVENT_KIND) { name = RtsFlags.PapiFlags.userEvents[i]; PAPI_CHECK(PAPI_event_name_to_code(name, &code)) - papi_add_event(name, code); + } + else { // PAPI_NATIVE_EVENT_KIND + asciiEventCode = RtsFlags.PapiFlags.userEvents[i]; + name = papiNativeEventNames[i]; + code = strtol(asciiEventCode, NULL, 16 /* hex number expected */); + PAPI_CHECK(PAPI_event_code_to_name(code, name)) + } + papi_add_event(name, code); } } else { // PAPI_ADD_EVENT(PAPI_L1_DCA); // L1 data cache accesses