add docu and prototype for find_value()
[libfirm] / ir / ana2 / pto_name.c
index e21b948..50cfec7 100644 (file)
@@ -8,7 +8,7 @@
   Modified by:
   Created:     Sat Nov 13 19:35:27 CET 2004
   CVS-ID:      $Id$
-  Copyright:   (c) 1999-2004 Universität Karlsruhe
+  Copyright:   (c) 1999-2004 Universitt Karlsruhe
   Licence:     This file is protected by the GPL -  GNU GENERAL PUBLIC LICENSE.
 */
 
 # include "pto_name.h"
 # include "pto_util.h"
 
+#include <assert.h>
+
+#ifdef HAVE_STRING_H
 # include <string.h>            /* for memcpy */
+#endif
 # include <obstack.h>
 # include <errno.h>
 
@@ -33,6 +37,7 @@
 # include "xmalloc.h"
 
 # include "pto_debug.h"
+# include "gnu_ext.h"
 
 /* Local Defines: */
 # define obstack_chunk_alloc xmalloc
@@ -156,12 +161,12 @@ static int pto_name_alloc_arr_color (arr_desc_t *arr_desc)
 /* allocate nice colors for the given descriptor */
 static int pto_name_alloc_color (desc_t *desc)
 {
+  int col_idx = 0;
+
   if (0 != desc->col_idx) {
     return (desc->col_idx);
   }
 
-  int col_idx = 0;
-
   if (FALSE == desc->visit) {
     desc->visit = TRUE;
     if (object == desc->kind) {
@@ -197,9 +202,9 @@ static void pto_name_alloc_colors (void)
 /* See whether the given entity is a field. */
 static int is_field (entity *ent)
 {
-  type *tp = get_entity_type (ent);
+  ir_type *tp = get_entity_type (ent);
 
-  if (is_primitive_type (tp) || is_pointer_type (tp)) {
+  if (is_Primitive_type (tp) || is_Pointer_type (tp)) {
     /* actually, we don't get by by restricting ourselves to pointer types */
     return (TRUE);
   } else {
@@ -207,9 +212,9 @@ static int is_field (entity *ent)
   }
 }
 
-/* Helper to collect_fields(type*): collect all fields of the given
+/* Helper to collect_fields(ir_type*): collect all fields of the given
   clazz and its super classes into the given obstack. */
-static void _collect_fields (type *clazz, struct obstack *obst)
+static void _collect_fields (ir_type *clazz, struct obstack *obst)
 {
   int n_members = get_class_n_members (clazz);
   int n_supers  = get_class_n_supertypes (clazz);
@@ -226,7 +231,7 @@ static void _collect_fields (type *clazz, struct obstack *obst)
   }
 
   for (i = 0; i < n_supers; i ++) {
-    type *s_clazz = get_class_supertype (clazz, i);
+    ir_type *s_clazz = get_class_supertype (clazz, i);
 
     _collect_fields (s_clazz, obst);
   }
@@ -234,38 +239,42 @@ static void _collect_fields (type *clazz, struct obstack *obst)
 
 /* Collect the fields of the given class and its super classes into an array.
   The last entry of the array is written NULL. */
-static entity **collect_fields (type *clazz)
+static entity **collect_fields (ir_type *clazz)
 {
+  struct obstack obst;
+  int n_fields;
+  entity ** fields;
+  void *tmp;
+
   if (NULL != get_type_link (clazz)) {
     DBGPRINT (3, (stdout, "%s: reusing field list for \"%s\"\n",
-                  __FUNCTION__, get_type_name (clazz)));
+                  __FUNCTION__,
+                  get_type_name (clazz)));
 
     return ((entity **) get_type_link (clazz));
   } else {
     DBGPRINT (2, (stdout, "%s: new field list for \"%s\"\n",
-                  __FUNCTION__, get_type_name (clazz)));
+                  __FUNCTION__,
+                  get_type_name (clazz)));
   }
 
-  struct obstack obst;
-
   obstack_init (&obst);
 
   _collect_fields (clazz, &obst);
 
   /* append terminating NULL */
-  int *the_null = NULL;
-  obstack_ptr_grow (&obst, the_null);
+  obstack_ptr_grow (&obst, NULL);
 
-  int n_fields = obstack_object_size (&obst) / sizeof (void*);
+  n_fields = obstack_object_size (&obst) / sizeof (void*);
 
-  entity ** fields = (entity**) NALLOC (n_fields * sizeof (entity*));
-  void *tmp = obstack_finish (&obst);
+  fields = NALLOC (n_fields * sizeof (entity*));
+  tmp = obstack_finish(&obst);
 
   memcpy (fields, tmp, n_fields * sizeof (entity*));
 
   obstack_free (&obst, NULL);
 
-  set_type_link (clazz, (void*) fields);
+  set_type_link (clazz, fields);
 
   return (fields);
 }
