2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief Debug facility.
23 * @author Michael Beck, Sebastian Hack
31 #include "firm_config.h"
45 static struct obstack dbg_obst;
46 static set *module_set;
51 struct _firm_dbg_module_t {
58 * Compares two modules by comparing it's names
60 static int module_cmp(const void *p1, const void *p2, size_t size)
62 const firm_dbg_module_t *m1 = p1;
63 const firm_dbg_module_t *m2 = p2;
66 return strcmp(m1->name, m2->name);
70 * initialize the debug module
72 static void firm_dbg_init(void)
74 obstack_init(&dbg_obst);
75 module_set = new_set(module_cmp, 16);
78 firm_dbg_module_t *firm_dbg_register(const char *name)
80 firm_dbg_module_t mod;
88 return set_insert(module_set, &mod, sizeof(mod), HASH_STR(name, strlen(name)));
91 void firm_dbg_set_mask(firm_dbg_module_t *module, unsigned mask)
96 unsigned firm_dbg_get_mask(const firm_dbg_module_t *module)
101 void firm_dbg_set_file(firm_dbg_module_t *module, FILE *file)
107 * A message info: a pair of debug handle and message
109 typedef struct _msg_info_t {
111 const firm_dbg_module_t *mod;
115 * Formats a message given by a printf-like format and a va_list argument,
116 * puts the test on an obstack and return a msg_info.
118 static void *make_msg_info(const firm_dbg_module_t *mod, const char *fmt, va_list args)
120 static const char msg_header[] = "%s(%d) %s: ";
121 msg_info_t *res = obstack_alloc(&dbg_obst, sizeof(*res));
123 obstack_grow(&dbg_obst, msg_header, sizeof(msg_header) - 1);
124 ir_obst_vprintf(&dbg_obst, fmt, args);
125 obstack_1grow(&dbg_obst, '\0');
127 res->msg = obstack_finish(&dbg_obst);
132 void *_firm_dbg_make_msg(const firm_dbg_module_t *mod, unsigned mask, const char *fmt, ...)
136 if(mask == 0 || (mod->mask & mask)) {
139 res = make_msg_info(mod, fmt, args);
146 void _firm_dbg_print_msg(const char *filename, int line, const char *func, void *mi_ptr)
148 msg_info_t *mi = mi_ptr;
150 fprintf(mi->mod->file, mi->msg, filename, line, func);
151 obstack_free(&dbg_obst, mi);
155 void _firm_dbg_print(const firm_dbg_module_t *mod, unsigned mask, const char *fmt, ...)
157 if(mask == 0 || (mod->mask & mask)) {
161 ir_obst_vprintf(&dbg_obst, fmt, args);
162 obstack_1grow(&dbg_obst, '\0');
163 res = obstack_finish(&dbg_obst);
164 fprintf(mod->file, res);
165 obstack_free(&dbg_obst, res);
170 #else /* DEBUG_libfirm */
172 /* some picky compiler don't allow empty files */
173 static int __attribute__((unused)) dummy;
175 #endif /* DEBUG_libfirm */