X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fcommon%2Fdebug.c;h=6c2748052478abee1538ee1e7ebc4220e4daeff3;hb=0371b3c02b358cc91eca8076d99615334c09df16;hp=62274438e4a50d34692f611b08f43409358d4ca1;hpb=35ed8c5d87f3eb7b564f89782b8e197b3f04cd67;p=libfirm diff --git a/ir/common/debug.c b/ir/common/debug.c index 62274438e..6c2748052 100644 --- a/ir/common/debug.c +++ b/ir/common/debug.c @@ -8,6 +8,8 @@ #include "config.h" #endif +#ifdef DEBUG_libfirm + #include #include @@ -18,92 +20,156 @@ #include "obst.h" #include "set.h" +#ifdef WITH_LIBCORE + +#include "irargs_t.h" + +static void firm_dbg_default_printer(struct obstack *obst, const char *fmt, va_list args) +{ + static lc_arg_env_t *env = NULL; + + if(!env) + env = firm_get_arg_env(); + + lc_evoprintf(env, obst, fmt, args); + +} + +firm_dbg_module_t *firm_dbg_register(const char *name) +{ + return lc_dbg_register_with_printer(name, firm_dbg_default_printer); +} + +#else + static struct obstack dbg_obst; static set *module_set; +/** + * A debug module. + */ struct _firm_dbg_module_t { - unsigned mask; - const char *name; - FILE *file; + unsigned mask; + const char *name; + FILE *file; }; +/** + * Compares two modules by comparing it's names + */ static int module_cmp(const void *p1, const void *p2, size_t size) { - const firm_dbg_module_t *m1 = p1; - const firm_dbg_module_t *m2 = p2; - return strcmp(m1->name, m2->name); + const firm_dbg_module_t *m1 = p1; + const firm_dbg_module_t *m2 = p2; + return strcmp(m1->name, m2->name); } +/** + * initialize the debug module + */ static void firm_dbg_init(void) { - obstack_init(&dbg_obst); - module_set = new_set(module_cmp, 16); + obstack_init(&dbg_obst); + module_set = new_set(module_cmp, 16); } firm_dbg_module_t *firm_dbg_register(const char *name) { - firm_dbg_module_t mod; - mod.mask = 0; - mod.name = name; - mod.file = stderr; + firm_dbg_module_t mod; + mod.mask = 0; + mod.name = name; + mod.file = stderr; - if(!module_set) - firm_dbg_init(); + if(!module_set) + firm_dbg_init(); - return set_insert(module_set, &mod, sizeof(mod), HASH_STR(name, strlen(name))); + return set_insert(module_set, &mod, sizeof(mod), HASH_STR(name, strlen(name))); } void firm_dbg_set_mask(firm_dbg_module_t *module, unsigned mask) { - module->mask = mask; + module->mask = mask; } unsigned firm_dbg_get_mask(const firm_dbg_module_t *module) { - return module->mask; + return module->mask; } void firm_dbg_set_file(firm_dbg_module_t *module, FILE *file) { - module->file = file; + module->file = file; } +/** + * A message info: a pair of debug handle and message + */ typedef struct _msg_info_t { - const char *msg; - const firm_dbg_module_t *mod; + const char *msg; + const firm_dbg_module_t *mod; } msg_info_t; +/** + * Formats a message given by a printf-like format and a va_list argument, + * puts the test on an obstack and return a msg_info. + */ static void *make_msg_info(const firm_dbg_module_t *mod, const char *fmt, va_list args) { - static const char msg_header[] = "%s(%d) %s: "; - msg_info_t *res = obstack_alloc(&dbg_obst, sizeof(*res)); - - obstack_grow(&dbg_obst, msg_header, sizeof(msg_header) - 1); - ir_obst_vprintf(&dbg_obst, fmt, args); - res->msg = obstack_finish(&dbg_obst); - res->mod = mod; - return res; + static const char msg_header[] = "%s(%d) %s: "; + msg_info_t *res = obstack_alloc(&dbg_obst, sizeof(*res)); + + obstack_grow(&dbg_obst, msg_header, sizeof(msg_header) - 1); + ir_obst_vprintf(&dbg_obst, fmt, args); + obstack_1grow(&dbg_obst, '\0'); + + res->msg = obstack_finish(&dbg_obst); + res->mod = mod; + return res; } void *_firm_dbg_make_msg(const firm_dbg_module_t *mod, unsigned mask, const char *fmt, ...) { - void *res = NULL; + void *res = NULL; - if(mask == 0 || (mod->mask & mask)) { - va_list args; - va_start(args, fmt); - res = make_msg_info(mod, fmt, args); - va_end(args); - } + if(mask == 0 || (mod->mask & mask)) { + va_list args; + va_start(args, fmt); + res = make_msg_info(mod, fmt, args); + va_end(args); + } - return res; + return res; } void _firm_dbg_print_msg(const char *filename, int line, const char *func, void *mi_ptr) { - msg_info_t *mi = mi_ptr; - if(mi) { - fprintf(mi->mod->file, mi->msg, filename, line, func); - obstack_free(&dbg_obst, mi); - } + msg_info_t *mi = mi_ptr; + if(mi) { + fprintf(mi->mod->file, mi->msg, filename, line, func); + obstack_free(&dbg_obst, mi); + } +} + +void _firm_dbg_print(const firm_dbg_module_t *mod, unsigned mask, const char *fmt, ...) +{ + if(mask == 0 || (mod->mask & mask)) { + va_list args; + char *res; + va_start(args, fmt); + ir_obst_vprintf(&dbg_obst, fmt, args); + obstack_1grow(&dbg_obst, '\0'); + res = obstack_finish(&dbg_obst); + fprintf(mod->file, res); + obstack_free(&dbg_obst, res); + va_end(args); + } } + +#endif /* WITH_LIBCORE */ + +#else /* DEBUG_libfirm */ + +/* some picky compiler don't allow empty files */ +static int dummy; + +#endif /* DEBUG_libfirm */