@@ -293,19 +302,27 @@ static void pto_name_dump_finish (FILE *stream)
 /* Write a node for the given descriptor into the given stream */
 static void pto_name_dump_desc (desc_t *desc, FILE *stream)
 {
-  type *tp = desc->tp;
+  ir_type *tp = desc->tp;
   const char *tp_name = get_type_name (tp);
+  ir_node *nd;
 
   fprintf (stream, "\t/* %s \"%s\" */\n",
            object == desc->kind ? "Object" : "Array",
            tp_name);
 
-  fprintf (stream, "\tdesc_%i [label=\"<HEAD>type \\[%i\\]\\lname=\\\"%s\\\"",
-           desc->id,
-           desc->id,
+  fprintf (stream, "\tdesc_%i [label=\"<HEAD>type \\[%i\\]",
+           desc->id, desc->id);
+
+  if (-1 != desc->ctx) {
+    fprintf (stream, ", ctx = %i", desc->ctx);
+  } else {
+    fprintf (stream, " (global)");
+  }
+
+  fprintf (stream, "\\lname=\\\"%s\\\"",
            tp_name);
 
-  ir_node *nd = desc->node;
+  nd = desc->node;
 
   if (NULL != nd) {
     ir_graph *graph = get_irn_irg (nd);
@@ -328,7 +345,7 @@ static void pto_name_dump_desc (desc_t *desc, FILE *stream)
     for (i = 0; i < obj_desc->n_fields; i ++) {
       entity *field = obj_desc->fields [i];
 
-      if (is_pointer_type (get_entity_type (field))) {
+      if (is_Pointer_type (get_entity_type (field))) {
         const char *ent_name = get_entity_name (field);
 
         fprintf (stream, "|<%i>%s", i, ent_name);
@@ -344,46 +361,47 @@ static void pto_name_dump_desc (desc_t *desc, FILE *stream)
   fprintf (stream, "\"");
 
 # ifdef PTO_COLOR
-  int col_idx = desc->col_idx;
-  float hue = (float) col_idx / (float) last_col_idx;
-  float sat = 1.000;            /* 0.300 .. 1.000 */
-  float val = 0.800;            /* 0.300 .. 1.000 */
-
-# define MAX_COLORS 12
-  if (last_col_idx > MAX_COLORS) {
-    /* too many colors ... vary value too */
-    float div = (float) MAX_COLORS / (float) last_col_idx;
-
-    sat = (div * ((col_idx / MAX_COLORS)));
-    val = (div * ((col_idx / MAX_COLORS)));
-
-    col_idx = col_idx % MAX_COLORS;
-    hue = (float) col_idx / (float) MAX_COLORS;
-
-    // re-adjust sat and val
-    {
-      const float sat_min = 0.200; /* 0.200 .. 0.400 */
-      const float val_min = 0.300; /* 0.300 .. 0.400 */
-
-      sat = sat_min + ((1.0 - sat_min) * sat);
-      val = val_min + ((1.0 - val_min) * val);
+  {
+    const char *fontcolor;
+    int col_idx = desc->col_idx;
+    float hue = (float) col_idx / (float) last_col_idx;
+    float sat = 1.000f;            /* 0.300 .. 1.000 */
+    float val = 0.800f;            /* 0.300 .. 1.000 */
+
+  # define MAX_COLORS 12
+    if (last_col_idx > MAX_COLORS) {
+      /* too many colors ... vary value too */
+      float div = (float) MAX_COLORS / (float) last_col_idx;
+
+      sat = (div * ((col_idx / MAX_COLORS)));
+      val = (div * ((col_idx / MAX_COLORS)));
+
+      col_idx = col_idx % MAX_COLORS;
+      hue = (float) col_idx / (float) MAX_COLORS;
+
+      // re-adjust sat and val
+      {
+        const float sat_min = 0.200f; /* 0.200 .. 0.400 */
+        const float val_min = 0.300f; /* 0.300 .. 0.400 */
+
+        sat = sat_min + ((1.0f - sat_min) * sat);
+        val = val_min + ((1.0f - val_min) * val);
+      }
     }
-  }
-# undef MAX_COLORS
+  # undef MAX_COLORS
 
-  fprintf (stream, ", color=\"%01.3f, %01.3f, %01.3f\"", hue, sat, val);
+    fprintf (stream, ", color=\"%01.3f, %01.3f, %01.3f\"", hue, sat, val);
 
-  char *fontcolor;
+    if ((hue > 0.3) && (sat < 0.5)) {
+      fontcolor = "white";
+    } else if (sat < 0.4) {
+      fontcolor = "white";
+    } else {
+      fontcolor = "black";
+    }
 
-  if ((hue > 0.3) && (sat < 0.5)) {
-    fontcolor = "white";
-  } else if (sat < 0.4) {
-    fontcolor = "white";
-  } else {
-    fontcolor = "black";
+    fprintf (stream, ", fontcolor=\"%s\"", fontcolor);
   }
-
-  fprintf (stream, ", fontcolor=\"%s\"", fontcolor);
 # else /* if defined PTO_COLOR */
   fprintf (stream, ", color=\"lightgrey\"");
 # endif /* defined PTO_COLOR */
@@ -450,22 +468,24 @@ qset_t *get_entry (desc_t *desc, entity *ent)
   } else {
     assert (0 && "invalid descriptor");
   }
+  return NULL;
 }
 
 
 /* get a new descriptor for the given type at the given node */
-desc_t *new_name (type *tp, ir_node *node)
+desc_t *new_name (ir_type *tp, ir_node *node, int ctx)
 {
   desc_t *desc = NULL;
 
-  assert ((is_class_type (tp) || is_array_type (tp)) && "unsuitable type");
+  assert ((is_Class_type (tp) || is_Array_type (tp)) && "unsuitable type");
 
-  DBGPRINT (2, (stdout, "%s: new name for type \"%s\"\n", __FUNCTION__,
+  DBGPRINT (2, (stdout, "%s: new name for type \"%s\"\n",
+                __FUNCTION__,
                 get_type_name (tp)));
   fflush (stdout);
 
-  if (is_class_type (tp)) {
-    obj_desc_t *obj_desc = (obj_desc_t*) NALLOC (sizeof (obj_desc_t));
+  if (is_Class_type (tp)) {
+    obj_desc_t *obj_desc = NALLOC (sizeof (obj_desc_t));
     int i;
     int n_fields;
 
@@ -477,14 +497,14 @@ desc_t *new_name (type *tp, ir_node *node)
     }
 
     obj_desc->n_fields = n_fields;
-    obj_desc->values = (qset_t**) NALLOC (n_fields * sizeof (qset_t));
+    obj_desc->values = (qset_t**) NALLOC (n_fields * sizeof (qset_t*));
 
     for (i = 0; i < n_fields; i ++) {
       obj_desc->values [i] = qset_new (N_INITIAL_OJBS, qset_obst);
     }
 
     desc = (desc_t*) obj_desc;
-  } else if (is_array_type (tp)) {
+  } else if (is_Array_type (tp)) {
     arr_desc_t *arr_desc = (arr_desc_t*) NALLOC (sizeof (arr_desc_t));
 
     arr_desc->kind = array;
@@ -493,13 +513,14 @@ desc_t *new_name (type *tp, ir_node *node)
     desc = (desc_t*) arr_desc;
   }
 
-  desc->id   = name_id ++;
+  desc->id    = name_id ++;
   desc->col_idx = 0;
-  desc->tp   = tp;
+  desc->tp    = tp;
   desc->visit = FALSE;
-  desc->node = node;
+  desc->ctx   = ctx;
+  desc->node  = node;
 
-  desc->prev = all_descs;
+  desc->prev  = all_descs;
   all_descs = desc;
 
   return (desc);
@@ -514,15 +535,16 @@ desc_t *new_ent_name (entity *ent)
 {
   int i;
   int missing = TRUE;
-  type *tp = get_entity_type (ent);
+  ir_type *tp = get_entity_type (ent);
 
-  assert (is_pointer_type (tp));
+  assert (is_Pointer_type (tp));
   tp = get_pointer_points_to_type (tp);
-  assert (is_class_type (tp));
+  assert (is_Class_type (tp));
 
-  DBGPRINT (2, (stdout, "%s: new name for entity \"%s\"\n", __FUNCTION__,
+  DBGPRINT (2, (stdout, "%s: new name for entity \"%s\"\n",
+                __FUNCTION__,
                 get_entity_name (ent)));
-  DBGEXE (fflush (stdout));
+  DBGEXE (2, (fflush (stdout)));
 
   assert (((allocation_static == get_entity_allocation (ent)) ||
            (allocation_automatic == get_entity_allocation (ent))) &&
@@ -532,6 +554,7 @@ desc_t *new_ent_name (entity *ent)
     obj_glob = (obj_desc_t*) NALLOC (sizeof (obj_desc_t));
 
     obj_glob->id   = name_id ++;
+    obj_glob->ctx  = -1;
     obj_glob->col_idx = 0;
     obj_glob->visit = FALSE;
     obj_glob->kind = object;
@@ -602,9 +625,9 @@ void pto_dump_names (const char *name)
 }
 
 /* Initialise the name module */
-void pto_name_init ()
+void pto_name_init (void)
 {
-  DBGPRINT (3, (stdout, "(%s:%i) %s\n", __FILE__, __LINE__, __FUNCTION__));
+  DBGPRINT (3, (stdout, "%s\n", __FUNCTION__));
   assert (NULL == name_obst);
   assert (NULL == qset_obst);
 
@@ -616,9 +639,9 @@ void pto_name_init ()
 }
 
 /* Cleanup the name module */
-void pto_name_cleanup ()
+void pto_name_cleanup (void)
 {
-  DBGPRINT (3, (stdout, "(%s:%i) %s\n", __FILE__, __LINE__, __FUNCTION__));
+  DBGPRINT (3, (stdout, "%s\n", __FUNCTION__));
   obstack_free (name_obst, NULL);
   obstack_free (qset_obst, NULL);
 
@@ -635,6 +658,41 @@ void pto_name_cleanup ()
 \f
 /*
   $Log$
+  Revision 1.18  2006/01/13 22:56:21  beck
+  renamed all types 'type' to 'ir_type'
+
+  Revision 1.17  2005/12/16 16:59:54  grund
+  *** empty log message ***
+
+  Revision 1.16  2005/12/05 12:19:54  beck
+  added missing include <assert.h> (not anymore included in libFirm)
+
+  Revision 1.15  2005/03/02 10:14:38  beck
+  placed a return on all execution pathes
+
+  Revision 1.14  2005/02/17 08:45:38  liekweg
+  Don't return a value for an invalid descriptor
+
+  Revision 1.13  2005/02/11 10:21:28  beck
+  get_entry now always returns a value
+
+  Revision 1.12  2005/01/14 14:13:56  liekweg
+  fix gnu extension, fix fprintf's, fix allocs
+
+  Revision 1.11  2005/01/05 14:25:54  beck
+  renames all is_x*_type() functions to is_X*_type() to prevent name clash with EDG fronten
+
+  Revision 1.10  2004/12/22 14:43:14  beck
+  made allocations C-like
+
+  Revision 1.9  2004/12/21 15:34:09  beck
+  removed C99 constructs
+  make const float
+  add default return
+
+  Revision 1.8  2004/12/15 13:30:30  liekweg
+  use DBGEXE correctly; print yet nicer names
+
   Revision 1.7  2004/12/15 09:18:18  liekweg
   pto_name.c