3 * @author Michael Beck, Sebastian Hack
25 static void firm_dbg_default_printer(struct obstack *obst, const char *fmt, va_list args)
27 static arg_env_t *env = NULL;
30 env = firm_get_arg_env();
32 lc_evoprintf(env, obst, fmt, args);
36 firm_dbg_module_t *firm_dbg_register(const char *name)
38 return dbg_register_with_printer(name, firm_dbg_default_printer);
43 static struct obstack dbg_obst;
44 static set *module_set;
46 struct _firm_dbg_module_t {
52 static int module_cmp(const void *p1, const void *p2, size_t size)
54 const firm_dbg_module_t *m1 = p1;
55 const firm_dbg_module_t *m2 = p2;
56 return strcmp(m1->name, m2->name);
59 static void firm_dbg_init(void)
61 obstack_init(&dbg_obst);
62 module_set = new_set(module_cmp, 16);
65 firm_dbg_module_t *firm_dbg_register(const char *name)
67 firm_dbg_module_t mod;
75 return set_insert(module_set, &mod, sizeof(mod), HASH_STR(name, strlen(name)));
78 void firm_dbg_set_mask(firm_dbg_module_t *module, unsigned mask)
83 unsigned firm_dbg_get_mask(const firm_dbg_module_t *module)
88 void firm_dbg_set_file(firm_dbg_module_t *module, FILE *file)
93 typedef struct _msg_info_t {
95 const firm_dbg_module_t *mod;
98 static void *make_msg_info(const firm_dbg_module_t *mod, const char *fmt, va_list args)
100 static const char msg_header[] = "%s(%d) %s: ";
101 msg_info_t *res = obstack_alloc(&dbg_obst, sizeof(*res));
103 obstack_grow(&dbg_obst, msg_header, sizeof(msg_header) - 1);
104 ir_obst_vprintf(&dbg_obst, fmt, args);
105 obstack_1grow(&dbg_obst, '\0');
107 res->msg = obstack_finish(&dbg_obst);
112 void *_firm_dbg_make_msg(const firm_dbg_module_t *mod, unsigned mask, const char *fmt, ...)
116 if(mask == 0 || (mod->mask & mask)) {
119 res = make_msg_info(mod, fmt, args);
126 void _firm_dbg_print_msg(const char *filename, int line, const char *func, void *mi_ptr)
128 msg_info_t *mi = mi_ptr;
130 fprintf(mi->mod->file, mi->msg, filename, line, func);
131 obstack_free(&dbg_obst, mi);
136 #endif /* WITH_LIBCORE */