Correct a subtle bug in the ia32 backend: Sub(x, x) triggered that the Neg+Add trick...
[libfirm] / ir / ir / irdump_grgen.c
index b4feb05..62c94d4 100644 (file)
@@ -42,6 +42,7 @@
 #include "tv.h"
 #include "irgwalk.h"
 #include "firm_types.h"
+#include "irdump_grgen.h"
 
 
 typedef struct
@@ -114,10 +115,10 @@ static int edge_counter;
 
 irg_grgen_dumper_env_t *init_irg_grgen_dumper(char *file, int append)
 {
-       irg_grgen_dumper_env_t *const grgen_dumper_env = xmalloc(sizeof(*grgen_dumper_env));
+       irg_grgen_dumper_env_t *const grgen_dumper_env = XMALLOC(irg_grgen_dumper_env_t);
        FILE *fp;
 
-       if(append)
+       if (append)
                fp = fopen(file, "at");
        else
        {
@@ -216,9 +217,9 @@ void dump_irg_grgen(ir_graph *irg, char *suffix)
 {
   char filename[100] = "";
 
-  strncat(filename, get_entity_name(get_irg_entity(irg)), 100);
-  strncat(filename, suffix, 100);
-  strncat(filename, ".grg", 100);
+  strncat(filename, get_entity_name(get_irg_entity(irg)), sizeof(filename)-1);
+  strncat(filename, suffix, sizeof(filename)-1);
+  strncat(filename, ".grg", sizeof(filename)-1);
 
   dump_irg_grgen_file(irg, filename, 0);
 }
@@ -240,7 +241,7 @@ static int dump_pattern(grgen_dumpinfo_t *dump_info, FILE *fp)
                ir_node *n = (ir_node *) entry->key;
 
                // Dump node
-               if(get_irn_opcode(n) == iro_Proj && get_irn_modecode(n) == irm_M)
+               if (get_irn_opcode(n) == iro_Proj && get_irn_mode(n) == mode_M)
                        uses_memory = 1;
                dump_grg_node(n, dump_info, fp);
                dump_grgen_mode(n, dump_info, fp, NULL);
@@ -253,7 +254,7 @@ static int dump_pattern(grgen_dumpinfo_t *dump_info, FILE *fp)
                int i;
 
                // Dump edges
-               for(i = is_Block(n) ? 0 : -1; i < get_irn_arity(n); i++)
+               for (i = is_Block(n) ? 0 : -1; i < get_irn_arity(n); i++)
                        dump_grg_egde(n, i, dump_info, fp);
        }
 
@@ -284,12 +285,12 @@ static void dump_grg_node(ir_node *n, grgen_dumpinfo_t *dump_info, FILE *fp)
        char *node_name;
 
        // Already dumped the node? Then do nothing
-       if(pmap_contains(dump_info -> node_name_map, n))
+       if (pmap_contains(dump_info -> node_name_map, n))
                return;
 
        // Else generate new node name and dump the node
 
-       node_name = obstack_alloc(&(dump_info -> node_names), MAX_NODENAME_LEN);
+       node_name = OALLOCN(&dump_info->node_names, char, MAX_NODENAME_LEN);
 
        sprintf(node_name, "%s%ld", get_op_name(get_irn_op(n)), get_irn_node_nr(n));
        fprintf(fp, "%s%s : %s;\n", indent, node_name, get_op_name(get_irn_op(n)));
@@ -315,13 +316,13 @@ static void dump_grg_egde(ir_node *n, int n_edge, grgen_dumpinfo_t *dump_info, F
        // We have to dump to_node here, because to_node has to be known by grgen before
        // connecting an edge to it.
        to_node =  get_irn_n(n, n_edge);
-       if(!pmap_contains(dump_info -> nodes_to_dump, to_node))
+       if (!pmap_contains(dump_info -> nodes_to_dump, to_node))
                return;
 
-       if((nodes_edge_names = pmap_get(dump_info -> edge_name_map, n)) == NULL)
+       if ((nodes_edge_names = pmap_get(dump_info -> edge_name_map, n)) == NULL)
        {
-               nodes_edge_names = (char **) obstack_alloc(&(dump_info->node_names), (get_irn_arity(n) + 1) * sizeof(char *));
-               memset(nodes_edge_names, 0, (get_irn_arity(n) + 1) * sizeof(char *));
+               size_t const count = get_irn_arity(n) + 1;
+               nodes_edge_names = OALLOCNZ(&dump_info->node_names, char*, count);
                pmap_insert(dump_info->edge_name_map, n, nodes_edge_names);
        }
 
@@ -335,7 +336,7 @@ static void dump_grg_egde(ir_node *n, int n_edge, grgen_dumpinfo_t *dump_info, F
        char edge_name[50], *edge_name_obst;
 
        sprintf(edge_name, "pos%d_%d", n_edge + 1, edge_counter++);
-       edge_name_obst = obstack_alloc(&(dump_info->node_names), strlen(edge_name) + 1);
+       edge_name_obst = OALLOCN(&dump_info->node_names, char, strlen(edge_name) + 1);
        strcpy(edge_name_obst, edge_name);
        nodes_edge_names[n_edge + 1] = edge_name_obst;
 
@@ -371,9 +372,9 @@ static void dump_grgen_mode(ir_node *n, grgen_dumpinfo_t *dump_info, FILE *fp, i
        //mode_node_name = pmap_get(dump_info -> mode_name_map, (void *) mode_code);
        sprintf(edge_name, "m%d", edge_counter++);
 
-       if(pmap_get(dump_info->mode_edge_map, n) == NULL)
+       if (pmap_get(dump_info->mode_edge_map, n) == NULL)
        {
-               char *edge_name_obst = obstack_alloc(&(dump_info->node_names), strlen(edge_name) + 1);
+               char *edge_name_obst = OALLOCN(&dump_info->node_names, char, strlen(edge_name) + 1);
                strcpy(edge_name_obst, edge_name);
                pmap_insert(dump_info->mode_edge_map, n, edge_name_obst);
        }
@@ -390,22 +391,21 @@ static void dump_grgen_mode(ir_node *n, grgen_dumpinfo_t *dump_info, FILE *fp, i
 
 static char *dump_grgen_mode_node(ir_mode *irn_mode, grgen_dumpinfo_t *dump_info, FILE *fp)
 {
-       ir_modecode mode_code = get_mode_modecode(irn_mode);
        const char *mode_name =  get_mode_name(irn_mode);
        char *mode_node_name;
 
-       if(!pmap_contains(dump_info -> mode_name_map, (void *) mode_code))
+       if (!pmap_contains(dump_info -> mode_name_map, irn_mode))
        {
                // No, create a new mode-node
-               mode_node_name = obstack_alloc(&(dump_info -> mode_names), MAX_NODENAME_LEN);
+               mode_node_name = OALLOCN(&dump_info->mode_names, char, MAX_NODENAME_LEN);
                sprintf(mode_node_name, "mode_%s_node", mode_name);
-               pmap_insert(dump_info -> mode_name_map, (void *) mode_code, mode_node_name);
+               pmap_insert(dump_info -> mode_name_map, irn_mode, mode_node_name);
                fprintf(fp, "%s%s : Mode_%s;\n", indent, mode_node_name, mode_name);
                return(mode_node_name);
        }
        else
        {
-               return((char *) pmap_get(dump_info -> mode_name_map, (void *) mode_code));
+               return((char *) pmap_get(dump_info -> mode_name_map, irn_mode));
        }
 
 }
@@ -422,26 +422,26 @@ static void dump_grgen_eval(ir_node *n, grgen_dumpinfo_t *dump_info, FILE *fp)
        char *node_name;
        ir_opcode code = get_irn_opcode(n);
 
-       if(code == iro_Const)
+       if (code == iro_Const)
        {
                node_name = pmap_get(dump_info->node_name_map, n);
                fprintf(fp, "%s%s.value = \"%ld\";\n", indent, node_name, get_tarval_long(get_Const_tarval(n)));
        }
 
 
-       if(code == iro_Proj)
+       if (code == iro_Proj)
        {
                node_name = pmap_get(dump_info->node_name_map, n);
                fprintf(fp, "%s%s.proj = %ld;\n", indent, node_name, get_Proj_proj(n));
        }
 
-       /*if(code == iro_Block)
+       /*if (code == iro_Block)
        {
                node_name = pmap_get(dump_info->node_name_map, n);
                fprintf(fp, "%s%s.pos = %d;\n", indent, node_name, ??);
        }
 
-       if(code == iro_Phi)
+       if (code == iro_Phi)
        {
                node_name = pmap_get(dump_info->node_name_map, n);
                fprintf(fp, "%s%s.pos = %d;\n", indent, node_name, ??);
@@ -450,7 +450,7 @@ static void dump_grgen_eval(ir_node *n, grgen_dumpinfo_t *dump_info, FILE *fp)
        // TODO: Dump Block evals: edge numbers
 
 
-       if(code == iro_Phi || code == iro_Block)
+       if (code == iro_Phi || code == iro_Block)
        {
                char **edge_names;
                int i;
@@ -463,7 +463,7 @@ static void dump_grgen_eval(ir_node *n, grgen_dumpinfo_t *dump_info, FILE *fp)
 
                // Correlate the matched phi edges with the matched block edges
                // Caution: Position 0 in the edge_names array is the block edge, so start at 1
-               for(i = code == iro_Block; i < get_irn_arity(n) + 1; i++)
+               for (i = code == iro_Block; i < get_irn_arity(n) + 1; i++)
                {
                        assert(edge_names[i] != NULL && "Some edges have not been dumped!");
 
@@ -486,9 +486,9 @@ static void set_indent(int i)
        int j;
 
        // Generate a string containing i blank characters
-       if(i < MAX_INDENT - 1)
+       if (i < MAX_INDENT - 1)
        {
-               for(j = 0; j < i; j++)
+               for (j = 0; j < i; j++)
                        indent[j] = ' ';
                indent[j] = 0x0;
        }