fix backend Cond/Cmp flag optimization failing for unoptimized code
[libfirm] / ir / debug / debugger.c
index 5969687..695e107 100644 (file)
@@ -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.
  *
@@ -22,7 +22,6 @@
  * @brief     Helper function for integrated debug support
  * @author    Michael Beck
  * @date      2005
- * @version   $Id$
  */
 #include "config.h"
 
 #include <stdio.h>
 #include <signal.h>
 #include <string.h>
-
-#ifdef HAVE_STRINGS_H
 #include <strings.h>
-#endif
 
 #include <ctype.h>
 
@@ -56,6 +52,7 @@
 #include "iredges_t.h"
 #include "debug.h"
 #include "error.h"
+#include "util.h"
 
 #ifdef _WIN32
 /* Break into the debugger. The Win32 way. */
@@ -86,7 +83,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 */
@@ -97,12 +94,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. */
@@ -121,7 +118,7 @@ typedef struct {
 } bp_ident_t;
 
 /** Calculate the hash value for an ident breakpoint. */
-#define HASH_IDENT_BP(key) (HASH_PTR((key).id) ^ (key).bp.reason)
+#define HASH_IDENT_BP(key) (hash_ptr((key).id) ^ (key).bp.reason)
 
 /** The set containing the breakpoints on node numbers. */
 static set *bp_numbers;
@@ -193,7 +190,7 @@ static const char __attribute__((used)) firm_debug_info_string[] =
 int firm_debug_active(void)
 {
        return is_active;
-}  /* firm_debug_active */
+}
 
 /**
  * Reset the debug text buffer.
@@ -201,18 +198,18 @@ int firm_debug_active(void)
 static void reset_dbg_buf(void)
 {
        firm_dbg_msg_buf[0] = '\0';
-}  /* reset_dbg_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 */
+}
 
 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 */
+}
 
 /**
  * debug output
@@ -236,7 +233,7 @@ static void dbg_printf(const char *fmt, ...)
                add_to_dbg_buf(buf);
        else
                puts(buf);
-}  /* dbg_printf */
+}
 
 /**
  * A new node is created.
@@ -254,12 +251,12 @@ 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();
        }
-}  /* dbg_new_node */
+}
 
 /**
  * A node is replaced.
@@ -276,12 +273,12 @@ 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();
        }
-}  /* dbg_replace */
+}
 
 /**
  * A new node is lowered.
@@ -297,12 +294,12 @@ 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();
        }
-}  /* dbg_lower */
+}
 
 /**
  * A graph will be deleted.
@@ -318,7 +315,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();
@@ -334,13 +331,13 @@ 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();
                }
        }
-}  /* dbg_free_graph */
+}
 
 /**
  * An entity was created.
@@ -357,7 +354,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();
@@ -369,13 +366,13 @@ 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();
                }
        }
-}  /* dbg_new_entity */
+}
 
 /**
  * A type was created.
@@ -392,13 +389,13 @@ 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();
                }
        }
-}  /* dbg_new_type */
+}
 
 /**
  * Return the reason string.
@@ -415,31 +412,31 @@ static const char *reason_str(bp_reasons_t reason)
        case BP_MAX_REASON:  break;
        }
        panic("unsupported reason");
-}  /* reason_str */
+}
 
 /**
  * Compare two number breakpoints.
  */
 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);
-}  /* cmp_nr_bp */
+}
 
 /**
  * Compare two ident breakpoints.
  */
 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);
-}  /* cmp_ident_bp */
+}
 
 /**
  * Update the hooks.
@@ -482,7 +479,7 @@ static void update_hooks(breakpoint *bp)
        }
 #undef CASE_ON
 #undef CASE_OFF
-}  /* update_hooks */
+}
 
 /**
  * Break if nr is reached.
@@ -497,7 +494,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 */
@@ -509,7 +506,7 @@ static void break_on_nr(long nr, bp_reasons_t reason)
 
                update_hooks(&elem->bp);
        }
-}  /* break_on_nr */
+}
 
 /**
  * Break if ident name is reached.
@@ -524,7 +521,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 */
@@ -536,7 +533,7 @@ static void break_on_ident(const char *name, bp_reasons_t reason)
 
                update_hooks(&elem->bp);
        }
