make allocation C-like
[libfirm] / ir / tr / entity.c
index 95ae52e..aee090d 100644 (file)
@@ -9,38 +9,69 @@
  * Copyright:   (c) 1998-2003 Universität Karlsruhe
  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
  */
-
 #ifdef HAVE_CONFIG_H
-# include <config.h>
+#include "config.h"
 #endif
 
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_STDLIB_H
 # include <stdlib.h>
+#endif
 # include <stddef.h>
-# include <string.h>
 
+#include "firm_common_t.h"
+
+# include "xmalloc.h"
 # include "entity_t.h"
 # include "mangle.h"
 # include "typegmod.h"
 # include "array.h"
+
 /* All this is needed to build the constant node for methods: */
 # include "irprog_t.h"
 # include "ircons.h"
 # include "tv_t.h"
 
+#if DEBUG_libfirm
+# include "irdump.h"  /* for output if errors occur. */
+#endif
+
+# include "callgraph.h"  /* for dumping debug output */
+
 /*******************************************************************/
 /** general                                                       **/
 /*******************************************************************/
 
+entity *unknown_entity = NULL; entity *get_unknown_entity(void) { return unknown_entity; }
+#define UNKNOWN_ENTITY_NAME "unknown_entity"
+
+static INLINE entity *
+new_rd_entity (dbg_info *db, type *owner, ident *name, type *type);
+
 void
 init_entity (void)
 {
+  symconst_symbol sym;
+
+  assert(unknown_type && "Call init_type before init_entity!");
+  assert(!unknown_entity && "Call init_entity only once!");
+  unknown_entity = new_rd_entity(NULL, unknown_type, new_id_from_str(UNKNOWN_ENTITY_NAME), unknown_type);
+  set_entity_visibility(unknown_entity, visibility_external_allocated);
+  set_entity_ld_ident(unknown_entity, get_entity_ident(unknown_entity));
+
+  sym.entity_p = unknown_entity;
+  current_ir_graph = get_const_code_irg();
+  unknown_entity->value = new_SymConst(sym, symconst_addr_ent);
 }
 
+
 /*-----------------------------------------------------------------*/
 /* ENTITY                                                          */
 /*-----------------------------------------------------------------*/
 
