X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fdebug%2Fdebugger.c;h=e8d3e7a752185533339d1669a49b68aaa30492cc;hb=52f5575dc678a5f7f1b3a078dcc46b1cdbaf5182;hp=beba7e6c6ba5271f66c990b03cbd0674e95f39cf;hpb=48b0fa8564962b17e136a0f925eff458ca16abef;p=libfirm diff --git a/ir/debug/debugger.c b/ir/debug/debugger.c index beba7e6c6..e8d3e7a75 100644 --- a/ir/debug/debugger.c +++ b/ir/debug/debugger.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2010 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -33,6 +33,8 @@ #include #endif +#include "debugger.h" + #include #include #include @@ -57,17 +59,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 */ @@ -81,7 +86,7 @@ typedef enum { /** * Reasons for node number breakpoints. */ -typedef enum _bp_reasons_t { +typedef enum bp_reasons_t { BP_ON_NEW_NODE, /**< break if node with number is created */ BP_ON_REPLACE, /**< break if node with number is replaced */ BP_ON_LOWER, /**< break if node with number is lowered */ @@ -92,12 +97,12 @@ typedef enum _bp_reasons_t { } bp_reasons_t; /** A breakpoint. */ -typedef struct _breakpoint { +typedef struct breakpoint { bp_kind kind; /**< the kind of this break point */ unsigned bpnr; /**< break point number */ int active; /**< non-zero, if this break point is active */ bp_reasons_t reason; /**< reason for the breakpoint */ - struct _breakpoint *next; /**< link to the next one */ + struct breakpoint *next; /**< link to the next one */ } breakpoint; /** A number breakpoint. */ @@ -160,14 +165,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) @@ -182,36 +187,29 @@ do { \ #define FIRM_DBG_MINOR 0 /** for automatic detection of the debug extension */ -static const char firm_debug_info_string[] = +static const char __attribute__((used)) firm_debug_info_string[] = API_VERSION(FIRM_DBG_MAJOR, FIRM_DBG_MINOR); -/** - * 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 */ -/** - * Return the content of the debug text buffer. - * - * 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 */ @@ -256,7 +254,7 @@ static void dbg_new_node(void *ctx, ir_graph *irg, ir_node *node) key.nr = get_irn_node_nr(node); key.bp.reason = BP_ON_NEW_NODE; - elem = set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); + elem = (bp_nr_t*)set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); if (elem && elem->bp.active) { dbg_printf("Firm BP %u reached, %+F created\n", elem->bp.bpnr, node); firm_debug_break(); @@ -278,7 +276,7 @@ static void dbg_replace(void *ctx, ir_node *old, ir_node *nw) key.nr = get_irn_node_nr(old); key.bp.reason = BP_ON_REPLACE; - elem = set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); + elem = (bp_nr_t*)set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); if (elem && elem->bp.active) { dbg_printf("Firm BP %u reached, %+F will be replaced by %+F\n", elem->bp.bpnr, old, nw); firm_debug_break(); @@ -299,7 +297,7 @@ static void dbg_lower(void *ctx, ir_node *node) key.nr = get_irn_node_nr(node); key.bp.reason = BP_ON_LOWER; - elem = set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); + elem = (bp_nr_t*)set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); if (elem && elem->bp.active) { dbg_printf("Firm BP %u reached, %+F will be lowered\n", elem->bp.bpnr, node); firm_debug_break(); @@ -320,7 +318,7 @@ static void dbg_free_graph(void *ctx, ir_graph *irg) key.nr = get_irg_graph_nr(irg); key.bp.reason = BP_ON_REMIRG; - elem = set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); + elem = (bp_nr_t*)set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); if (elem && elem->bp.active) { ir_printf("Firm BP %u reached, %+F will be deleted\n", elem->bp.bpnr, irg); firm_debug_break(); @@ -336,7 +334,7 @@ static void dbg_free_graph(void *ctx, ir_graph *irg) key.id = get_entity_ident(ent); key.bp.reason = BP_ON_REMIRG; - elem = set_find(bp_idents, &key, sizeof(key), HASH_IDENT_BP(key)); + elem = (bp_ident_t*)set_find(bp_idents, &key, sizeof(key), HASH_IDENT_BP(key)); if (elem && elem->bp.active) { dbg_printf("Firm BP %u reached, %+F will be deleted\n", elem->bp.bpnr, ent); firm_debug_break(); @@ -359,7 +357,7 @@ static void dbg_new_entity(void *ctx, ir_entity *ent) key.id = get_entity_ident(ent); key.bp.reason = BP_ON_NEW_ENT; - elem = set_find(bp_idents, &key, sizeof(key), HASH_IDENT_BP(key)); + elem = (bp_ident_t*)set_find(bp_idents, &key, sizeof(key), HASH_IDENT_BP(key)); if (elem && elem->bp.active) { ir_printf("Firm BP %u reached, %+F was created\n", elem->bp.bpnr, ent); firm_debug_break(); @@ -371,7 +369,7 @@ static void dbg_new_entity(void *ctx, ir_entity *ent) key.nr = get_entity_nr(ent); key.bp.reason = BP_ON_NEW_ENT; - elem = set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); + elem = (bp_nr_t*)set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); if (elem && elem->bp.active) { dbg_printf("Firm BP %u reached, %+F was created\n", elem->bp.bpnr, ent); firm_debug_break(); @@ -394,24 +392,12 @@ static void dbg_new_type(void *ctx, ir_type *tp) key.nr = get_type_nr(tp); key.bp.reason = BP_ON_NEW_TYPE; - elem = set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); + elem = (bp_nr_t*)set_find(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); if (elem && elem->bp.active) { ir_printf("Firm BP %u reached, %+F was created\n", elem->bp.bpnr, 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,8 +422,8 @@ static const char *reason_str(bp_reasons_t reason) */ static int cmp_nr_bp(const void *elt, const void *key, size_t size) { - const bp_nr_t *e1 = elt; - const bp_nr_t *e2 = key; + const bp_nr_t *e1 = (const bp_nr_t*)elt; + const bp_nr_t *e2 = (const bp_nr_t*)key; (void) size; return (e1->nr - e2->nr) | (e1->bp.reason - e2->bp.reason); @@ -448,8 +434,8 @@ static int cmp_nr_bp(const void *elt, const void *key, size_t size) */ static int cmp_ident_bp(const void *elt, const void *key, size_t size) { - const bp_ident_t *e1 = elt; - const bp_ident_t *e2 = key; + const bp_ident_t *e1 = (const bp_ident_t*)elt; + const bp_ident_t *e2 = (const bp_ident_t*)key; (void) size; return (e1->id != e2->id) | (e1->bp.reason - e2->bp.reason); @@ -478,7 +464,7 @@ static void update_hooks(breakpoint *bp) CASE_ON(BP_ON_NEW_ENT, new_entity); CASE_ON(BP_ON_NEW_TYPE, new_type); default: - ; + break; } } else { @@ -491,7 +477,7 @@ static void update_hooks(breakpoint *bp) CASE_OFF(BP_ON_NEW_ENT, new_entity); CASE_OFF(BP_ON_NEW_TYPE, new_type); default: - ; + break; } } #undef CASE_ON @@ -511,7 +497,7 @@ static void break_on_nr(long nr, bp_reasons_t reason) key.bp.reason = reason; key.nr = nr; - elem = set_insert(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); + elem = (bp_nr_t*)set_insert(bp_numbers, &key, sizeof(key), HASH_NR_BP(key)); if (elem->bp.bpnr == 0) { /* new break point */ @@ -528,7 +514,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; @@ -537,7 +524,7 @@ static void break_on_ident(const char *name, bp_reasons_t reason) { key.bp.reason = reason; key.id = new_id_from_str(name); - elem = set_insert(bp_idents, &key, sizeof(key), HASH_IDENT_BP(key)); + elem = (bp_ident_t*)set_insert(bp_idents, &key, sizeof(key), HASH_IDENT_BP(key)); if (elem->bp.bpnr == 0) { /* new break point */ @@ -576,7 +563,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" @@ -602,7 +590,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; @@ -634,7 +623,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)); @@ -674,7 +664,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) { @@ -686,10 +677,10 @@ static void show_firm_object(void *firm_thing) { fprintf(f, "BAD: (%p)\n", firm_thing); break; case k_entity: - dump_entity_to_file(f, firm_thing, dump_verbosity_max); + dump_entity_to_file(f, (ir_entity*)firm_thing); break; case k_type: - dump_type_to_file(f, firm_thing, dump_verbosity_max); + dump_type_to_file(f, (ir_type*)firm_thing); break; case k_ir_graph: case k_ir_node: @@ -710,7 +701,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; @@ -728,17 +720,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 */ @@ -755,8 +751,9 @@ typedef struct find_env { /** * Type-walker: Find an entity with given number. */ -static void check_ent_nr(type_or_ent tore, void *ctx) { - find_env_t *env = ctx; +static void check_ent_nr(type_or_ent tore, void *ctx) +{ + find_env_t *env = (find_env_t*)ctx; if (is_entity(tore.ent)) { if (get_entity_nr(tore.ent) == env->u.nr) { @@ -768,8 +765,9 @@ 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) { - find_env_t *env = ctx; +static void check_ent_name(type_or_ent tore, void *ctx) +{ + find_env_t *env = (find_env_t*)ctx; if (is_entity(tore.ent)) if (strcmp(get_entity_name(tore.ent), env->u.name) == 0) { @@ -780,7 +778,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; @@ -792,7 +791,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; @@ -804,7 +804,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)) { @@ -816,7 +817,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)); } @@ -832,7 +833,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)) { @@ -844,7 +846,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)); } @@ -860,7 +862,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); @@ -869,7 +872,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); @@ -929,7 +933,7 @@ static struct lexer { unsigned cur_token; /**< current token. */ unsigned number; /**< current token attribute. */ const char *s; /**< current token attribute. */ - unsigned len; /**< current token attribute. */ + size_t len; /**< current token attribute. */ const char *curr_pos; const char *end_pos; @@ -939,7 +943,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); @@ -949,13 +954,14 @@ 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++; } /* next_char */ -#define unput() if (lexer.curr_pos < lexer.end_pos) --lexer.curr_pos +#define unput() if (lexer.curr_pos < lexer.end_pos) --lexer.curr_pos #undef MIN #define MIN(a, b) (a) < (b) ? (a) : (b) @@ -963,7 +969,8 @@ static char next_char(void) { /** * The lexer. */ -static unsigned get_token(void) { +static unsigned get_token(void) +{ char c; int i; @@ -1042,14 +1049,10 @@ static unsigned get_token(void) { return c; } /* get_token */ -/** - * High level function to use from debugger interface - * - * 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; + size_t len; init_lexer(cmd); @@ -1260,7 +1263,6 @@ leave: ; } /* firm_debug */ -/* creates the debugger tables */ void firm_init_debugger(void) { char *env; @@ -1282,22 +1284,22 @@ 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; } -/** - * 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;