-}  /* break_on_ident */
+}
 
 /**
  * Sets/resets the active flag of breakpoint bp.
@@ -557,7 +554,7 @@ static void bp_activate(unsigned bp, int active)
                }
        }
        dbg_printf("Error: Firm BP %u not exists.\n", bp);
-}  /* bp_activate */
+}
 
 
 /**
@@ -585,7 +582,7 @@ static void show_commands(void)
                "irgldname ldname      prints address and graph number of a method given by its ldname\n"
                "help                  list all commands\n"
                );
-}  /* show_commands */
+}
 
 /**
  * Shows all Firm breakpoints.
@@ -617,7 +614,7 @@ static void show_bp(void)
                dbg_printf(p->active ? "+enabled" : "+disabled");
        }
        dbg_printf(have_one ? "+\n" : "+ NONE\n");
-}  /* show_bp */
+}
 
 /**
  * firm_dbg_register() expects that the name is stored persistent.
@@ -628,7 +625,7 @@ 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));
-}  /* dbg_register */
+}
 
 /**
  * Sets the debug mask of module name to lvl
@@ -642,7 +639,7 @@ static void set_dbg_level(const char *name, unsigned lvl)
 
                dbg_printf("Setting debug mask of module %s to %u\n", name, lvl);
        }
-}  /* set_dbg_level */
+}
 
 /**
  * Redirects the debug output of module name to fname
@@ -659,7 +656,7 @@ static void set_dbg_outfile(const char *name, const char *fname)
 
        firm_dbg_set_file(module, f);
        dbg_printf("Redirecting debug output of module %s to file %s\n", name, fname);
-}  /* set_dbg_outfile */
+}
 
 /**
  * Show info about a firm thing.
@@ -677,10 +674,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:
@@ -696,7 +693,7 @@ static void show_firm_object(void *firm_thing)
        default:
                fprintf(f, "Cannot identify thing at (%p).\n", firm_thing);
        }
-}  /* show_firm_object */
+}
 
 /**
  * Find a firm type by its number.
@@ -715,7 +712,7 @@ static ir_type *find_type_nr(long nr)
        if (get_type_nr(tp) == nr)
                return tp;
        return NULL;
-}  /* find_type_nr */
+}
 
 /**
  * Find a firm type by its name.
@@ -737,7 +734,7 @@ static ir_type *find_type_name(const char *name)
        if (strcmp(get_compound_name(tp), name) == 0)
                return tp;
        return NULL;
-}  /* find_type_name */
+}
 
 /** The environment for the entity search functions. */
 typedef struct find_env {
@@ -753,27 +750,27 @@ typedef struct find_env {
  */
 static void check_ent_nr(type_or_ent tore, void *ctx)
 {
-       find_env_t *env = ctx;
+       find_env_t *env = (find_env_t*)ctx;
 
        if (is_entity(tore.ent)) {
                if (get_entity_nr(tore.ent) == env->u.nr) {
                        env->res = tore.ent;
                }
        }
-}  /* check_ent_nr */
+}
 
 /**
  * Type-walker: Find an entity with given name.
  */
 static void check_ent_name(type_or_ent tore, void *ctx)
 {
-       find_env_t *env = 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) {
                        env->res = tore.ent;
                }
-}  /* check_ent_name */
+}
 
 /**
  * Find a firm entity by its number.
@@ -786,7 +783,7 @@ static ir_entity *find_entity_nr(long nr)
        env.res  = NULL;
        type_walk(check_ent_nr, NULL, &env);
        return env.res;
-}  /* find_entity_nr */
+}
 
 /**
  * Find a firm entity by its name.
@@ -799,7 +796,7 @@ static ir_entity *find_entity_name(const char *name)
        env.res    = NULL;
        type_walk(check_ent_name, NULL, &env);
        return env.res;
-}  /* find_entity_name */
+}
 
 /**
  * Search methods for a name.
@@ -828,7 +825,7 @@ static void show_by_name(type_or_ent tore, void *env)
                        }
                }
        }
-}  /* show_by_name */
+}
 
 /**
  * Search methods for a ldname.
@@ -857,7 +854,7 @@ static void show_by_ldname(type_or_ent tore, void *env)
                        }
                }
        }
-}  /* show_by_ldname */
+}
 
 /**
  * prints the address and graph number of all irgs with given name
@@ -867,7 +864,7 @@ static void irg_name(const char *name)
        ident *id = new_id_from_str(name);
 
        type_walk(show_by_name, NULL, (void *)id);
-}  /* irg_name */
+}
 
 /**
  * prints the address and graph number of all irgs with given ld_name
@@ -877,7 +874,7 @@ static void irg_ld_name(const char *name)
        ident *id = new_id_from_str(name);
 
        type_walk(show_by_ldname, NULL, (void *)id);
-}  /* irg_ld_name */
+}
 
 enum tokens {
        tok_create = 256,
@@ -933,7 +930,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;
@@ -948,7 +945,7 @@ static void init_lexer(const char *input)
        lexer.has_token = 0;
        lexer.curr_pos  = input;
        lexer.end_pos   = input + strlen(input);
-}  /* init_lexer */
+}
 
 
 /**
@@ -959,9 +956,9 @@ 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)
@@ -972,15 +969,15 @@ static char next_char(void)
 static unsigned get_token(void)
 {
        char c;
-       int i;
+       size_t i;
 
        /* skip white space */
        do {
                c = next_char();
-       } while (c != '\0' && isspace(c));
+       } while (c != '\0' && isspace((unsigned char)c));
 
        lexer.tok_start = lexer.curr_pos - 1;