-static void insert_entity_in_owner (entity *ent) {
+static INLINE void insert_entity_in_owner (entity *ent) {
   type *owner = ent->owner;
   switch (get_type_tpop_code(owner)) {
   case tpo_class: {
@@ -59,8 +90,8 @@ static void insert_entity_in_owner (entity *ent) {
   }
 }
 
-entity *
-new_entity (type *owner, ident *name, type *type)
+static INLINE entity *
+new_rd_entity (dbg_info *db, type *owner, ident *name, type *type)
 {
   entity *res;
   ir_graph *rem;
@@ -68,8 +99,8 @@ new_entity (type *owner, ident *name, type *type)
   assert(!id_contains_char(name, ' ') && "entity name should not contain spaces");
 
   res = (entity *) xmalloc (sizeof (entity));
+  memset(res, 0, sizeof(res));
   res->kind = k_entity;
-  assert_legal_owner_of_ent(owner);
   res->owner = owner;
   res->name = name;
   res->type = type;
@@ -108,23 +139,39 @@ new_entity (type *owner, ident *name, type *type)
   }
   res->irg = NULL;
 
+  //res->accesses = NULL;
+
 #ifdef DEBUG_libfirm
   res->nr = get_irp_new_node_nr();
-#endif
+  res->c_name = (char *)get_id_str (name);
+#endif /* DEBUG_libfirm */
 
   res->visit = 0;
+  set_entity_dbg_info(res, db);
 
-  /* Remember entity in it's owner. */
-  insert_entity_in_owner (res);
   return res;
 }
+
 entity *
 new_d_entity (type *owner, ident *name, type *type, dbg_info *db) {
-  entity *res = new_entity(owner, name, type);
-  set_entity_dbg_info(res, db);
+  entity *res;
+
+  assert_legal_owner_of_ent(owner);
+  res = new_rd_entity(db, owner, name, type);
+  /* Remember entity in it's owner. */
+  insert_entity_in_owner (res);
+
   return res;
 }
 
+entity *
+new_entity (type *owner, ident *name, type *type) {
+  return new_d_entity(owner, name, type, NULL);
+}
+
+
+
+
 static void free_entity_attrs(entity *ent) {
   int i;
   if (get_type_tpop(get_entity_owner(ent)) == type_class) {
@@ -186,6 +233,7 @@ copy_entity_name (entity *old, ident *new_name) {
   }
 #ifdef DEBUG_libfirm
   new->nr = get_irp_new_node_nr();
+  new->c_name = (char *)get_id_str (new->name);
 #endif
 
   insert_entity_in_owner (new);
@@ -197,7 +245,6 @@ copy_entity_name (entity *old, ident *new_name) {
 void
 free_entity (entity *ent) {
   assert(ent && ent->kind == k_entity);
-  free_tarval_entity(ent);
   free_entity_attrs(ent);
   ent->kind = k_BAD;
   free(ent);
@@ -215,12 +262,12 @@ get_entity_nr(entity *ent) {
 }
 
 const char *
-(get_entity_name)(entity *ent) {
+(get_entity_name)(const entity *ent) {
   return __get_entity_name(ent);
 }
 
 ident *
-(get_entity_ident)(entity *ent) {
+(get_entity_ident)(const entity *ent) {
   return get_entity_ident(ent);
 }
 
@@ -276,7 +323,7 @@ void
 }
 
 ent_allocation
-(get_entity_allocation)(entity *ent) {
+(get_entity_allocation)(const entity *ent) {
   return __get_entity_allocation(ent);
 }
 
@@ -301,7 +348,7 @@ const char *get_allocation_name(ent_allocation all)
 
 
 ent_visibility
-(get_entity_visibility)(entity *ent) {
+(get_entity_visibility)(const entity *ent) {
   return __get_entity_visibility(ent);
 }
 
@@ -330,7 +377,7 @@ const char *get_visibility_name(ent_visibility vis)
 }
 
 ent_variability
-(get_entity_variability)(entity *ent) {
+(get_entity_variability)(const entity *ent) {
   return __get_entity_variability(ent);
 }
 
@@ -347,6 +394,11 @@ set_entity_variability (entity *ent, ent_variability var)
     ent->values    = NEW_ARR_F(ir_node *, 0);
     ent->val_paths = NEW_ARR_F(compound_graph_path *, 0);
   }
+  if ((is_atomic_type(ent->type)) &&
+      (ent->variability == variability_uninitialized) && (var != variability_uninitialized)) {
+    /* Set default constant value. */
+    ent->value = new_rd_Unknown(get_const_code_irg(), get_type_mode(ent->type));
+  }
 
   if ((is_compound_type(ent->type)) &&
       (var == variability_uninitialized) && (ent->variability != variability_uninitialized)) {
@@ -372,7 +424,7 @@ const char *get_variability_name(ent_variability var)
 }
 
 ent_volatility
-(get_entity_volatility)(entity *ent) {
+(get_entity_volatility)(const entity *ent) {
   return __get_entity_volatility(ent);
 }
 
@@ -394,7 +446,7 @@ const char *get_volatility_name(ent_volatility var)
 }
 
 peculiarity
-(get_entity_peculiarity)(entity *ent) {
+(get_entity_peculiarity)(const entity *ent) {
   return __get_entity_peculiarity(ent);
 }
 
@@ -418,7 +470,7 @@ const char *get_peculiarity_name(peculiarity var)
 
 /* Get the entity's stickyness */
 ent_stickyness
-(get_entity_stickyness)(entity *ent) {
+(get_entity_stickyness)(const entity *ent) {
   return __get_entity_stickyness(ent);
 }
 
@@ -450,20 +502,18 @@ set_atomic_ent_value(entity *ent, ir_node *val) {
 int is_irn_const_expression(ir_node *n) {
   ir_mode *m;
 
+  /* we are in dange iff an exception will arise. TODO: be more precisely,
+   * for instance Div. will NOT rise if divisor != 0
+   */
+  if (is_binop(n) && !is_fragile_op(n))
+    return is_irn_const_expression(get_binop_left(n)) && is_irn_const_expression(get_binop_right(n));
+
   m = get_irn_mode(n);
   switch(get_irn_opcode(n)) {
   case iro_Const:
   case iro_SymConst:
   case iro_Unknown:
     return true; break;
-  case iro_Add:
-  case iro_Sub:
-  case iro_Mul:
-  case iro_And:
-  case iro_Or:
-  case iro_Eor:
-    if (is_irn_const_expression(get_binop_left(n)))
-      return is_irn_const_expression(get_binop_right(n));
   case iro_Conv:
   case iro_Cast:
     return is_irn_const_expression(get_irn_n(n, 0));
@@ -479,32 +529,38 @@ ir_node *copy_const_value(ir_node *n) {
   ir_node *nn;
   ir_mode *m;
 
+  /* @@@ GL I think  we should implement this using the routines from irgopt for
+     dead node elimination/inlineing. */
+
   m = get_irn_mode(n);
   switch(get_irn_opcode(n)) {
   case iro_Const:
-    nn = new_Const(m, get_Const_tarval(n)); break;
+    nn = new_Const(m, get_Const_tarval(n));     set_Const_type(nn, get_Const_type(n));
+    //nn = new_rd_Const_type(get_irn_dbg_info(n), current_ir_graph, get_cur_block(),
+    //            m,  get_Const_tarval(n), get_Const_type(n));
+    break;
   case iro_SymConst:
-
-    nn = new_SymConst(get_SymConst_symbol(n), get_SymConst_kind(n));
+    nn = new_d_SymConst_type(NULL, get_SymConst_symbol(n), get_SymConst_kind(n),
+                            get_SymConst_value_type(n));
     break;
   case iro_Add:
     nn = new_Add(copy_const_value(get_Add_left(n)),
-         copy_const_value(get_Add_right(n)), m); break;
+                copy_const_value(get_Add_right(n)), m); break;
   case iro_Sub:
     nn = new_Sub(copy_const_value(get_Sub_left(n)),
-         copy_const_value(get_Sub_right(n)), m); break;
+                copy_const_value(get_Sub_right(n)), m); break;
   case iro_Mul:
     nn = new_Mul(copy_const_value(get_Mul_left(n)),
-         copy_const_value(get_Mul_right(n)), m); break;
+                copy_const_value(get_Mul_right(n)), m); break;
   case iro_And:
     nn = new_And(copy_const_value(get_And_left(n)),
-         copy_const_value(get_And_right(n)), m); break;
+                copy_const_value(get_And_right(n)), m); break;
   case iro_Or:
     nn = new_Or(copy_const_value(get_Or_left(n)),
-         copy_const_value(get_Or_right(n)), m); break;
+               copy_const_value(get_Or_right(n)), m); break;
   case iro_Eor:
     nn = new_Eor(copy_const_value(get_Eor_left(n)),
-         copy_const_value(get_Eor_right(n)), m); break;
+                copy_const_value(get_Eor_right(n)), m); break;
   case iro_Cast:
     nn = new_Cast(copy_const_value(get_Cast_op(n)), get_Cast_type(n)); break;
   case iro_Conv:
@@ -513,7 +569,7 @@ ir_node *copy_const_value(ir_node *n) {
     nn = new_Unknown(m); break;
   default:
     DDMN(n);
-    assert(0 && "opdope invalid or not implemented");
+    assert(0 && "opcode invalid or not implemented");
     nn = NULL;
     break;
   }
@@ -526,11 +582,11 @@ new_compound_graph_path(type *tp, int length) {
   assert(is_type(tp) && is_compound_type(tp));
   assert(length > 0);
 
-  res = (compound_graph_path *) calloc (1, sizeof(compound_graph_path) + (length-1) * sizeof(entity *));
+  res = calloc (1, sizeof(*res) + (length-1) * sizeof(res->nodes[0]));
   res->kind          = k_ir_compound_graph_path;
   res->tp            = tp;
   res->len           = length;
-  res ->arr_indicees = (int *) calloc(length, sizeof(int));
+  res ->arr_indicees = calloc(length, sizeof(*res ->arr_indicees));
   return res;
 }
 
@@ -721,6 +777,7 @@ set_array_entity_values(entity *ent, tarval **values, int num_vals) {
   ir_graph *rem = current_ir_graph;
   type *arrtp = get_entity_type(ent);
   ir_node *val;
+  type *elttp = get_array_element_type(arrtp);
 
   assert(is_array_type(arrtp));
   assert(get_array_n_dimensions(arrtp) == 1);
@@ -731,7 +788,7 @@ set_array_entity_values(entity *ent, tarval **values, int num_vals) {
   current_ir_graph = get_const_code_irg();
 
   for (i = 0; i < num_vals; i++) {
-    val = new_Const(get_tarval_mode (values[i]), values[i]);
+    val = new_Const_type(values[i], elttp);
     add_compound_ent_value(ent, val, get_array_element_entity(arrtp));
     set_compound_graph_path_array_index(get_compound_ent_value_path(ent, i), 0, i);
   }
@@ -739,24 +796,27 @@ set_array_entity_values(entity *ent, tarval **values, int num_vals) {
 }
 
 int  get_compound_ent_value_offset_bits(entity *ent, int pos) {
+  compound_graph_path *path;
+  int i, path_len;
+  int offset = 0;
+
   assert(get_type_state(get_entity_type(ent)) == layout_fixed);
 
-  compound_graph_path *path = get_compound_ent_value_path(ent, pos);
-  int i, path_len = get_compound_graph_path_length(path);
-  int offset = 0;
+  path = get_compound_ent_value_path(ent, pos);
+  path_len = get_compound_graph_path_length(path);
 
   for (i = 0; i < path_len; ++i) {
     entity *node = get_compound_graph_path_node(path, i);
     type *node_tp = get_entity_type(node);
     type *owner_tp = get_entity_owner(node);
     if (is_array_type(owner_tp)) {
-      int size  = get_mode_size_bits (get_type_mode(node_tp));
-      int align = get_mode_align_bits(get_type_mode(node_tp));
+      int size  = get_type_size_bits(node_tp);
+      int align = get_type_alignment_bits(node_tp);
       if (size < align)
-    size = align;
+        size = align;
       else {
-    assert(size % align == 0);
-    /* ansonsten aufrunden */
+        assert(size % align == 0);
+        /* ansonsten aufrunden */
       }
       offset += size * get_compound_graph_path_array_index(path, i);
     } else {
@@ -836,12 +896,13 @@ void compute_compound_ent_array_indicees(entity *ent) {
   n_vals = get_compound_ent_n_values(ent);
   if (n_vals == 0) return;
 
-  /* We can not compute the indicees if there is more than one array
+  /* We can not compute the indexes if there is more than one array
      with an unknown bound.  For this remember the first entity that
      represents such an array. It could be ent. */
   if (is_array_type(tp)) {
-    assert(get_array_n_dimensions(tp) == 1 && "other not implemented");
     int dim = 0;
+
+    assert(get_array_n_dimensions(tp) == 1 && "other not implemented");
     if (!has_array_lower_bound(tp, dim) || !has_array_upper_bound(tp, dim))
      unknown_bound_entity = ent;
   }
@@ -856,19 +917,19 @@ void compute_compound_ent_array_indicees(entity *ent) {
       type *elem_tp = get_entity_type(node);
 
       if (is_array_type(elem_tp)) {
-    assert(get_array_n_dimensions(elem_tp) == 1 && "other not implemented");
-    int dim = 0;
-    if (!has_array_lower_bound(elem_tp, dim) || !has_array_upper_bound(elem_tp, dim)) {
-      if (!unknown_bound_entity) unknown_bound_entity = node;
-      if (node != unknown_bound_entity) return;
-    }
-
-    init_index(elem_tp);
+        int dim = 0;
+        assert(get_array_n_dimensions(elem_tp) == 1 && "other not implemented");
+        if (!has_array_lower_bound(elem_tp, dim) || !has_array_upper_bound(elem_tp, dim)) {
+          if (!unknown_bound_entity) unknown_bound_entity = node;
+          if (node != unknown_bound_entity) return;
+        }
+
+        init_index(elem_tp);
       }
     }
   }
 
-  /* Finally compute the indicees ... */
+  /* Finally compute the indexes ... */
   for (i = 0; i < n_vals; ++i) {
     compound_graph_path *path = get_compound_ent_value_path(ent, i);
     int j, path_len =  get_compound_graph_path_length(path);
@@ -876,15 +937,15 @@ void compute_compound_ent_array_indicees(entity *ent) {
       entity *node = get_compound_graph_path_node(path, j);
       type *owner_tp = get_entity_owner(node);
       if (is_array_type(owner_tp))
-    set_compound_graph_path_array_index (path, j, get_next_index(node));
+        set_compound_graph_path_array_index (path, j, get_next_index(node));
     }
   }
 
 }
 
-
+/* FIXME MMB: the memcpy is very strange */
 static int *resize (int *buf, int new_size) {
-  int *new_buf = (int *)calloc(new_size, 4);
+  int *new_buf = (int *)calloc(new_size, sizeof(*new_buf));
   memcpy(new_buf, buf, new_size>1);
   free(buf);
   return new_buf;
@@ -900,14 +961,22 @@ static int *resize (int *buf, int new_size) {
    A second iteration now permutes the actual elements into two
    new arrays. */
 void sort_compound_ent_values(entity *ent) {
-  assert(get_type_state(get_entity_type(ent)) == layout_fixed);
-
-  type *tp = get_entity_type(ent);
-  int i, n_vals = get_compound_ent_n_values(ent);
-  int tp_size = get_type_size_bits(tp);
+  type *tp;
+  int i, n_vals;
+  int tp_size;
   int size;
   int *permutation;
 
+  int next;
+  ir_node **my_values;
+  compound_graph_path **my_paths;
+
+  assert(get_type_state(get_entity_type(ent)) == layout_fixed);
+
+  tp      = get_entity_type(ent);
+  n_vals  = get_compound_ent_n_values(ent);
+  tp_size = get_type_size_bits(tp);
+
   if (!is_compound_type(tp)                           ||
       (ent->variability == variability_uninitialized) ||
       (get_type_state(tp) != layout_fixed)            ||
@@ -915,7 +984,7 @@ void sort_compound_ent_values(entity *ent) {
 
   /* estimated upper bound for size. Better: use flexible array ... */
   size = ((tp_size > (n_vals * 32)) ? tp_size : (n_vals * 32)) * 4;
-  permutation = (int *)calloc(size, 4);
+  permutation = calloc(size, sizeof(*permutation));
   for (i = 0; i < n_vals; ++i) {
     int pos = get_compound_ent_value_offset_bits(ent, i);
     while (pos >= size) {
@@ -929,9 +998,9 @@ void sort_compound_ent_values(entity *ent) {
     //fprintf(stderr, "i: %d, pos: %d \n", i, pos);
   }
 
-  int next = 0;
-  ir_node **my_values = NEW_ARR_F(ir_node *, n_vals);
-  compound_graph_path **my_paths  = NEW_ARR_F(compound_graph_path *, n_vals);
+  next = 0;
+  my_values = NEW_ARR_F(ir_node *, n_vals);
+  my_paths  = NEW_ARR_F(compound_graph_path *, n_vals);
   for (i = 0; i < size; ++i) {
     int pos = permutation[i];
     if (pos) {
@@ -952,12 +1021,12 @@ void sort_compound_ent_values(entity *ent) {
 }
 
 int
-(get_entity_offset_bytes)(entity *ent) {
+(get_entity_offset_bytes)(const entity *ent) {
   return __get_entity_offset_bytes(ent);
 }
 
 int
-(get_entity_offset_bits)(entity *ent) {
+(get_entity_offset_bits)(const entity *ent) {
   return __get_entity_offset_bits(ent);
 }
 
@@ -1071,7 +1140,7 @@ void    remove_entity_overwrittenby(entity *ent, entity *overwrites) {
 
 /* A link to store intermediate information */
 void *
-(get_entity_link)(entity *ent) {
+(get_entity_link)(const entity *ent) {
   return __get_entity_link(ent);
 }
 
@@ -1081,7 +1150,7 @@ void
 }
 
 ir_graph *
-(get_entity_irg)(entity *ent) {
+(get_entity_irg)(const entity *ent) {
   return __get_entity_irg(ent);
 }
 
@@ -1090,16 +1159,19 @@ set_entity_irg(entity *ent, ir_graph *irg) {
   assert(ent && is_method_type(get_entity_type(ent)));
   /* Wie kann man die Referenz auf einen IRG löschen, z.B. wenn die
    * Methode selbst nicht mehr aufgerufen werden kann, die Entität
-   * aber erhalten bleiben soll. */
+   * aber erhalten bleiben soll?  Wandle die Entitaet in description oder
+   * inherited um! */
   /* assert(irg); */
   assert((irg  && ent->peculiarity == peculiarity_existent) ||
+        (!irg && (ent->peculiarity == peculiarity_existent)
+         && (ent -> visibility == visibility_external_allocated)) ||
          (!irg && ent->peculiarity == peculiarity_description) ||
          (!irg && ent->peculiarity == peculiarity_inherited));
   ent->irg = irg;
 }
 
 int
-(is_entity)(void *thing) {
+(is_entity)(const void *thing) {
   return __is_entity(thing);
 }
 
@@ -1176,6 +1248,7 @@ entity *resolve_ent_polymorphy(type *dynamic_class, entity* static_ent) {
   assert(static_ent && static_ent->kind == k_entity);
 
   res = resolve_ent_polymorphy2(dynamic_class, static_ent);
+#if DEBUG_libfirm
   if (!res) {
     printf(" Could not find entity "); DDME(static_ent);
     printf("  in "); DDMT(dynamic_class);
@@ -1184,115 +1257,7 @@ entity *resolve_ent_polymorphy(type *dynamic_class, entity* static_ent) {
     dump_type(get_entity_owner(static_ent));
     dump_type(dynamic_class);
   }
+#endif
   assert(res);
   return res;
 }
-
-
-
-/*******************************************************************/
-/** Debug aides                                                   **/
-/*******************************************************************/
-
-
-#if 1 || DEBUG_libfirm
-int dump_node_opcode(FILE *F, ir_node *n); /* from irdump.c */
-
-#define X(a)    case a: printf(#a); break
-void dump_entity (entity *ent) {
-  int i, j;
-  type *owner = get_entity_owner(ent);
-  type *type  = get_entity_type(ent);
-  assert(ent && ent->kind == k_entity);
-  printf("entity %s (%ld)\n", get_entity_name(ent), get_entity_nr(ent));
-  printf("  type:  %s (%ld)\n", get_type_name(type),  get_type_nr(type));
-  printf("  owner: %s (%ld)\n", get_type_name(owner), get_type_nr(owner));
-
-  if (get_entity_n_overwrites(ent) > 0) {
-    printf("  overwrites:\n");
-    for (i = 0; i < get_entity_n_overwrites(ent); ++i) {
-      entity *ov = get_entity_overwrites(ent, i);
-      printf("    %d: %s of class %s\n", i, get_entity_name(ov), get_type_name(get_entity_owner(ov)));
-    }
-  } else {
-    printf("  Does not overwrite other entities. \n");
-  }
-  if (get_entity_n_overwrittenby(ent) > 0) {
-    printf("  overwritten by:\n");
-    for (i = 0; i < get_entity_n_overwrittenby(ent); ++i) {
-      entity *ov = get_entity_overwrittenby(ent, i);
-      printf("    %d: %s of class %s\n", i, get_entity_name(ov), get_type_name(get_entity_owner(ov)));
-    }
-  } else {
-    printf("  Is not overwriten by other entities. \n");
-  }
-
-  printf("  allocation:  ");
-  switch (get_entity_allocation(ent)) {
-    X(allocation_dynamic);
-    X(allocation_automatic);
-    X(allocation_static);
-    X(allocation_parameter);
-  }
-
-  printf("\n  visibility:  ");
-  switch (get_entity_visibility(ent)) {
-    X(visibility_local);
-    X(visibility_external_visible);
-    X(visibility_external_allocated);
-  }
-
-  printf("\n  variability: ");
-  switch (get_entity_variability(ent)) {
-    X(variability_uninitialized);
-    X(variability_initialized);
-    X(variability_part_constant);
-    X(variability_constant);
-  }
-
-  if (get_entity_variability(ent) != variability_uninitialized) {
-    if (is_atomic_entity(ent)) {
-      printf("\n  atomic value: ");
-      dump_node_opcode(stdout, get_atomic_ent_value(ent));
-    } else {
-      printf("\n  compound values:");
-      for (i = 0; i < get_compound_ent_n_values(ent); ++i) {
-    compound_graph_path *path = get_compound_ent_value_path(ent, i);
-    entity *ent0 = get_compound_graph_path_node(path, 0);
-    printf("\n    %3d ", get_entity_offset_bits(ent0));
-    if (get_type_state(type) == layout_fixed)
-      printf("(%3d) ",   get_compound_ent_value_offset_bits(ent, i));
-    printf("%s", get_entity_name(ent0));
-    for (j = 0; j < get_compound_graph_path_length(path); ++j) {
-      entity *node = get_compound_graph_path_node(path, j);
-      printf(".%s", get_entity_name(node));
-      if (is_array_type(get_entity_owner(node)))
-        printf("[%d]", get_compound_graph_path_array_index(path, j));
-    }
-    printf("\t = ");
-    dump_node_opcode(stdout, get_compound_ent_value(ent, i));
-      }
-    }
-  }
-
-  printf("\n  volatility:  ");
-  switch (get_entity_volatility(ent)) {
-    X(volatility_non_volatile);
-    X(volatility_is_volatile);
-  }
-
-  printf("\n  peculiarity: %s", get_peculiarity_string(get_entity_peculiarity(ent)));
-  printf("\n  ld_name: %s", ent->ld_name ? get_entity_ld_name(ent) : "no yet set");
-  printf("\n  offset:  %d", get_entity_offset_bits(ent));
-  if (is_method_type(get_entity_type(ent))) {
-    if (get_entity_irg(ent))   /* can be null */
-      { printf("\n  irg = %ld", get_irg_graph_nr(get_entity_irg(ent))); }
-    else
-      { printf("\n  irg = NULL"); }
-  }
-  printf("\n\n");
-}
-#undef X
-#else  /* DEBUG_libfirm */
-void dump_entity (entity *ent) {}
-#endif /* DEBUG_libfirm */