X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fstat%2Fstatev.c;h=8ca9a0f02887daa4c3d6ef4ea87cf5c635bf9df1;hb=c6e8578501b64a525e98b222894918e7a4512708;hp=e3d694a92fe148b90eb024b611df99c3605b0894;hpb=78e4e1ed85cd79f30b581db293080be6464d6c96;p=libfirm diff --git a/ir/stat/statev.c b/ir/stat/statev.c index e3d694a92..8ca9a0f02 100644 --- a/ir/stat/statev.c +++ b/ir/stat/statev.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -32,181 +32,129 @@ #include #include #include - -#include +#include #include "util.h" -#include "hashptr.h" +#include "stat_timing.h" #include "irprintf.h" -#include "xmalloc.h" - -#define MAX_CTX 128 - -typedef struct { - char key[32]; - char value[96]; - unsigned hash; -} ctx_t; +#include "statev.h" -static ctx_t ctx_stack[MAX_CTX]; +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif -static unsigned long time_in_ev = 0; -static int ctx_sp = -1; -static FILE *file_ev = NULL; +#ifdef HAVE_REGEX_H +#define FIRM_HAVE_REGEX +#endif -static lc_timer_t *timer = NULL; +#if defined HAVE_LIBZ && defined HAVE_ZLIB_H +#define FIRM_HAVE_LIBZ +#endif -int stat_ev_enabled = 0; -typedef struct print_ev_t { - char filter[128]; - struct print_ev_t *next; -} print_ev_t; +#define MAX_TIMER 256 -static print_ev_t *print_events = NULL; -static int ctx_switch_since_last_print = 0; +#ifdef FIRM_HAVE_LIBZ +#include -#define get_time() lc_timer_elapsed_usec(timer) +#define mfprintf gzprintf +static gzFile* stat_ev_file = NULL; -void stat_ev_ctx_push(const char *key, const char *value) -{ - if (file_ev) { - unsigned long start = get_time(); - ctx_t *ctx = &ctx_stack[ctx_sp + 1]; - unsigned hash = firm_fnv_hash_str(key); +#else - hash = HASH_COMBINE(hash, firm_fnv_hash_str(value)); - if (ctx_sp >= 0) - hash = HASH_COMBINE(hash, ctx_stack[ctx_sp].hash); +#define mfprintf fprintf +static FILE* stat_ev_file = NULL; - snprintf(ctx->key, array_size(ctx->key), "%s", key); - snprintf(ctx->value, array_size(ctx->value), "%s", value); - ctx->hash = hash | 1; - ++ctx_sp; +#endif /* FIRM_HAVE_LIBZ */ - fprintf(file_ev, "P %10x %30s %30s\n", ctx->hash, ctx->key, ctx->value); +int stat_ev_enabled = 0; +int stat_ev_timer_sp = 0; +timing_ticks_t stat_ev_timer_elapsed[MAX_TIMER]; +timing_ticks_t stat_ev_timer_start[MAX_TIMER]; +timing_sched_env_t stat_ev_sched_rt; +timing_sched_env_t stat_ev_sched_normal; - ctx_switch_since_last_print = 1; +#ifdef FIRM_HAVE_REGEX +#include +static regex_t regex; +static regex_t *filter = NULL; +static INLINE int key_matches(const char *key) +{ + if (!filter) + return 1; - time_in_ev += get_time() - start; - } + return regexec(filter, key, 0, NULL, 0) == 0; } -void stat_ev_ctx_push_fobj(const char *key, const void *firm_object) +#else +static char filter[128] = { '\0' }; +static INLINE int key_matches(const char *key) { - if (file_ev) { - char buf[96]; - ir_snprintf(buf, sizeof(buf), "%+F", firm_object); - stat_ev_ctx_push(key, buf); - } -} + int i = 0; -void stat_ev_ctx_pop(void) -{ - if (ctx_sp >= 0) { - if (file_ev) { - fprintf(file_ev, "O %10x\n", ctx_stack[ctx_sp].hash); - ctx_switch_since_last_print = 1; - } - --ctx_sp; + for (i = 0; filter[i] != '\0'; ++i) { + if (key[i] != filter[i]) + return 0; } + + return 1; } +#endif /* FIRM_HAVE_REGEX */ -static void maybe_print_context(void) -{ - int i; - if(!ctx_switch_since_last_print) +void stat_ev_printf(char ev, const char *key, const char *fmt, ...) +{ + if (!key_matches(key)) return; - for(i = 0; i <= ctx_sp; ++i) { - if(i > 0) - fputc(':', stderr); - fputs(ctx_stack[i].value, stderr); - } - fputc('\n', stderr); - ctx_switch_since_last_print = 0; -} + mfprintf(stat_ev_file, "%c;%s", ev, key); + if (fmt != NULL) { + char buf[256]; + va_list args; -void stat_ev_emit(const char *name, double value) -{ - if (file_ev) { - unsigned long start = get_time(); - unsigned id = ctx_sp >= 0 ? ctx_stack[ctx_sp].hash : 0; - - fprintf(file_ev, "E %10x %30s %30f %10ld %10ld\n", id, name, value, start, time_in_ev); - - if(print_events != NULL) { - print_ev_t *print_ev = print_events; - while(print_ev != NULL) { - /* maybe wanna use regexes instead of strcmp? */ - if(strstr(name, print_ev->filter) != NULL) { - maybe_print_context(); - fprintf(stderr, "\t%20s %30f\n", name, value); - } - - print_ev = print_ev->next; - } - } - - time_in_ev += get_time() - start; + va_start(args, fmt); + ir_vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + mfprintf(stat_ev_file, ";%s", buf); } + mfprintf(stat_ev_file, "\n"); } -void stat_ev_begin(const char *prefix) +void stat_ev_begin(const char *prefix, const char *filt) { char buf[512]; +#ifdef FIRM_HAVE_LIBZ + snprintf(buf, sizeof(buf), "%s.ev.gz", prefix); + stat_ev_file = gzopen(buf, "wt9"); +#else snprintf(buf, sizeof(buf), "%s.ev", prefix); + stat_ev_file = fopen(buf, "wt"); +#endif - stat_ev_enabled = 1; - ctx_sp = -1; - time_in_ev = 0; - print_events = NULL; - file_ev = fopen(buf, "wt"); - timer = lc_timer_register("stat_ev", "firm stat event timer"); - - lc_timer_start(timer); -} - -void stat_ev_end(void) -{ - print_ev_t *print_ev, *next; - - if (timer) - lc_timer_stop(timer); - if (file_ev) - fclose(file_ev); - - for (print_ev = print_events; print_ev != NULL; print_ev = next) { - next = print_ev->next; - free(print_ev); + if (filt && filt[0] != '\0') { +#ifdef FIRM_HAVE_REGEX + filter = NULL; + if (regcomp(®ex, filt, REG_EXTENDED) == 0) + filter = ®ex; +#else + strncpy(filter, filt, sizeof(filter) - sizeof(filter[0])); +#endif /* FIRM_HAVE_REGEX */ } -} -void stat_ev_flush(void) -{ - unsigned long start = get_time(); - if (file_ev) - fflush(file_ev); - time_in_ev += get_time() - start; + stat_ev_enabled = stat_ev_file != NULL; + timing_sched_get(&stat_ev_sched_normal); + timing_sched_prepare_max_prio(&stat_ev_sched_rt); } -void stat_ev_print(const char *filter) +void stat_ev_end(void) { - size_t len; - print_ev_t *print_ev = xmalloc(sizeof(print_ev[0])); - - memset(print_ev, 0, sizeof(print_ev[0])); - - len = strlen(filter) + 1; - if (len >= sizeof(print_ev->filter)) { - fprintf(stderr, "Warning: capping event filter (too long)"); - len = sizeof(print_ev->filter); + if (stat_ev_file) { +#ifdef FIRM_HAVE_LIBZ + gzflush(stat_ev_file, 1); + gzclose(stat_ev_file); +#else + fclose(stat_ev_file); +#endif } - memcpy(print_ev->filter, filter, len); - print_ev->filter[len-1] = 0; - - print_ev->next = print_events; - print_events = print_ev; }