-       if (c == '.' || isalpha(c)) {
+       if (c == '.' || isalpha((unsigned char)c)) {
                /* command begins here */
                int         len = 0;
                const char* tok_start;
@@ -988,7 +985,7 @@ static unsigned get_token(void)
                do {
                        c = next_char();
                        ++len;
-               } while (isgraph(c));
+               } while (isgraph((unsigned char)c));
                unput();
 
                tok_start = lexer.tok_start;
@@ -996,7 +993,7 @@ static unsigned get_token(void)
                        ++tok_start;
                        --len;
                }
-               for (i = sizeof(reserved)/sizeof(reserved[0]) - 1; i >= 0; --i) {
+               for (i = ARRAY_SIZE(reserved); i-- != 0;) {
                        if (strncasecmp(tok_start, reserved[i], len) == 0 && reserved[i][len] == '\0')
                                return 256 + i;
                }
@@ -1005,7 +1002,7 @@ static unsigned get_token(void)
                lexer.s   = lexer.tok_start;
                lexer.len = lexer.curr_pos - lexer.s;
                return tok_identifier;
-       } else if (isdigit(c) || c == '-') {
+       } else if (isdigit((unsigned char)c) || c == '-') {
                unsigned number = 0;
                unsigned sign   = 0;
 
@@ -1022,12 +1019,12 @@ static unsigned get_token(void)
                                for (;;) {
                                        c = next_char();
 
-                                       if (! isxdigit(c))
+                                       if (! isxdigit((unsigned char)c))
                                                break;
-                                       if (isdigit(c))
+                                       if (isdigit((unsigned char)c))
                                                number = (number << 4) | (c - '0');
                                        else
-                                               number = (number << 4) | (toupper(c) - 'A' + 10);
+                                               number = (number << 4) | (toupper((unsigned char)c) - 'A' + 10);
                                }
                                unput();
                                lexer.number = number;
@@ -1035,7 +1032,7 @@ static unsigned get_token(void)
                        }
                }
                for (;;) {
-                       if (! isdigit(c))
+                       if (! isdigit((unsigned char)c))
                                break;
                        number = number * 10 + (c - '0');
                        c = next_char();
@@ -1047,12 +1044,12 @@ static unsigned get_token(void)
        else if (c == '\0')
                return tok_eof;
        return c;
-}  /* get_token */
+}
 
 void firm_debug(const char *cmd)
 {
        char name[1024], fname[1024];
-       int len;
+       size_t len;
 
        init_lexer(cmd);
 
@@ -1221,6 +1218,7 @@ void firm_debug(const char *cmd)
                        strncpy(fname, lexer.s, len);
                        fname[len] = '\0';
                        set_dbg_outfile(name, fname);
+                       break;
 
                case tok_irgname:
                        token = get_token();
@@ -1230,6 +1228,7 @@ void firm_debug(const char *cmd)
                        strncpy(name, lexer.s, len);
                        name[len] = '\0';
                        irg_name(name);
+                       break;
 
                case tok_irgldname:
                        token = get_token();
@@ -1261,7 +1260,7 @@ error:
        }
 leave:
        ;
-}  /* firm_debug */
+}
 
 void firm_init_debugger(void)
 {
@@ -1279,7 +1278,13 @@ void firm_init_debugger(void)
 
        if (break_on_init)
                firm_debug_break();
-}  /* firm_init_debugger */
+}
+
+void firm_finish_debugger(void)
+{
+       del_set(bp_numbers);
+       del_set(bp_idents);
+}
 
 /**
  * A gdb helper function to print firm objects.