X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fdebug%2Fdebugger.c;h=0ac3ad6e1f133dd07bdea0d3fc4d9dd20c47b05a;hb=40f56bdee6900292d63f0d3edd8ab020e99750d5;hp=ff43b2c1d6f4bd7daa8a66fe60230faf919d5d01;hpb=c28fcf22c08f71b02ccd8edb2e091c1b6c22e540;p=libfirm diff --git a/ir/debug/debugger.c b/ir/debug/debugger.c index ff43b2c1d..0ac3ad6e1 100644 --- a/ir/debug/debugger.c +++ b/ir/debug/debugger.c @@ -24,30 +24,20 @@ * @date 2005 * @version $Id$ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif - -#include "firm_config.h" #ifdef DEBUG_libfirm #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include - #endif -#ifdef HAVE_STDLIB_H #include -#endif - #include #include - -#ifdef HAVE_STRING_H #include -#endif + #ifdef HAVE_STRINGS_H #include #endif @@ -67,17 +57,20 @@ #ifdef _WIN32 /* Break into the debugger. The Win32 way. */ -void firm_debug_break(void) { +void firm_debug_break(void) +{ DebugBreak(); } #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64)) /* Break into the debugger. The ia32/x86_64 way under GCC. */ -void firm_debug_break(void) { +void firm_debug_break(void) +{ __asm__ __volatile__("int3"); } #else /* Break into the debugger. Poor Unix way. */ -void firm_debug_break(void) { +void firm_debug_break(void) +{ raise(SIGINT); } #endif /* _WIN32 */ @@ -170,14 +163,14 @@ static int is_active = 0; do { \ debugger_hooks[h].hook._##h = fkt; \ register_hook(h, &debugger_hooks[h]); \ -} while(0) +} while (0) /** unhook the hook h */ #define UNHOOK(h) \ do { \ unregister_hook(h, &debugger_hooks[h]); \ debugger_hooks[h].hook._##h = NULL; \ -} while(0) +} while (0) /** returns non-zero if a entry hook h is used */ #define IS_HOOKED(h) (debugger_hooks[h].hook._##h != NULL) @@ -198,21 +191,24 @@ static const char firm_debug_info_string[] = /** * Returns non-zero, if the debug extension is active */ -int firm_debug_active(void) { +int firm_debug_active(void) +{ return is_active; } /* firm_debug_active */ /** * Reset the debug text buffer. */ -static void reset_dbg_buf(void) { +static void reset_dbg_buf(void) +{ firm_dbg_msg_buf[0] = '\0'; } /* reset_dbg_buf */ /** * Add text to the debug text buffer. */ -static void add_to_dbg_buf(const char *buf) { +static void add_to_dbg_buf(const char *buf) +{ strncat(firm_dbg_msg_buf, buf, sizeof(firm_dbg_msg_buf)); } /* add_to_dbg_buf */ @@ -221,7 +217,8 @@ static void add_to_dbg_buf(const char *buf) { * * To be called from the debugger. */ -const char *firm_debug_text(void) { +const char *firm_debug_text(void) +{ firm_dbg_msg_buf[sizeof(firm_dbg_msg_buf) - 1] = '\0'; return firm_dbg_msg_buf; } /* firm_debug_text */ @@ -410,18 +407,6 @@ static void dbg_new_type(void *ctx, ir_type *tp) firm_debug_break(); } } - { - bp_ident_t key, *elem; - - key.id = get_type_ident(tp); - key.bp.reason = BP_ON_NEW_TYPE; - - elem = set_find(bp_idents, &key, sizeof(key), HASH_IDENT_BP(key)); - if (elem && elem->bp.active) { - dbg_printf("Firm BP %u reached, %+F was created\n", elem->bp.bpnr, tp); - firm_debug_break(); - } - } } /* dbg_new_type */ /** @@ -436,9 +421,9 @@ static const char *reason_str(bp_reasons_t reason) case BP_ON_REMIRG: return "removing IRG"; case BP_ON_NEW_ENT: return "entity creation"; case BP_ON_NEW_TYPE: return "type creation"; + case BP_MAX_REASON: break; } panic("unsupported reason"); - return "unknown"; } /* reason_str */ /** @@ -538,7 +523,8 @@ static void break_on_nr(long nr, bp_reasons_t reason) /** * Break if ident name is reached. */ -static void break_on_ident(const char *name, bp_reasons_t reason) { +static void break_on_ident(const char *name, bp_reasons_t reason) +{ bp_ident_t key, *elem; key.bp.kind = BP_IDENT; @@ -586,7 +572,8 @@ static void bp_activate(unsigned bp, int active) /** * Show a list of supported commands */ -static void show_commands(void) { +static void show_commands(void) +{ dbg_printf("Internal Firm debugger extension $Revision$ commands:\n" "init break after initialization\n" "create nr break if node nr was created\n" @@ -612,7 +599,8 @@ static void show_commands(void) { /** * Shows all Firm breakpoints. */ -static void show_bp(void) { +static void show_bp(void) +{ breakpoint *p; bp_nr_t *node_p; bp_ident_t *ident_p; @@ -644,7 +632,8 @@ static void show_bp(void) { * firm_dbg_register() expects that the name is stored persistent. * So we need this little helper function */ -static firm_dbg_module_t *dbg_register(const char *name) { +static firm_dbg_module_t *dbg_register(const char *name) +{ ident *id = new_id_from_str(name); return firm_dbg_register(get_id_str(id)); @@ -684,7 +673,8 @@ static void set_dbg_outfile(const char *name, const char *fname) /** * Show info about a firm thing. */ -static void show_firm_object(void *firm_thing) { +static void show_firm_object(void *firm_thing) +{ FILE *f = stdout; if (firm_thing == NULL) { @@ -720,7 +710,8 @@ static void show_firm_object(void *firm_thing) { /** * Find a firm type by its number. */ -static ir_type *find_type_nr(long nr) { +static ir_type *find_type_nr(long nr) +{ int i, n = get_irp_n_types(); ir_type *tp; @@ -738,17 +729,21 @@ static ir_type *find_type_nr(long nr) { /** * Find a firm type by its name. */ -static ir_type *find_type_name(const char *name) { +static ir_type *find_type_name(const char *name) +{ int i, n = get_irp_n_types(); ir_type *tp; for (i = 0; i < n; ++i) { tp = get_irp_type(i); - if (strcmp(get_type_name(tp), name) == 0) + if (!is_compound_type(tp)) + continue; + + if (strcmp(get_compound_name(tp), name) == 0) return tp; } tp = get_glob_type(); - if (strcmp(get_type_name(tp), name) == 0) + if (strcmp(get_compound_name(tp), name) == 0) return tp; return NULL; } /* find_type_name */ @@ -765,7 +760,8 @@ typedef struct find_env { /** * Type-walker: Find an entity with given number. */ -static void check_ent_nr(type_or_ent tore, void *ctx) { +static void check_ent_nr(type_or_ent tore, void *ctx) +{ find_env_t *env = ctx; if (is_entity(tore.ent)) { @@ -778,7 +774,8 @@ static void check_ent_nr(type_or_ent tore, void *ctx) { /** * Type-walker: Find an entity with given name. */ -static void check_ent_name(type_or_ent tore, void *ctx) { +static void check_ent_name(type_or_ent tore, void *ctx) +{ find_env_t *env = ctx; if (is_entity(tore.ent)) @@ -790,7 +787,8 @@ static void check_ent_name(type_or_ent tore, void *ctx) { /** * Find a firm entity by its number. */ -static ir_entity *find_entity_nr(long nr) { +static ir_entity *find_entity_nr(long nr) +{ find_env_t env; env.u.nr = nr; @@ -802,7 +800,8 @@ static ir_entity *find_entity_nr(long nr) { /** * Find a firm entity by its name. */ -static ir_entity *find_entity_name(const char *name) { +static ir_entity *find_entity_name(const char *name) +{ find_env_t env; env.u.name = name; @@ -814,7 +813,8 @@ static ir_entity *find_entity_name(const char *name) { /** * Search methods for a name. */ -static void show_by_name(type_or_ent tore, void *env) { +static void show_by_name(type_or_ent tore, void *env) +{ ident *id = (ident *)env; if (is_entity(tore.ent)) { @@ -826,7 +826,7 @@ static void show_by_name(type_or_ent tore, void *env) { ir_graph *irg = get_entity_irg(ent); if (owner != get_glob_type()) { - printf("%s::%s", get_type_name(owner), get_id_str(id)); + printf("%s::%s", get_compound_name(owner), get_id_str(id)); } else { printf("%s", get_id_str(id)); } @@ -842,7 +842,8 @@ static void show_by_name(type_or_ent tore, void *env) { /** * Search methods for a ldname. */ -static void show_by_ldname(type_or_ent tore, void *env) { +static void show_by_ldname(type_or_ent tore, void *env) +{ ident *id = (ident *)env; if (is_entity(tore.ent)) { @@ -854,7 +855,7 @@ static void show_by_ldname(type_or_ent tore, void *env) { ir_graph *irg = get_entity_irg(ent); if (owner != get_glob_type()) { - printf("%s::%s", get_type_name(owner), get_id_str(id)); + printf("%s::%s", get_compound_name(owner), get_id_str(id)); } else { printf("%s", get_id_str(id)); } @@ -870,7 +871,8 @@ static void show_by_ldname(type_or_ent tore, void *env) { /** * prints the address and graph number of all irgs with given name */ -static void irg_name(const char *name) { +static void irg_name(const char *name) +{ ident *id = new_id_from_str(name); type_walk(show_by_name, NULL, (void *)id); @@ -879,7 +881,8 @@ static void irg_name(const char *name) { /** * prints the address and graph number of all irgs with given ld_name */ -static void irg_ld_name(const char *name) { +static void irg_ld_name(const char *name) +{ ident *id = new_id_from_str(name); type_walk(show_by_ldname, NULL, (void *)id); @@ -949,7 +952,8 @@ static struct lexer { /** * Initialize the lexer. */ -static void init_lexer(const char *input) { +static void init_lexer(const char *input) +{ lexer.has_token = 0; lexer.curr_pos = input; lexer.end_pos = input + strlen(input); @@ -959,7 +963,8 @@ static void init_lexer(const char *input) { /** * Get the next char from the input. */ -static char next_char(void) { +static char next_char(void) +{ if (lexer.curr_pos >= lexer.end_pos) return '\0'; return *lexer.curr_pos++; @@ -973,7 +978,8 @@ static char next_char(void) { /** * The lexer. */ -static unsigned get_token(void) { +static unsigned get_token(void) +{ char c; int i; @@ -1057,7 +1063,8 @@ static unsigned get_token(void) { * * See show_commands() for supported commands. */ -void firm_debug(const char *cmd) { +void firm_debug(const char *cmd) +{ char name[1024], fname[1024]; int len; @@ -1292,7 +1299,8 @@ void firm_init_debugger(void) /** * A gdb helper function to print firm objects. */ -const char *gdb_node_helper(void *firm_object) { +const char *gdb_node_helper(void *firm_object) +{ static char buf[1024]; ir_snprintf(buf, sizeof(buf), "%+F", firm_object); return buf; @@ -1301,13 +1309,15 @@ const char *gdb_node_helper(void *firm_object) { /** * A gdb helper function to print tarvals. */ -const char *gdb_tarval_helper(void *tv_object) { +const char *gdb_tarval_helper(void *tv_object) +{ static char buf[1024]; ir_snprintf(buf, sizeof(buf), "%+T", tv_object); return buf; } -const char *gdb_out_edge_helper(const ir_node *node) { +const char *gdb_out_edge_helper(const ir_node *node) +{ static char buf[4*1024]; char *b = buf; size_t l;