new SymConst semantics
authorBeyhan <beyhan@ipd.info.uni-karlsruhe.de>
Tue, 6 Jul 2004 12:30:50 +0000 (12:30 +0000)
committerBeyhan <beyhan@ipd.info.uni-karlsruhe.de>
Tue, 6 Jul 2004 12:30:50 +0000 (12:30 +0000)
[r3313]

16 files changed:
ir/ana/cgana.c
ir/ana/rta.c
ir/common/firm.h
ir/ir/ircons.c
ir/ir/ircons.h
ir/ir/irdump.c
ir/ir/irgopt.h
ir/ir/irgraph.h
ir/ir/irnode.c
ir/ir/irnode.h
ir/ir/irnode_t.h
ir/ir/iropt.c
ir/tr/entity.c
ir/tr/typewalk.c
ir/tv/tv.c
ir/tv/tv.h

index 2df8c88..5af9fce 100644 (file)
@@ -85,6 +85,9 @@ static entity *get_inherited_methods_implementation(entity *inh_meth) {
 
   if (get_irn_op(addr) == op_Const) {
     impl_meth = tarval_to_entity(get_Const_tarval(addr));
+  } else if ((get_irn_op(addr) == op_SymConst) &&
+            (get_SymConst_kind(addr) == symconst_addr_ent)) {
+    impl_meth = get_SymConst_entity(addr);
   } else {
     assert(0 && "Complex constant values not supported -- address of method should be straight constant!");
   }
@@ -222,19 +225,20 @@ static void sel_methods_walker(ir_node * node, pmap * ldname_map) {
   if (get_irn_op(node) == op_SymConst) {
     /* Wenn möglich SymConst-Operation durch Const-Operation
      * ersetzen. */
-    if (get_SymConst_kind(node) == linkage_ptr_info) {
-      pmap_entry *entry = pmap_find(ldname_map, (void *) get_SymConst_ptrinfo(node));
+    if (get_SymConst_kind(node) == symconst_addr_name) {
+      pmap_entry * entry = pmap_find(ldname_map, (void *) get_SymConst_name(node));
       if (entry != NULL) { /* Method is declared in the compiled code */
-        entity *ent = entry->value;
-        if (get_opt_normalize() && (get_entity_visibility(ent) != visibility_external_allocated)) {
-         /* Meth. is defined */
-          ir_node *new_node;
-          assert(get_entity_irg(ent));
-          set_irg_current_block(current_ir_graph, get_nodes_Block(node));
-          new_node = new_d_Const(get_irn_dbg_info(node),
-                                 mode_P_mach, new_tarval_from_entity(ent, mode_P_mach));       DBG_OPT_NORMALIZE;
-          exchange(node, new_node);
-        }
+       entity * ent = entry->value;
+       if (get_opt_normalize() && (get_entity_visibility(ent) != visibility_external_allocated)) { /* Meth. is defined */
+         ir_node *new_node;
+         symconst_symbol sym;
+         assert(get_entity_irg(ent));
+         sym.entity_p = ent;
+         set_irg_current_block(current_ir_graph, get_nodes_Block(node));
+         new_node = new_d_SymConst(get_irn_dbg_info(node), sym, symconst_addr_ent);       DBG_OPT_NORMALIZE;
+         DDMN(new_node);
+         exchange(node, new_node);
+       }
       }
     }
   } else if (get_irn_op(node) == op_Sel &&
@@ -454,8 +458,20 @@ static void callee_ana_node(ir_node * node, eset * methods) {
 
   switch (get_irn_opcode(node)) {
   case iro_SymConst:
-    /* externe Methode (wegen fix_symconst!) */
-    eset_insert(methods, MARK); /* free method -> unknown */
+    if (get_SymConst_kind(node) == symconst_addr_ent) {
+      entity * ent = get_SymConst_entity(node);
+      assert(ent && is_method_type(get_entity_type(ent)));
+      if (get_entity_visibility(ent) != visibility_external_allocated) {
+       assert(get_entity_irg(ent));
+       eset_insert(methods, ent);
+      } else {
+       eset_insert(methods, MARK); /* free method -> unknown */
+      }
+    } else {
+      assert(get_SymConst_kind(node) == symconst_addr_name);
+      /* externe Methode (wegen fix_symconst!) */
+      eset_insert(methods, MARK); /* free method -> unknown */
+    }
     break;
 
   case iro_Const: {
@@ -641,7 +657,15 @@ static void free_mark(ir_node * node, eset * set) {
     break;
   }
   case iro_SymConst:
-    /* nothing: SymConst points to extern method */
+    if (get_SymConst_kind(node) == symconst_addr_ent) {
+      entity * ent = get_SymConst_entity(node);
+      if (is_method_type(get_entity_type(ent))) {
+        eset_insert(set, ent);
+      }
+    } else {
+      assert(get_SymConst_kind(node) == symconst_addr_name);
+      /* nothing: SymConst points to extern method */
+    }
     break;
   case iro_Const: {
     tarval * val = get_Const_tarval(node);
@@ -696,7 +720,7 @@ static void free_ana_walker(ir_node * node, eset * set) {
     for (i = get_Call_arity(node) - 1; i >= 0; --i) {
       ir_node * pred = get_Call_param(node, i);
       if (mode_is_reference(get_irn_mode(pred))) {
-    free_mark(pred, set);
+       free_mark(pred, set);
       }
     }
     break;
index b1f79e6..b521c78 100644 (file)
@@ -166,9 +166,23 @@ static void rta_act (ir_node *node, void *env)
         /* it's an externally allocated thing. */
       }
     } else if (iro_SymConst == get_irn_opcode (ptr)) { /* CALL SYMCONST */
+      if (get_SymConst_kind(ptr) == symconst_addr_ent) {
+       ent = get_SymConst_entity (ptr);
+       ir_graph *graph = get_entity_irg (ent);
+       /* don't use get_implementing_graph on a Const! */
+       if (graph) {
+         *change = add_graph (graph);
+       } else {
+         /* it's an externally allocated thing. */
+       }
+      } else if (get_SymConst_kind(ptr) == symconst_addr_name) {
       /* If this SymConst refers to a method the method is external_visible
          and therefore must be considered live anyways. */
       /* assert (ent && "couldn't determine entity of call to symConst"); */
+      } else {
+       /* other symconst. */
+      }
+
     }
   } else if (iro_Alloc == op) { /* ALLOC */
     type *type = get_Alloc_type (node);
@@ -298,8 +312,7 @@ static void force_description (entity *ent, entity *addr)
 
     if (peculiarity_inherited == get_entity_peculiarity (over)) {
       /* We rely on the fact that cse is performed on the const_code_irg. */
-      entity *my_addr =
-        tarval_to_entity(get_Const_tarval(get_atomic_ent_value(over)));
+      entity *my_addr = get_SymConst_entity(get_atomic_ent_value(over));
 
       if (addr == my_addr) {
         force_description (over, addr);
@@ -307,9 +320,9 @@ static void force_description (entity *ent, entity *addr)
     } else if (peculiarity_existent == get_entity_peculiarity (over)) {
       /* check whether 'over' forces 'inheritance' of *our* graph: */
       ir_node *f_addr = get_atomic_ent_value (over);
-      entity *impl_ent = tarval_to_entity (get_Const_tarval (f_addr));
+      entity *impl_ent = get_SymConst_entity (f_addr);
 
-      assert ((get_irn_op(f_addr) == op_Const) && "can't do complex addrs");
+      assert ((get_irn_op(f_addr) == op_SymConst) && "can't do complex addrs");
       if (impl_ent == addr) {
         assert (0 && "gibt's denn sowas");
         force_description (over, addr);
@@ -531,6 +544,9 @@ void rta_report (void)
 
 /*
  * $Log$
+ * Revision 1.19  2004/07/06 12:30:37  beyhan
+ * new SymConst semantics
+ *
  * Revision 1.18  2004/06/27 21:17:41  liekweg
  * Added comment
  *
index a911e9d..f6e2ed2 100644 (file)
@@ -107,9 +107,15 @@ extern "C" {
 /**
  * Initialize the firm library.
  *
- * @param func    This function is called, whenever a local variable is used before definition
+ * Initializes the firm library.  Allocates default data structures.
+ * Initializes configurable behaviour of the library.
  *
- * The parameter func may be NULL. In that case, the old FIRM behavior is conserved.
+ * @param func    This function is called, whenever a local variable is
+ * used before definition.  The function should either insert a default value,
+ * or raise a compiler error.
+ *
+ * The parameter func may be NULL. In that case, the original FIRM behavior
+ * is conserved.
  *
  * @see default_initialize_local_variable_func_t
  */
index d479d42..ab9c65d 100644 (file)
@@ -679,26 +679,31 @@ new_rd_InstOf (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
 }
 
 INLINE ir_node *
-new_rd_SymConst (dbg_info* db, ir_graph *irg, ir_node *block, type_or_id_p value,
-                symconst_kind symkind)
+new_rd_SymConst (dbg_info* db, ir_graph *irg, ir_node *block, symconst_symbol value,
+                symconst_kind symkind)
 {
   ir_node *res;
   ir_mode *mode;
-  if (symkind == linkage_ptr_info)
+  if ((symkind == symconst_addr_name) || (symkind == symconst_addr_ent))
     mode = mode_P_mach;
   else
     mode = mode_Iu;
   res = new_ir_node (db, irg, block, op_SymConst, mode, 0, NULL);
 
   res->attr.i.num = symkind;
-  if (symkind == linkage_ptr_info) {
-    res->attr.i.tori.ptrinfo = (ident *)value;
+  res->attr.i.sym = value;
+  /*
+  if (symkind == symconst_addr_name) {
+    res->attr.i.sym.ident_p = (ident *)value;
+  } else if (symkind == symconst_addr_ent) {
+    res->attr.i.sym.entity = (entity *)value;
   } else {
-    assert (   (   (symkind == type_tag)
-            || (symkind == size))
+    assert (   (   (symkind ==symconst_type_tag)
+            || (symkind == symconst_size))
             && (is_type(value)));
-    res->attr.i.tori.typ = (type *)value;
+    res->attr.i.sym.typ = (type *)value;
   }
+  */
   res = optimize_node (res);
   irn_vrfy_irg (res, irg);
   return res;
@@ -867,7 +872,7 @@ INLINE ir_node *new_r_Const  (ir_graph *irg, ir_node *block,
   return new_rd_Const(NULL, irg, block, mode, con);
 }
 INLINE ir_node *new_r_SymConst (ir_graph *irg, ir_node *block,
-                       type_or_id_p value, symconst_kind symkind) {
+                       symconst_symbol value, symconst_kind symkind) {
   return new_rd_SymConst(NULL, irg, block, value, symkind);
 }
 INLINE ir_node *new_r_Sel    (ir_graph *irg, ir_node *block, ir_node *store,
@@ -2238,7 +2243,7 @@ new_d_InstOf (dbg_info *db, ir_node *store, ir_node *objptr, type *ent)
 }
 
 ir_node *
-new_d_SymConst (dbg_info* db, type_or_id_p value, symconst_kind kind)
+new_d_SymConst (dbg_info* db, symconst_symbol value, symconst_kind kind)
 {
   return new_rd_SymConst (db, current_ir_graph, current_ir_graph->start_block,
                          value, kind);
@@ -2485,7 +2490,7 @@ ir_node *new_Raise  (ir_node *store, ir_node *obj) {
 ir_node *new_Const  (ir_mode *mode, tarval *con) {
   return new_d_Const(NULL, mode, con);
 }
-ir_node *new_SymConst (type_or_id_p value, symconst_kind kind) {
+ir_node *new_SymConst (symconst_symbol value, symconst_kind kind) {
   return new_d_SymConst(NULL, value, kind);
 }
 ir_node *new_simpleSel(ir_node *store, ir_node *objptr, entity *ent) {
index c292b7e..56cb597 100644 (file)
  *    ir_node *new_Return   (ir_node *store, int arity, ir_node **in);
  *    ir_node *new_Raise    (ir_node *store, ir_node *obj);
  *    ir_node *new_Const    (ir_mode *mode, tarval *con);
- *    ir_node *new_SymConst (type_or_id_p value, symconst_kind kind);
+ *    ir_node *new_SymConst (symconst_symbol value, symconst_kind kind);
  *    ir_node *new_simpleSel (ir_node *store, ir_node *objptr, entity *ent);
  *    ir_node *new_Sel    (ir_node *store, ir_node *objptr, int arity,
  *                         ir_node **in, entity *ent);
 /** Constructor for a Block node.
  *
  * Constructs a mature block with the given predecessors.  Use Unknown
- * nodes as predecessors to constuct a block if the number of
+ * nodes as predecessors to construct a block if the number of
  * predecessors is known, but not the predecessors themselves.  This
  * constructor does not set current_block.  It not be used with
  * automatic Phi node construction.
@@ -1249,7 +1249,7 @@ ir_node *new_rd_Return (dbg_info *db, ir_graph *irg, ir_node *block,
 ir_node *new_rd_Raise  (dbg_info *db, ir_graph *irg, ir_node *block,
                        ir_node *store, ir_node *obj);
 
-/** Constructor for a Const node.
+/** Constructor for a Const_type node.
  *
  * The constant represents a target value.  This constructor sets high
  * level type information for the constant value.
@@ -1307,7 +1307,7 @@ ir_node *new_rd_Const  (dbg_info *db, ir_graph *irg, ir_node *block,
  * @param value   A type, entity or a ident depending on the SymConst kind.
  */
 ir_node *new_rd_SymConst (dbg_info *db, ir_graph *irg, ir_node *block,
-                         type_or_id_p value, symconst_kind symkind);
+                         symconst_symbol value, symconst_kind symkind);
 
 /** Constructor for a Sel node.
  *
@@ -1372,7 +1372,7 @@ ir_node *new_rd_Call   (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *st
  * @param *callee A pointer to the called procedure.
  * @param arity   The number of procedure parameters.
  * @param *in[]   An array with the pointers to the parameters. The constructor
- *                copies this array. The constructor copies this array.
+ *                copies this array.
  * @param *tp     Type information of the procedure called.
  */
 ir_node *new_rd_FuncCall (dbg_info *db, ir_graph *irg, ir_node *block,
@@ -1622,7 +1622,7 @@ ir_node *new_rd_Cast   (dbg_info* db, ir_graph *irg, ir_node *block,
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
  * @param arity  The number of predecessors
- * @param *in[]    Array with predecessors.  The constructor copies this array.
+ * @param *in[]  Array with predecessors.  The constructor copies this array.
  * @param *mode  The mode of it's inputs and output.
  */
 ir_node *new_rd_Phi    (dbg_info *db, ir_graph *irg, ir_node *block, int arity,
@@ -1849,6 +1849,13 @@ ir_node *new_rd_Filter (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *ar
 /*-------------------------------------------------------------------------*/
 
 /** Constructor for a Block node.
+ *
+ * Constructs a mature block with the given predecessors.  Use Unknown
+ * nodes as predecessors to construct a block if the number of
+ * predecessors is known, but not the predecessors themselves.  This
+ * constructor does not set current_block.  It not be used with
+ * automatic Phi node construction.
+ *
  *
  * @param irg    The ir graph the block belongs to.
  * @param arity  The number of control predecessors.
@@ -1872,6 +1879,8 @@ ir_node *new_r_Start  (ir_graph *irg, ir_node *block);
 ir_node *new_r_End    (ir_graph *irg, ir_node *block);
 
 /** Constructor for a Jmp node.
+ *
+ * Jmp represents control flow to a single control successor.
  *
  * @param *irg    The ir graph the node belongs to.
  * @param *block  The ir block the node belongs to.
@@ -1879,6 +1888,13 @@ ir_node *new_r_End    (ir_graph *irg, ir_node *block);
 ir_node *new_r_Jmp    (ir_graph *irg, ir_node *block);
 
 /** Constructor for a Cond node.
+ *
+ * If c is mode_b represents a conditional branch (if/else). If c is
+ * mode_Is/mode_Iu (?) represents a switch.  (Allocates dense Cond
+ * node, default Proj is 0.)
+ *
+ * This is not consistent:  Input to Cond is Is, Proj has as proj number
+ * longs.
  *
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
@@ -1887,6 +1903,9 @@ ir_node *new_r_Jmp    (ir_graph *irg, ir_node *block);
 ir_node *new_r_Cond   (ir_graph *irg, ir_node *block, ir_node *c);
 
 /** Constructor for a Return node.
+ *
+ * Returns the memory an zero or more return values.  Only node that
+ * can end regular control flow.
  *
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
@@ -1908,6 +1927,10 @@ ir_node *new_r_Raise  (ir_graph *irg, ir_node *block,
                ir_node *store, ir_node *obj);
 
 /** Constructor for a Const node.
+ *
+ * Constructor for a Const node. The constant represents a target
+ * value.  Sets the type information to type_unknown.  (No more
+ * supported: If tv is entity derives a somehow useful type.)
  *
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
@@ -1918,23 +1941,51 @@ ir_node *new_r_Const  (ir_graph *irg, ir_node *block,
                ir_mode *mode, tarval *con);
 
 /** Constructor for a SymConst node.
+ *
+ *  This is the constructor for a symbolic constant.
+ *    There are four kinds of symbolic constants:
+ *    - type_tag  The symbolic constant represents a type tag.  The type the
+ *                tag stands for is given explicitly.
+ *    - size      The symbolic constant represents the size of a type.  The
+ *                type of which the constant represents the size is given
+ *                explicitly.
+ *    - addr_name The symbolic constant represents the address of an entity
+ *                (variable or method).  The variable is indicated by a name
+ *                that is valid for linking.
+ *    - addr_ent   The symbolic constant represents the address of an entity
+ *                (variable or method).  The variable is given explicitly by
+ *                a firm entity.
+ *
+ *    Inputs to the node:
+ *      No inputs except the block it belongs to.
+ *    Outputs of the node.
+ *      An unsigned integer (I_u) or a pointer (P).
  *
  * @param *irg    The ir graph the node  belongs to.
  * @param *block  The ir block the node belongs to.
- * @param volue
+ * @param volue   A type, entity or a ident depending on the SymConst kind.
  * @param symkind The kind of the symbolic constant: type_tag, size or link_info.
  */
 ir_node *new_r_SymConst (ir_graph *irg, ir_node *block,
-                       type_or_id_p value, symconst_kind symkind);
+                       symconst_symbol value, symconst_kind symkind);
 
 /** Constructor for a Sel node.
+ *
+ * The select node selects an entity (field or method) from an entity
+ * with a compound type.  It explicitly specifies the entity selected.
+ * Dynamically the node may select entities that overwrite the given
+ * entity.  If the selected entity is an array element entity the Sel
+ * node takes the required array indicees as inputs.
  *
  * @param   *irg       The ir graph the node  belongs to.
  * @param   *block     The ir block the node belongs to.
- * @param   *store     The memory in which the object the entity should be selected from is allocated.
- * @param   *objptr    The object from that the Sel operation selects a single attribute out.
- * @param   *n_index   The  index of the selected object from the array.
- * @param   *index[]     Array with index inputs to the node. The constructor copies this array.
+ * @param   *store     The memory in which the object the entity should be selected
+ *                     from is allocated.
+ * @param   *objptr    A pointer to a compound entity the Sel operation selects a
+ *                     single attribute from.
+ * @param   *n_index   The number of array indicees needed to select an array element entity.
+ * @param   *index[]   If the compound entity is an array the indicees of the selected
+ *                     element entity.  The constructor copies this array.
  * @param   *ent       The entity to select.
  */
 ir_node *new_r_Sel    (ir_graph *irg, ir_node *block, ir_node *store,
@@ -1942,6 +1993,8 @@ ir_node *new_r_Sel    (ir_graph *irg, ir_node *block, ir_node *store,
                entity *ent);
 
 /** Constructor for a InstOf node.
+ *
+ * For translating Java.  Not supported as standard firm node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -1952,8 +2005,9 @@ ir_node *new_r_Sel    (ir_graph *irg, ir_node *block, ir_node *store,
  */
 ir_node *new_r_InstOf (ir_graph *irg, ir_node *block, ir_node *x, ir_node *y, type *z);
 
-/**
- * Constructor for a Call node.
+/** Constructor for a Call node.
+ *
+ *  Represents all kinds of method and function calls.
  *
  * @param   *irg    The ir graph the node  belongs to.
  * @param   *block  The ir block the node belongs to.
@@ -1968,8 +2022,7 @@ ir_node *new_r_Call   (ir_graph *irg, ir_node *block, ir_node *store,
                ir_node *callee, int arity, ir_node *in[],
                type *tp);
 
-/**
- * Constructor for a Add node.
+/** Constructor for a Add node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -1994,8 +2047,7 @@ ir_node *new_r_Add    (ir_graph *irg, ir_node *block,
 ir_node *new_r_Sub    (ir_graph *irg, ir_node *block,
                ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Minus node.
+/** Constructor for a Minus node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2005,8 +2057,7 @@ ir_node *new_r_Sub    (ir_graph *irg, ir_node *block,
  */
 ir_node *new_r_Minus  (ir_graph *irg, ir_node *block,
                ir_node *op,  ir_mode *mode);
-/**
- * Constructor for a Mul node.
+/** Constructor for a Mul node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2018,8 +2069,7 @@ ir_node *new_r_Minus  (ir_graph *irg, ir_node *block,
 ir_node *new_r_Mul    (ir_graph *irg, ir_node *block,
                ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Quot node.
+/** Constructor for a Quot node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2031,8 +2081,7 @@ ir_node *new_r_Mul    (ir_graph *irg, ir_node *block,
 ir_node *new_r_Quot   (ir_graph *irg, ir_node *block,
                ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a DivMod node.
+/** Constructor for a DivMod node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2044,8 +2093,7 @@ ir_node *new_r_Quot   (ir_graph *irg, ir_node *block,
 ir_node *new_r_DivMod (ir_graph *irg, ir_node *block,
                ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Div node.
+/** Constructor for a Div node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2057,8 +2105,7 @@ ir_node *new_r_DivMod (ir_graph *irg, ir_node *block,
 ir_node *new_r_Div    (ir_graph *irg, ir_node *block,
                ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Mod node.
+/** Constructor for a Mod node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2070,8 +2117,7 @@ ir_node *new_r_Div    (ir_graph *irg, ir_node *block,
 ir_node *new_r_Mod    (ir_graph *irg, ir_node *block,
                ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Abs node.
+/** Constructor for a Abs node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2082,8 +2128,7 @@ ir_node *new_r_Mod    (ir_graph *irg, ir_node *block,
 ir_node *new_r_Abs    (ir_graph *irg, ir_node *block,
                        ir_node *op, ir_mode *mode);
 
-/**
- * Constructor for a And node.
+/** Constructor for a And node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2095,8 +2140,7 @@ ir_node *new_r_Abs    (ir_graph *irg, ir_node *block,
 ir_node *new_r_And    (ir_graph *irg, ir_node *block,
                ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Or node.
+/** Constructor for a Or node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2108,8 +2152,7 @@ ir_node *new_r_And    (ir_graph *irg, ir_node *block,
 ir_node *new_r_Or     (ir_graph *irg, ir_node *block,
                ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Eor node.
+/** Constructor for a Eor node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2121,8 +2164,7 @@ ir_node *new_r_Or     (ir_graph *irg, ir_node *block,
 ir_node *new_r_Eor    (ir_graph *irg, ir_node *block,
                ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Not node.
+/** Constructor for a Not node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2133,8 +2175,7 @@ ir_node *new_r_Eor    (ir_graph *irg, ir_node *block,
 ir_node *new_r_Not    (ir_graph *irg, ir_node *block,
                ir_node *op, ir_mode *mode);
 
-/**
- * Constructor for a Cmp node.
+/** Constructor for a Cmp node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2145,8 +2186,7 @@ ir_node *new_r_Not    (ir_graph *irg, ir_node *block,
 ir_node *new_r_Cmp    (ir_graph *irg, ir_node *block,
                ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Shl node.
+/** Constructor for a Shl node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2158,8 +2198,7 @@ ir_node *new_r_Cmp    (ir_graph *irg, ir_node *block,
 ir_node *new_r_Shl    (ir_graph *irg, ir_node *block,
                ir_node *op, ir_node *k, ir_mode *mode);
 
-/**
- * Constructor for a Shr node.
+/** Constructor for a Shr node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2184,8 +2223,7 @@ ir_node *new_r_Shr    (ir_graph *irg, ir_node *block,
 ir_node *new_r_Shrs   (ir_graph *irg, ir_node *block,
                ir_node *op, ir_node *k, ir_mode *mode);
 
-/**
- * Constructor for a Rot node.
+/** Constructor for a Rot node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2197,8 +2235,7 @@ ir_node *new_r_Shrs   (ir_graph *irg, ir_node *block,
 ir_node *new_r_Rot    (ir_graph *irg, ir_node *block,
                ir_node *op, ir_node *k, ir_mode *mode);
 
-/**
- * Constructor for a Conv node.
+/** Constructor for a Conv node.
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2209,8 +2246,9 @@ ir_node *new_r_Rot    (ir_graph *irg, ir_node *block,
 ir_node *new_r_Conv   (ir_graph *irg, ir_node *block,
                ir_node *op, ir_mode *mode);
 
-/**
- * Constructor for a Cast node.
+/** Constructor for a Cast node.
+ *
+ * High level type cast
  *
  * @param   *irg   The ir graph the node  belongs to.
  * @param   *block The ir block the node belongs to.
@@ -2218,12 +2256,10 @@ ir_node *new_r_Conv   (ir_graph *irg, ir_node *block,
  * @param   *to_tp The type of this the operand muss be casted .
  *
  */
-
 ir_node *new_r_Cast   (ir_graph *irg, ir_node *block,
                ir_node *op, type *to_tp);
 
-/**
- * Constructor for a Phi node.
+/** Constructor for a Phi node.
  *
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
@@ -2235,8 +2271,7 @@ ir_node *new_r_Cast   (ir_graph *irg, ir_node *block,
 ir_node *new_r_Phi    (ir_graph *irg, ir_node *block, int arity,
                       ir_node *in[], ir_mode *mode);
 
-/**
- * Constructor for a Load node.
+/** Constructor for a Load node.
  *
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
@@ -2246,8 +2281,7 @@ ir_node *new_r_Phi    (ir_graph *irg, ir_node *block, int arity,
  */
 ir_node *new_r_Load   (ir_graph *irg, ir_node *block,
                ir_node *store, ir_node *adr);
-/**
- * Constructor for a Store node.
+/** Constructor for a Store node.
  *
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
@@ -2258,8 +2292,9 @@ ir_node *new_r_Load   (ir_graph *irg, ir_node *block,
 
 ir_node *new_r_Store  (ir_graph *irg, ir_node *block,
                ir_node *store, ir_node *adr, ir_node *val);
-/**
- * Constructor for a Alloc node.
+/** Constructor for a Alloc node.
+ *
+ * The Alloc node extends the memory by space for an entity of type alloc_type.
  *
  * @param *irg        The ir graph the node  belongs to.
  * @param *block      The ir block the node belongs to.
@@ -2272,8 +2307,11 @@ ir_node *new_r_Store  (ir_graph *irg, ir_node *block,
 
 ir_node *new_r_Alloc  (ir_graph *irg, ir_node *block, ir_node *store,
                ir_node *size, type *alloc_type, where_alloc where);
-/**
- * Constructor for a Free node.
+
+/** Constructor for a Free node.
+ *
+ * Frees the memory occupied by the entity pointed to by the pointer
+ * arg.  Type indicates the type of the entity the argument points to.
  *
  * @param *irg        The ir graph the node  belongs to.
  * @param *block      The ir block the node belongs to.
@@ -2283,23 +2321,28 @@ ir_node *new_r_Alloc  (ir_graph *irg, ir_node *block, ir_node *store,
  * @param *free_type  The type of the freed variable.
  *
  */
-
 ir_node *new_r_Free   (ir_graph *irg, ir_node *block, ir_node *store,
                ir_node *ptr, ir_node *size, type *free_type);
 
-/**
- * Constructor for a  Sync node.
+/** Constructor for a  Sync node.
+ *
+ * Merges several memory values.  The node assumes that a variable
+ * either occurs only in one of the memories, or it contains the same
+ * value in all memories where it occurs.
  *
  * @param *irg      The ir graph the node  belongs to.
  * @param *block    The ir block the node belongs to.
  * @param  arity    The number of memories to syncronize.
- * @param  *in[]     An array of pointers to nodes that produce an output of  type memory. The constructor copies this array.
+ * @param  *in[]    An array of pointers to nodes that produce an output of  type memory.
+ *                  The constructor copies this array.
  *
  */
 ir_node *new_r_Sync   (ir_graph *irg, ir_node *block, int arity, ir_node *in[]);
 
-/**
- * Constructor for a Proj node.
+/** Constructor for a Proj node.
+ *
+ * Projects a single value out of a tuple.  The parameter proj gives the
+ * position of the value within the tuple.
  *
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
@@ -2308,12 +2351,12 @@ ir_node *new_r_Sync   (ir_graph *irg, ir_node *block, int arity, ir_node *in[]);
  * @param proj   The position of the value in the tuple.
  *
  */
-
 ir_node *new_r_Proj   (ir_graph *irg, ir_node *block, ir_node *arg,
                       ir_mode *mode, long proj);
 
-/**
- * Constructor for a defaultProj node.
+/** Constructor for a defaultProj node.
+ *
+ * Represents the default control flow of a Switch-Cond node.
  *
  * @param *irg      The ir graph the node  belongs to.
  * @param *block    The ir block the node belongs to.
@@ -2324,8 +2367,10 @@ ir_node *new_r_Proj   (ir_graph *irg, ir_node *block, ir_node *arg,
 ir_node *new_r_defaultProj (ir_graph *irg, ir_node *block, ir_node *arg, long max_proj);
 
 
-/**
- * Constructor for a Tuple node.
+/** Constructor for a Tuple node.
+ *
+ * This is an auxiliary node to replace a node that returns a tuple
+ * without changing the corresponding Proj nodes.
  *
  * @param *irg    The ir graph the node  belongs to.
  * @param *block  The ir block the node belongs to.
@@ -2335,8 +2380,10 @@ ir_node *new_r_defaultProj (ir_graph *irg, ir_node *block, ir_node *arg, long ma
  */
 ir_node *new_r_Tuple  (ir_graph *irg, ir_node *block, int arity, ir_node *in[]);
 
-/**
- * Constructor for a Id node.
+/** Constructor for a Id node.
+ *
+ * This is an auxiliary node to replace a node that returns a single
+ * value.
  *
  * @param *irg    The ir graph the node  belongs to.
  * @param *block  The ir block the node belongs to.
@@ -2347,8 +2394,10 @@ ir_node *new_r_Tuple  (ir_graph *irg, ir_node *block, int arity, ir_node *in[]);
 ir_node *new_r_Id     (ir_graph *irg, ir_node *block,
                ir_node *val, ir_mode *mode);
 
-/**
- * Constructor for a Bad node.
+/** Constructor for a Bad node.
+ *
+ * Returns the unique Bad node of the graph.  The same as
+ * get_irg_bad().
  *
  * @param *irg    The ir graph the node  belongs to.
  *
@@ -2356,9 +2405,8 @@ ir_node *new_r_Id     (ir_graph *irg, ir_node *block,
 
 ir_node *new_r_Bad    (ir_graph *irg);
 
-/**
+/** Constructor for a Confirm node.
  *
- * Constructor for a Confirm node.
  * Specifies constraints for a value.  To support dataflow analyses.
  *
  * Example: If the value never exceeds '100' this is expressed by placing a
@@ -2375,9 +2423,9 @@ ir_node *new_r_Bad    (ir_graph *irg);
 ir_node *new_r_Confirm (ir_graph *irg, ir_node *block,
             ir_node *val, ir_node *bound, pn_Cmp cmp);
 
-/**
+/** Constructor for a Unknown node.
  *
- * Constructor for a Unknown node.  Represents an arbtrary valus.  Places the node in
+ * Represents an arbtrary valus.  Places the node in
  * the start block.
  *
  * @param *irg    The ir graph the node  belongs to.
@@ -2385,48 +2433,54 @@ ir_node *new_r_Confirm (ir_graph *irg, ir_node *block,
  */
 ir_node *new_r_Unknown(ir_graph *irg, ir_mode *m);
 
-/**
- * Constructor for a CallBegin node.
+/** Constructor for a CallBegin node.
+ *
+ * CallBegin represents control flow depending of the pointer value
+ * representing the called method to the called methods.  The
+ * constructor copies the method pointer input from the passed Call
+ * node.
  *
  * @param *irg    The ir graph the node belong to.
  * @param *block  The block the node belong to.
  * @param *callee The call node bisible in the  intra procedural view.
  *
  */
-
 ir_node *new_r_CallBegin(ir_graph *irg, ir_node *block, ir_node *callee);
 
-/**
- * Constructor for a EndReg node.
+/** Constructor for a EndReg node.
+ *
+ * Used to represent regular procedure end in interprocedual view.
  *
  * @param *irg    The ir graph the node belong to.
  * @param *block  The block the node belong to.
  *
  */
-
 ir_node *new_r_EndReg (ir_graph *irg, ir_node *block);
 
-/**
- * Constructor for a EndExcept node.
+/** Constructor for a EndExcept node.
+ *
+ * Used to represent exceptional procedure end in interprocedural view.
  *
  * @param *irg    The ir graph the node belong to.
  * @param *block  The block the node belong to.
  *
  */
-
 ir_node *new_r_EndExcept(ir_graph *irg, ir_node *block);
 
-/**
- * Constructor for a Break node.
+/** Constructor for a Break node.
+ *
+ * Break represents control flow to a single control successor just as Jmp.
+ * The blocks separated by a break may not be concatenated by an optimization.
+ * It is used for the interprocedural representation where blocks are parted
+ * behind Call nodes to represent the control flow to called procedures.
  *
  * @param *irg    The ir graph the node belong to.
  * @param *block  The block the node belong to.
  *
  */
-
 ir_node *new_r_Break  (ir_graph *irg, ir_node *block);
 
-/**
+/** Constructor for a Filter node.
  *
  * Constructor for a Filter node. Adds the node to the block in current_ir_block.
  * Filter is a node with two views used to construct the interprocedural view.
@@ -2447,14 +2501,17 @@ ir_node *new_r_Break  (ir_graph *irg, ir_node *block);
 ir_node *new_r_Filter (ir_graph *irg, ir_node *block, ir_node *arg,
                ir_mode *mode, long proj);
 
-/**
- * Constructor for a FuncCall node.
+/** Constructor for a FuncCall node.
+ *
+ *  FuncCall is a function Call that has no side effects.  Therefore there
+ *  is not memory operand or result.
  *
  * @param *irg    The ir graph the node belong to.
  * @param *block  The block the node belong to.
  * @param *callee A pointer to the called procedure.
  * @param arity   The number of procedure parameters.
- * @param *in[]   An array with the pointers to the parameters. The constructor copies this array.
+ * @param *in[]   An array with the pointers to the parameters.
+ *                The constructor copies this array.
  * @param *type   Type information of the procedure called.
  *
  */
@@ -2470,8 +2527,9 @@ ir_node *new_r_FuncCall (ir_graph *irg, ir_node *block,
   nodes they construct. */
 void switch_block (ir_node *target);
 
-/**
- * Constructor for a Block node. Adds the block to the graph in current_ir_graph.
+/** Constructor for a Block node.
+ *
+ * Adds the block to the graph in current_ir_graph.
  *
  * @param *db    A Pointer for  debugginfomation.
  * @param arity  The number of control predecessors.
@@ -2480,24 +2538,29 @@ void switch_block (ir_node *target);
  */
 ir_node *new_d_Block(dbg_info* db, int arity, ir_node *in[]);
 
-/**
- * Constructor for a Start node. Adds the node to the block in current_ir_block.
+/** Constructor for a Start node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db    A pointer for debug information.
  *
  */
 ir_node *new_d_Start  (dbg_info* db);
 
-/**
- * Constructor for a End node. Adds the node to the block in current_ir_block.
+/** Constructor for a End node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db     A pointer for debug information.
  *
  */
 ir_node *new_d_End    (dbg_info* db);
 
-/**
- * Constructor for a Jmp node. Adds the node to the block in current_ir_block.
+/** Constructor for a Jmp node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * Jmp represents control flow to a single control successor.
  *
  * @param *db     A pointer for debug information.
  *
@@ -2505,8 +2568,16 @@ ir_node *new_d_End    (dbg_info* db);
 
 ir_node *new_d_Jmp    (dbg_info* db);
 
-/**
- * Constructor for a Cond node. Adds the node to the block in current_ir_block.
+/** Constructor for a Cond node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * If c is mode_b represents a conditional branch (if/else). If c is
+ * mode_Is/mode_Iu (?) represents a switch.  (Allocates dense Cond
+ * node, default Proj is 0.)
+ *
+ * This is not consistent:  Input to Cond is Is, Proj has as proj number
+ * longs.
  *
  * @param *db    A pointer for debug information.
  * @param *c     The conditions parameter.Can be of mode b or I_u.
@@ -2515,8 +2586,12 @@ ir_node *new_d_Jmp    (dbg_info* db);
 
 ir_node *new_d_Cond   (dbg_info* db, ir_node *c);
 
-/**
- * Constructor for a Return node. Adds the node to the block in current_ir_block.
+/** Constructor for a Return node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * Returns the memory an zero or more return values.  Only node that
+ * can end regular control flow.
  *
  * @param *db    A pointer for debug information.
  * @param *store The state of memory.
@@ -2527,8 +2602,9 @@ ir_node *new_d_Cond   (dbg_info* db, ir_node *c);
 
 ir_node *new_d_Return (dbg_info* db, ir_node *store, int arity, ir_node *in[]);
 
-/**
- * Constructor for a Raise node. Adds the node to the block in current_ir_block.
+/** Constructor for a Raise node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db    A pointer for debug information.
  * @param *store The current memory.
@@ -2538,8 +2614,12 @@ ir_node *new_d_Return (dbg_info* db, ir_node *store, int arity, ir_node *in[]);
 
 ir_node *new_d_Raise  (dbg_info* db, ir_node *store, ir_node *obj);
 
-/**
- * Constructor for a Const_type node. Adds the node to the block in current_ir_block.
+/** Constructor for a Const_type node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * The constant represents a target value.  This constructor sets high
+ * level type information for the constant value.
  *
  * @param *db    A pointer for debug information.
  * @param *mode  The mode of the operands and redults.
@@ -2550,56 +2630,88 @@ ir_node *new_d_Raise  (dbg_info* db, ir_node *store, ir_node *obj);
 
 ir_node *new_d_Const_type (dbg_info* db, ir_mode *mode, tarval *con, type *tp);
 
-/**
- * Constructor for a Const node. Adds the node to the block in current_ir_block.
+/** Constructor for a Const node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * Constructor for a Const node. The constant represents a target
+ * value.  Sets the type information to type_unknown.  (No more
+ * supported: If tv is entity derives a somehow useful type.)
  *
  * @param *db    A pointer for debug information.
  * @param *mode  The mode of the operands and redults.
  * @param *con   Points to an entry in the constant table. This pointer is added to the attributes of  the node (self->attr.con).
  *
  */
-
 ir_node *new_d_Const  (dbg_info* db, ir_mode *mode, tarval *con);
 
-/**
- * Constructor for a SymConst node. Adds the node to the block in current_ir_block.
- *
- * @param *db     A pointer for debug information.
- * @param value   A type, entity or ident depending on the SymConst kind.
- * @param symkind The kind of the symbolic constant: symconst_type_tag, symconst_size or symconst_addr_name.
- *
- */
-ir_node *new_d_SymConst (dbg_info* db, type_or_id_p value, symconst_kind kind);
-
-/**
- * Constructor for a simpleSel node. Adds the node to the block in current_ir_block.
- *
- * @param   *db        A pointer for debug information.
- * @param   *store     The memory in which the object the entity should be selected from is allocated.
- * @param   *objptr    The object from that the Sel operation selects a single attribute out.
- * @param   *ent       The entity to select.
+/** Constructor for a SymConst node.
  *
- */
-
-ir_node *new_d_simpleSel(dbg_info* db, ir_node *store, ir_node *objptr, entity *ent);
+ *  Adds the node to the block in current_ir_block.
+ *  This is the constructor for a symbolic constant.
+ *    There are four kinds of symbolic constants:
+ *    - type_tag  The symbolic constant represents a type tag.  The type the
+ *                tag stands for is given explicitly.
+ *    - size      The symbolic constant represents the size of a type.  The
+ *                type of which the constant represents the size is given
+ *                explicitly.
+ *    - addr_name The symbolic constant represents the address of an entity
+ *                (variable or method).  The variable is indicated by a name
+ *                that is valid for linking.
+ *    - addr_ent   The symbolic constant represents the address of an entity
+ *                (variable or method).  The variable is given explicitly by
+ *                a firm entity.
+ *
+ *    Inputs to the node:
+ *      No inputs except the block it belongs to.
+ *    Outputs of the node.
+ *      An unsigned integer (I_u) or a pointer (P).
+ *
+ * @param *db     A pointer for debug information.
+ * @param value   A type, entity or ident depending on the SymConst kind.
+ * @param symkind The kind of the symbolic constant: symconst_type_tag, symconst_size or symconst_addr_name.
+ *
+ */
+ir_node *new_d_SymConst (dbg_info* db, symconst_symbol value, symconst_kind kind);
 
-/**
- * Constructor for a Sel node. Adds the node to the block in current_ir_block.
+/** Constructor for a simpleSel node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db        A pointer for debug information.
  * @param   *store     The memory in which the object the entity should be selected from is allocated.
  * @param   *objptr    The object from that the Sel operation selects a single attribute out.
- * @param   arity      The  index of the selected object from the array.
- * @param   *in        Array with index inputs to the node.
  * @param   *ent       The entity to select.
  *
  */
+ir_node *new_d_simpleSel(dbg_info* db, ir_node *store, ir_node *objptr, entity *ent);
 
+/** Constructor for a Sel node.
+ *
+ * The select node selects an entity (field or method) from an entity
+ * with a compound type.  It explicitly specifies the entity selected.
+ * Dynamically the node may select entities that overwrite the given
+ * entity.  If the selected entity is an array element entity the Sel
+ * node takes the required array indicees as inputs.
+ *
+ * @param   *db        A pointer for debug information.
+ * @param   *store     The memory in which the object the entity should be selected
+ *                     from is allocated.
+ * @param   *objptr    A pointer to a compound entity the Sel operation selects a
+ *                     single attribute from.
+ * @param   *n_index   The number of array indicees needed to select an array element entity.
+ * @param   *index[]   If the compound entity is an array the indicees of the selected
+ *                     element entity.  The constructor copies this array.
+ * @param   *ent       The entity to select.
+ */
 ir_node *new_d_Sel    (dbg_info* db, ir_node *store, ir_node *objptr, int arity, ir_node *in[],
                      entity *ent);
 
-/**
- * Constructor for a InstOf node. Adds the node to the block in current_ir_block.
+/** Constructor for a InstOf node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * For translating Java.  Not supported as standard firm node.
  *
  * @param   *db    A pointer for debug information.
  * @param   *store
@@ -2607,11 +2719,12 @@ ir_node *new_d_Sel    (dbg_info* db, ir_node *store, ir_node *objptr, int arity,
  * @param   *ent
  *
  */
-
 ir_node *new_d_InstOf (dbg_info* db, ir_node *store, ir_node *objptr, type *ent);
 
-/**
- * Constructor for a Call node. Adds the node to the block in current_ir_block.
+/** Constructor for a Call node.
+ *
+ *  Represents all kinds of method and function calls.
+ *  Adds the node to the block in current_ir_block.
  *
  * @param   *db     A pointer for debug information.
  * @param   *store  The actual store.
@@ -2625,8 +2738,9 @@ ir_node *new_d_InstOf (dbg_info* db, ir_node *store, ir_node *objptr, type *ent)
 ir_node *new_d_Call   (dbg_info* db, ir_node *store, ir_node *callee, int arity, ir_node *in[],
              type *tp);
 
-/**
- * Constructor for a Add node. Adds the node to the block in current_ir_block.
+/** Constructor for a Add node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op1   The operand 1.
@@ -2634,11 +2748,11 @@ ir_node *new_d_Call   (dbg_info* db, ir_node *store, ir_node *callee, int arity,
  * @param   *mode  The mode of the operands and the result.
  *
  */
-
 ir_node *new_d_Add    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Sub node. Adds the node to the block in current_ir_block.
+/** Constructor for a Sub node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op1   The operand 1.
@@ -2649,19 +2763,20 @@ ir_node *new_d_Add    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
 
 ir_node *new_d_Sub    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Minus node. Adds the node to the block in current_ir_block.
+/** Constructor for a Minus node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op    The operand .
  * @param   *mode  The mode of the operand and the result.
  *
  */
-
 ir_node *new_d_Minus  (dbg_info* db, ir_node *op,  ir_mode *mode);
 
-/**
- * Constructor for a Mul node. Adds the node to the block in current_ir_block.
+/** Constructor for a Mul node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op1   The operand 1.
@@ -2669,11 +2784,11 @@ ir_node *new_d_Minus  (dbg_info* db, ir_node *op,  ir_mode *mode);
  * @param   *mode  The mode of the operands and the result.
  *
  */
-
 ir_node *new_d_Mul    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Quot node. Adds the node to the block in current_ir_block.
+/** Constructor for a Quot node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *memop The store needed to model exceptions
@@ -2681,11 +2796,11 @@ ir_node *new_d_Mul    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
  * @param   *op2   The operand 2.
  *
  */
-
 ir_node *new_d_Quot   (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a DivMod node. Adds the node to the block in current_ir_block.
+/** Constructor for a DivMod node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *memop The store needed to model exceptions
@@ -2693,11 +2808,11 @@ ir_node *new_d_Quot   (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
  * @param   *op2   The operand 2.
  *
  */
-
 ir_node *new_d_DivMod (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Div node. Adds the node to the block in current_ir_block.
+/** Constructor for a Div node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *memop The store needed to model exceptions
@@ -2705,11 +2820,11 @@ ir_node *new_d_DivMod (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
  * @param   *op2   The operand 2.
  *
  */
-
 ir_node *new_d_Div    (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Mod node. Adds the node to the block in current_ir_block.
+/** Constructor for a Mod node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *memop The store needed to model exceptions
@@ -2717,22 +2832,22 @@ ir_node *new_d_Div    (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2)
  * @param   *op2   The operand 2.
  *
  */
-
 ir_node *new_d_Mod    (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Abs node. Adds the node to the block in current_ir_block.
+/** Constructor for a Abs node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op    The operand
  * @param   *mode  The mode of the operands and the result.
  *
  */
-
 ir_node *new_d_Abs    (dbg_info* db, ir_node *op,                ir_mode *mode);
 
-/**
- * Constructor for a And node. Adds the node to the block in current_ir_block.
+/** Constructor for a And node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *irg   The ir graph the node  belongs to.
@@ -2742,11 +2857,11 @@ ir_node *new_d_Abs    (dbg_info* db, ir_node *op,                ir_mode *mode);
  * @param   *mode  The mode of the operands and the result.
  *
  */
-
 ir_node *new_d_And    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Or node. Adds the node to the block in current_ir_block.
+/** Constructor for a Or node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op1   The operand 1.
@@ -2754,11 +2869,11 @@ ir_node *new_d_And    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
  * @param   *mode  The mode of the operands and the result.
  *
  */
-
 ir_node *new_d_Or     (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Eor node. Adds the node to the block in current_ir_block.
+/** Constructor for a Eor node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op1   The operand 1.
@@ -2766,22 +2881,22 @@ ir_node *new_d_Or     (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
  * @param   *mode  The mode of the operands and the results.
  *
  */
-
 ir_node *new_d_Eor    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Not node. Adds the node to the block in current_ir_block.
+/** Constructor for a Not node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op    The operand.
  * @param   *mode  The mode of the operand and the result.
  *
  */
-
 ir_node *new_d_Not    (dbg_info* db, ir_node *op,                ir_mode *mode);
 
-/**
- * Constructor for a Shl node. Adds the node to the block in current_ir_block.
+/** Constructor for a Shl node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op    The operand.
@@ -2789,11 +2904,11 @@ ir_node *new_d_Not    (dbg_info* db, ir_node *op,                ir_mode *mode);
  * @param   *mode  The mode of the operand and the result.
  *
  */
-
 ir_node *new_d_Shl    (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
 
-/**
- * Constructor for a Shr node. Adds the node to the block in current_ir_block.
+/** Constructor for a Shr node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op    The operand.
@@ -2801,11 +2916,11 @@ ir_node *new_d_Shl    (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
  * @param   *mode  The mode of the operand and the result.
  *
  */
-
 ir_node *new_d_Shr    (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
 
-/**
- * Constructor for a Shrs node. Adds the node to the block in current_ir_block.
+/** Constructor for a Shrs node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op    The operand.
@@ -2813,11 +2928,11 @@ ir_node *new_d_Shr    (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
  * @param   *mode  The mode of the operand and the result.
  *
  */
-
 ir_node *new_d_Shrs   (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
 
-/**
- * Constructor for a Rot node. Adds the node to the block in current_ir_block.
+/** Constructor for a Rot node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op    The operand.
@@ -2825,44 +2940,45 @@ ir_node *new_d_Shrs   (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
  * @param   *mode  The mode of the operand.
  *
  */
-
 ir_node *new_d_Rot    (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
 
-/**
- * Constructor for a Cmp node. Adds the node to the block in current_ir_block.
+/** Constructor for a Cmp node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op1   The operand 1.
  * @param   *op2   The operand 2.
  *
  */
-
 ir_node *new_d_Cmp    (dbg_info* db, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Conv node. Adds the node to the block in current_ir_block.
+/** Constructor for a Conv node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op    The operand.
  * @param   *mode  The mode of this the operand muss be converted .
  *
  */
-
 ir_node *new_d_Conv   (dbg_info* db, ir_node *op, ir_mode *mode);
 
-/**
- * Constructor for a Cast node. Adds the node to the block in current_ir_block.
+/**Constructor for a Cast node.
+ *
+ * High level type cast
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *db    A pointer for debug information.
  * @param   *op    The operand.
  * @param   *to_tp The type of this the operand muss be casted .
  *
  */
-
 ir_node *new_d_Cast   (dbg_info* db, ir_node *op, type *to_tp);
 
-/**
- * Constructor for a Phi node. Adds the node to the block in current_ir_block.
+/**Constructor for a Phi node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db    A pointer for debugginaromation.
  * @param arity  The number of predecessors
@@ -2870,33 +2986,34 @@ ir_node *new_d_Cast   (dbg_info* db, ir_node *op, type *to_tp);
  * @param *mode  The mode of it's inputs and output.
  *
  */
-
 ir_node *new_d_Phi    (dbg_info* db, int arity, ir_node *in[], ir_mode *mode);
 
-/**
- * Constructor for a Load node. Adds the node to the block in current_ir_block.
+/** Constructor for a Load node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db    A pointer for debug information.
  * @param *store The current memory
  * @param *adr   A pointer to the variable to be read in this memory.
  *
  */
-
 ir_node *new_d_Load   (dbg_info* db, ir_node *store, ir_node *addr);
 
-/**
- * Constructor for a Store node. Adds the node to the block in current_ir_block.
+/** Constructor for a Store node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db    A pointer for debug information.
  * @param *store The current memory
  * @param *adr   A pointer to the variable to be read in this memory.
  * @param *val   The value to write to this variable.
  */
-
 ir_node *new_d_Store  (dbg_info* db, ir_node *store, ir_node *addr, ir_node *val);
 
-/**
- * Constructor for a Alloc node. Adds the node to the block in current_ir_block.
+/**Constructor for a Alloc node.
+ *
+ * The Alloc node extends the memory by space for an entity of type alloc_type.
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db         A pointer for debug information.
  * @param *store      The memory which shall contain the new variable.
@@ -2905,12 +3022,14 @@ ir_node *new_d_Store  (dbg_info* db, ir_node *store, ir_node *addr, ir_node *val
  * @param where       Where to allocate the variable, either heap_alloc or stack_alloc.
  *
  */
-
 ir_node *new_d_Alloc  (dbg_info* db, ir_node *store, ir_node *size, type *alloc_type,
                      where_alloc where);
 
-/**
- * Constructor for a Free node. Adds the node to the block in current_ir_block.
+/**Constructor for a Free node.
+ *
+ * Frees the memory occupied by the entity pointed to by the pointer
+ * arg.  Type indicates the type of the entity the argument points to.
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db         A pointer for debug information.
  * @param *store      The memory which shall contain the new variable.
@@ -2919,24 +3038,30 @@ ir_node *new_d_Alloc  (dbg_info* db, ir_node *store, ir_node *size, type *alloc_
  * @param *free_type  The type of the freed variable.
  *
  */
-
 ir_node *new_d_Free   (dbg_info* db, ir_node *store, ir_node *ptr, ir_node *size,
              type *free_type);
 
-/**
- * Constructor for a  Sync node. Adds the node to the block in current_ir_block.
+/**Constructor for a  Sync node.
+ *
+ * Merges several memory values.  The node assumes that a variable
+ * either occurs only in one of the memories, or it contains the same
+ * value in all memories where it occurs.
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db       A pointer for debug information.
  * @param  arity    The number of memories to syncronize.
- * @param  **in     An array of pointers to nodes that produce an output of  type memory.
+ * @param  **in     An array of pointers to nodes that produce an output of type
+ *                  memory.  The constructor copies this array.
  *
  */
-
 ir_node *new_d_Sync   (dbg_info* db, int arity, ir_node *in[]);
 
 
-/**
- * Constructor for a Proj node. Adds the node to the block in current_ir_block.
+/**Constructor for a Proj node.
+ *
+ * Projects a single value out of a tuple.  The parameter proj gives the
+ * position of the value within the tuple.
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db    A pointer for deubugginformation.
  * @param arg    A node producing a tuple.
@@ -2944,52 +3069,57 @@ ir_node *new_d_Sync   (dbg_info* db, int arity, ir_node *in[]);
  * @param proj   The position of the value in the tuple.
  *
  */
-
 ir_node *new_d_Proj   (dbg_info* db, ir_node *arg, ir_mode *mode, long proj);
 
 
-/**
- * Constructor for a defaultProj node. Adds the node to the block in current_ir_block.
+/**Constructor for a defaultProj node.
+ *
+ * Represents the default control flow of a Switch-Cond node.
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db       A pointer for debug information.
  * @param arg       A node producing a tuple.
  * @param max_ proj The end  position of the value in the tuple.
  *
  */
-
 ir_node *new_d_defaultProj (dbg_info* db, ir_node *arg, long max_proj);
 
-/**
- * Constructor for a Tuple node. Adds the node to the block in current_ir_block.
+/**Constructor for a Tuple node.
+ *
+ * This is an auxiliary node to replace a node that returns a tuple
+ * without changing the corresponding Proj nodes.
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db     A pointer for debug information.
  * @param arity   The number of tuple elements.
  * @param **in    An array containing pointers to the nodes producing the tuple elements.
  *
  */
-
 ir_node *new_d_Tuple  (dbg_info* db, int arity, ir_node *in[]);
 
 
-/**
- * Constructor for a Id node. Adds the node to the block in current_ir_block.
- * Performs the Id operation, i.e., does nothing.
+/**Constructor for a Id node.
+ *
+ * This is an auxiliary node to replace a node that returns a single
+ * value. Adds the node to the block in current_ir_block.
  *
  * @param *db     A pointer for debug information.
  * @param *val    The operand to Id.
  * @param *mode   The mode of *val.
  *
  */
-
 ir_node *new_d_Id     (dbg_info* db, ir_node *val, ir_mode *mode);
 
-/**
- * Returns the unique Bad node.  Same as get_irn_bad(..);
+/**Costructor for a Bad node.
+ *
+ * Returns the unique Bad node of the graph.  The same as
+ * get_irg_bad().
+ *
  */
-
 ir_node *new_d_Bad    (void);
 
-/**
+/** Constructor for a Confirm node.
+ *
  * Constructor for a Confirm node. Adds the node to the block in current_ir_block.
  * Specifies constraints for a value.  To support dataflow analyses.
  *
@@ -3002,56 +3132,64 @@ ir_node *new_d_Bad    (void);
  * @param cmp     The compare operation.
  *
  */
-
 ir_node *new_d_Confirm (dbg_info* db, ir_node *val, ir_node *bound, pn_Cmp cmp);
 
 
-/**
- * Constructor for a Unknown node.  Represents an arbtrary valus.  Places the node in
+/** Constructor for a Unknown node.
+ *
+ * Represents an arbtrary valus.  Places the node in
  * the start block.
  *
  * @param *m      The mode of the unknown value.
  *
  */
-
 ir_node *new_d_Unknown(ir_mode *m);
 
-/**
- * Constructor for a CallBegin node. Adds the node to the block in current_ir_block.
+/** Constructor for a CallBegin node.
+ *
+ * CallBegin represents control flow depending of the pointer value
+ * representing the called method to the called methods.  The
+ * constructor copies the method pointer input from the passed Call
+ * node.Adds the node to the block in current_ir_block.
  *
  * @param *db     A pointer for debug information.
  * @param *callee The call node bisible in the  intra procedural view.
  *
  */
-
 ir_node *new_d_CallBegin(dbg_info *db, ir_node *callee);
 
-/**
- * Constructor for a EndReg node. Adds the node to the block in current_ir_block.
+/** Constructor for a EndReg node.
+ *
+ *Adds the node to the block in current_ir_block.
  *
  * @param *db     A pointer for debug information.
  *
  */
-
 ir_node *new_d_EndReg (dbg_info *db);
 
-/**
- * Constructor for a Endexcept node. Adds the node to the block in current_ir_block.
+/**Constructor for a Endexcept node.
+ *
+ * Used to represent regular procedure end in interprocedual view.
+ * Adds the node to the block in current_ir_block.
  *
  * @param *db     A pointer for debug information.
  *
  */
-
 ir_node *new_d_EndExcept(dbg_info *db);
 
-/**
- * Constructor for a Breake node. Adds the node to the block in current_ir_block.
+/**Constructor for a Breake node.
+ *
+ * Used to represent exceptional procedure end in interprocedural view.
+ * Adds the node to the block in current_ir_block.
+ *
+ * Break represents control flow to a single control successor just as Jmp.
+ * The blocks separated by a break may not be concatenated by an optimization.
+ * It is used for the interprocedural representation where blocks are parted
+ * behind Call nodes to represent the control flow to called procedures.
  *
  * @param *db     A pointer for debug information.
  *
  */
-
-
 ir_node *new_d_Break (dbg_info *db);
 
 /** Constructor for a Filter node.
@@ -3075,18 +3213,19 @@ ir_node *new_d_Break (dbg_info *db);
 ir_node *new_d_Filter (dbg_info *db, ir_node *arg, ir_mode *mode, long proj);
 
 
-/**
- * Constructor for a FuncCall node. Adds the node to the block in current_ir_block.
+/** Constructor for a FuncCall node.
+ *
+ *  FuncCall is a function Call that has no side effects.  Therefore there
+ *  is not memory operand or result. Adds the node to the block in current_ir_block.
  *
  * @param *db     A pointer for debug information.
  * @param *callee A pointer to the called procedure.
  * @param arity   The number of procedure parameters.
- * @param **in    An array with the pointers to the parameters. The constructor copies this array.
+ * @param **in    An array with the pointers to the parameters.
+ *                The constructor copies this array.
  * @param *tp     Type information of the procedure called.
  *
  */
-
-
 ir_node *new_d_FuncCall (dbg_info* db, ir_node *callee, int arity, ir_node *in[],
                         type *tp);
 
@@ -3112,33 +3251,32 @@ void switch_block (ir_node *target);   */
  */
 ir_node *new_Block(int arity, ir_node *in[]);
 
-/**
+/** Constructor for a Start node.
  *
- * Constructor for a Start node. Adds the node to the block in current_ir_block.
+ * Adds the node to the block in current_ir_block.
  *
  */
-
 ir_node *new_Start  (void);
 
-/**
+/** Constructor for a End node.
  *
- * Constructor for a End node. Adds the node to the block in current_ir_block.
+ * Adds the node to the block in current_ir_block.
  *
  */
-
 ir_node *new_End    (void);
 
-/**
+/** Constructor for a EndReg node.
  *
- * Constructor for a EndReg node. Adds the node to the block in current_ir_block.
+ * Used to represent regular procedure end in interprocedual view.
+ * Adds the node to the block in current_ir_block.
  *
  */
-
 ir_node *new_EndReg (void);
 
 /** Constructor for an EndExpcept node.
  *
- * Constructor for an EndExpcept node. Adds the node to the block in current_ir_block.
+ *  Used to represent exceptional procedure end in interprocedural view.
+ *  Adds the node to the block in current_ir_block.
  *
  *
  *
@@ -3149,105 +3287,144 @@ ir_node *new_EndExcept(void);
  *
  * Constructor for a Jump node. Adds the node to the block in current_ir_block.
  *
+ * Jmp represents control flow to a single control successor.
+ *
  */
-
 ir_node *new_Jmp    (void);
 
-/**
- *
- * Constructor for a Break node. Adds the node to the block in current_ir_block.
+/** Constructor for a Break node.
+ * Break represents control flow to a single control successor just as Jmp.
+ * The blocks separated by a break may not be concatenated by an optimization.
+ * It is used for the interprocedural representation where blocks are parted
+ * behind Call nodes to represent the control flow to called procedures.
+ *Adds the node to the block in current_ir_block.
  *
  */
-
 ir_node *new_Break  (void);
 
-/**
- * Constructor for a Cond node. Adds the node to the block in current_ir_block.
+/**Constructor for a Cond node.
+ *
+ * If c is mode_b represents a conditional branch (if/else). If c is
+ * mode_Is/mode_Iu (?) represents a switch.  (Allocates dense Cond
+ * node, default Proj is 0.). Adds the node to the block in current_ir_block.
+ *
+ * This is not consistent:  Input to Cond is Is, Proj has as proj number
+ * longs.
+ *
  *
  * @param *c     The conditions parameter.Can be of mode b or I_u.
  *
  */
-
 ir_node *new_Cond   (ir_node *c);
 
-/**
- * Constructor for a Return node. Adds the node to the block in current_ir_block.
+/** Constructor for a Return node.
+ *
+ * Returns the memory an zero or more return values.  Only node that
+ * can end regular control flow. Adds the node to the block in current_ir_block.
  *
  * @param *store The state of memory.
  * @param arity  Number of array indexes.
  * @param *in    Array with index inputs to the node.
  *
  */
-
 ir_node *new_Return (ir_node *store, int arity, ir_node *in[]);
 
-/**
- * Constructor for a Raise node. Adds the node to the block in current_ir_block.
+/**Constructor for a Raise node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param *store The current memory.
  * @param *obj   A pointer to the Except variable.
  *
  */
-
 ir_node *new_Raise  (ir_node *store, ir_node *obj);
 
-/**
- * Constructor for a Const node. Adds the node to the block in current_ir_block.
+/** Constructor for a Const node.
+ *
+ * Constructor for a Const node. The constant represents a target
+ * value.  Sets the type information to type_unknown.  (No more
+ * supported: If tv is entity derives a somehow useful type.)
+ * Adds the node to the block in current_ir_block.
  *
  * @param *mode  The mode of the operands and redults.
  * @param *con   Points to an entry in the constant table. This pointer is added to the attributes of  the node (self->attr.con).
  *
  */
-
 ir_node *new_Const  (ir_mode *mode, tarval *con);
 
-/**
- * Constructor for a SymConst node. Adds the node to the block in current_ir_block.
+/** Constructor for a SymConst node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *  This is the constructor for a symbolic constant.
+ *    There are four kinds of symbolic constants:
+ *    - type_tag  The symbolic constant represents a type tag.  The type the
+ *                tag stands for is given explicitly.
+ *    - size      The symbolic constant represents the size of a type.  The
+ *                type of which the constant represents the size is given
+ *                explicitly.
+ *    - addr_name The symbolic constant represents the address of an entity
+ *                (variable or method).  The variable is indicated by a name
+ *                that is valid for linking.
+ *    - addr_ent   The symbolic constant represents the address of an entity
+ *                (variable or method).  The variable is given explicitly by
+ *                a firm entity.
+ *
+ *    Inputs to the node:
+ *      No inputs except the block it belongs to.
+ *    Outputs of the node.
+ *      An unsigned integer (I_u) or a pointer (P).
  *
  * @param value   A type or a ident depending on the SymConst kind.
  * @param symkind The kind of the symbolic constant: symconst_type_tag, symconst_size or symconst_addr_name.
  *
  */
-ir_node *new_SymConst (type_or_id_p value, symconst_kind kind);
+ir_node *new_SymConst (symconst_symbol value, symconst_kind kind);
 
-/**
- * Constructor for a simpelSel node.
+/** Constructor for a simpelSel node.
  *
  * @param   *store     The memory in which the object the entity should be selected from is allocated.
  * @param   *objptr    The object from that the Sel operation selects a single attribute out.
  * @param   *ent       The entity to select.
  *
  */
-
 ir_node *new_simpleSel(ir_node *store, ir_node *objptr, entity *ent);
 
-/**
- * Constructor for a Sel node.
+/** Constructor for a Sel node.
  *
- * @param   *store     The memory in which the object the entity should be selected from is allocated.
- * @param   *objptr    The object from that the Sel operation selects a single attribute out.
- * @param   *n_index   The  index of the selected object from the array.
- * @param   *index     Array with index inputs to the node.
- * @param   *ent       The entity to select.
+ * The select node selects an entity (field or method) from an entity
+ * with a compound type.  It explicitly specifies the entity selected.
+ * Dynamically the node may select entities that overwrite the given
+ * entity.  If the selected entity is an array element entity the Sel
+ * node takes the required array indicees as inputs.
  *
+ * @param   *store     The memory in which the object the entity should be selected
+ *                     from is allocated.
+ * @param   *objptr    A pointer to a compound entity the Sel operation selects a
+ *                     single attribute from.
+ * @param   *n_index   The number of array indicees needed to select an array element entity.
+ * @param   *index[]   If the compound entity is an array the indicees of the selected
+ *                     element entity.  The constructor copies this array.
+ * @param   *ent       The entity to select.
  */
-
 ir_node *new_Sel    (ir_node *store, ir_node *objptr, int arity, ir_node *in[],
                      entity *ent);
 
-/**
- * Constructor for a InstOf node. Adds the node to the block in current_ir_block.
+/** Constructor for a InstOf node.
+ *
+ * Adds the node to the block in current_ir_block.
+ * For translating Java.  Not supported as standard firm node.
  *
  * @param   *store
  * @param   *objptr
  * @param   *ent
  *
  */
-
 ir_node *new_InstOf (ir_node *store, ir_node *obj,  type *ent);
 
-/**
- * Constructor for a Call node. Adds the node to the block in current_ir_block.
+/** Constructor for a Call node.
+ *
+ *  Adds the node to the block in current_ir_block.
+ *  Represents all kinds of method and function calls.
  *
  * @param   *store  The actual store.
  * @param   *callee A pointer to the called procedure.
@@ -3256,49 +3433,51 @@ ir_node *new_InstOf (ir_node *store, ir_node *obj,  type *ent);
  * @param   *tp     Type information of the procedure called.
  *
  */
-
 ir_node *new_Call   (ir_node *store, ir_node *callee, int arity, ir_node *in[],
                     type *tp);
 
-/**
- * Constructor for a CallBegin node. Adds the node to the block in current_ir_block.
+/** Constructor for a CallBegin node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *callee A pointer to the called procedure.
  *
  */
-
 ir_node *new_CallBegin(ir_node *callee);
 
-/**
- * Constructor for a Add node. Adds the node to the block in current_ir_block.
+/**Constructor for a Add node.
+ *
+ * CallBegin represents control flow depending of the pointer value
+ * representing the called method to the called methods.  The
+ * constructor copies the method pointer input from the passed Call
+ * node.Adds the node to the block in current_ir_block.
  *
  * @param   *op1   The operand 1.
  * @param   *op2   The operand 2.
  * @param   *mode  The mode of the operands and the result.
  *
  */
-
 ir_node *new_Add    (ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Sub node. Adds the node to the block in current_ir_block.
+/** Constructor for a Sub node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *op1   The operand 1.
  * @param   *op2   The operand 2.
  * @param   *mode  The mode of the operands and the result.
  *
  */
-
 ir_node *new_Sub    (ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Minus node. Adds the node to the block in current_ir_block.
+/** Constructor for a Minus node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *op    The operand .
  * @param   *mode  The mode of the operand and the result.
  *
  */
-
 ir_node *new_Minus  (ir_node *op,  ir_mode *mode);
 
 /**
@@ -3309,65 +3488,65 @@ ir_node *new_Minus  (ir_node *op,  ir_mode *mode);
  * @param   *mode  The mode of the operands and the result.
  *
  */
-
 ir_node *new_Mul    (ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Quot node. Adds the node to the block in current_ir_block.
+/** Constructor for a Quot node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *memop The store needed to model exceptions
  * @param   *op1   The operand 1.
  * @param   *op2   The operand 2.
  *
  */
-
 ir_node *new_Quot   (ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a DivMod node. Adds the node to the block in current_ir_block.
+/** Constructor for a DivMod node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *memop The store needed to model exceptions
  * @param   *op1   The operand 1.
  * @param   *op2   The operand 2.
  *
  */
-
 ir_node *new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Div node. Adds the node to the block in current_ir_block.
+/** Constructor for a Div node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *memop The store needed to model exceptions
  * @param   *op1   The operand 1.
  * @param   *op2   The operand 2.
  *
  */
-
 ir_node *new_Div    (ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Mod node. Adds the node to the block in current_ir_block.
+/** Constructor for a Mod node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *memop The store needed to model exceptions
  * @param   *op1   The operand 1.
  * @param   *op2   The operand 2.
  *
  */
-
 ir_node *new_Mod    (ir_node *memop, ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Abs node. Adds the node to the block in current_ir_block.
+/** Constructor for a Abs node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *op    The operand
  * @param   *mode  The mode of the operands and the result.
  *
  */
-
 ir_node *new_Abs    (ir_node *op,                ir_mode *mode);
 
-/**
- * Constructor for a And node. Adds the node to the block in current_ir_block.
+/** Constructor for a And node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *op1   The operand 1.
  * @param   *op2   The operand 2.
@@ -3384,7 +3563,6 @@ ir_node *new_And    (ir_node *op1, ir_node *op2, ir_mode *mode);
  * @param   *mode  The mode of the operands and the result.
  *
  */
-
 ir_node *new_Or     (ir_node *op1, ir_node *op2, ir_mode *mode);
 
 /**
@@ -3395,28 +3573,27 @@ ir_node *new_Or     (ir_node *op1, ir_node *op2, ir_mode *mode);
  * @param   *mode  The mode of the operands and the results.
  *
  */
-
 ir_node *new_Eor    (ir_node *op1, ir_node *op2, ir_mode *mode);
 
-/**
- * Constructor for a Not node. Adds the node to the block in current_ir_block.
+/** Constructor for a Not node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *op    The operand.
  * @param   *mode  The mode of the operand and the result.
  *
  */
-
 ir_node *new_Not    (ir_node *op,                ir_mode *mode);
 
-/**
- * Constructor for a Shl node. Adds the node to the block in current_ir_block.
+/** Constructor for a Shl node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *op    The operand.
  * @param   *k     The number of bits to  shift the operand .
  * @param   *mode  The mode of the operand and the result.
  *
  */
-
 ir_node *new_Shl    (ir_node *op,  ir_node *k,   ir_mode *mode);
 
 /**
@@ -3427,94 +3604,92 @@ ir_node *new_Shl    (ir_node *op,  ir_node *k,   ir_mode *mode);
  * @param   *mode  The mode of the operand and the result.
  *
  */
-
 ir_node *new_Shr    (ir_node *op,  ir_node *k,   ir_mode *mode);
 
-/**
- * Constructor for a Shrs node. Adds the node to the block in current_ir_block.
+/** Constructor for a Shrs node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *op    The operand.
  * @param   *k     The number of bits to  shift the operand .
  * @param   *mode  The mode of the operand and the result.
  *
  */
-
 ir_node *new_Shrs   (ir_node *op,  ir_node *k,   ir_mode *mode);
 
-/**
- * Constructor for a Rot node. Adds the node to the block in current_ir_block.
+/** Constructor for a Rot node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *op    The operand.
  * @param   *k     The number of bits to rotate the operand.
  * @param   *mode  The mode of the operand.
  *
  */
-
 ir_node *new_Rot    (ir_node *op,  ir_node *k,   ir_mode *mode);
 
-/**
- * Constructor for a Cmp node. Adds the node to the block in current_ir_block.
+/** Constructor for a Cmp node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *op1   The operand 1.
  * @param   *op2   The operand 2.
  *
  */
-
 ir_node *new_Cmp    (ir_node *op1, ir_node *op2);
 
-/**
- * Constructor for a Conv node. Adds the node to the block in current_ir_block.
+/** Constructor for a Conv node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param   *op    The operand.
  * @param   *mode  The mode of this the operand muss be converted .
  *
  */
-
 ir_node *new_Conv   (ir_node *op, ir_mode *mode);
 
-/**
- * Constructor for a Cast node. Adds the node to the block in current_ir_block.
+/**Constructor for a Cast node.
+ *
+ * Adds the node to the block in current_ir_block.
+ * High level type cast
  *
  * @param   *op    The operand.
  * @param   *to_tp The type of this the operand muss be casted .
  *
  */
-
 ir_node *new_Cast   (ir_node *op, type *to_tp);
 
-/**
- * Constructor for a Phi node. Adds the node to the block in current_ir_block.
+/** Constructor for a Phi node.
+ *
+ * Adds the node to the block in current_ir_block.
  *
  * @param arity  The number of predecessors
  * @param *in    Array with predecessors
  * @param *mode  The mode of it's inputs and output.
  *
  */
-
 ir_node *new_Phi    (int arity, ir_node *in[], ir_mode *mode);
 
-/**
- * Constructor for a Load node.
+/** Constructor for a Load node.
  *
  * @param *store The current memory
  * @param *addr   A pointer to the variable to be read in this memory.
  *
  */
-
 ir_node *new_Load   (ir_node *store, ir_node *addr);
 
-/**
- * Constructor for a Store node.
+/** Constructor for a Store node.
  *
  * @param *store The current memory
  * @param *addr   A pointer to the variable to be read in this memory.
  * @param *val   The value to write to this variable.
  */
-
 ir_node *new_Store  (ir_node *store, ir_node *addr, ir_node *val);
 
-/**
- * Constructor for a Alloc node. Adds the node to the block in current_ir_block.
+/**Constructor for a Alloc node.
+ *
+ * The Alloc node extends the memory by space for an entity of type alloc_type.
+ * Adds the node to the block in current_ir_block.
  *
  * @param *store      The memory which shall contain the new variable.
  * @param *size       The number of bytes to allocate.
@@ -3522,13 +3697,15 @@ ir_node *new_Store  (ir_node *store, ir_node *addr, ir_node *val);
  * @param where       Where to allocate the variable, either heap_alloc or stack_alloc.
  *
  */
-
 ir_node *new_Alloc  (ir_node *store, ir_node *size, type *alloc_type,
                      where_alloc where);
 
 
-/**
- * Constructor for a Free node. Adds the node to the block in current_ir_block.
+/**Constructor for a Free node.
+ *
+ * Frees the memory occupied by the entity pointed to by the pointer
+ * arg.  Type indicates the type of the entity the argument points to.
+ * Adds the node to the block in current_ir_block.
  *
  * @param *store      The memory which shall contain the new variable.
  * @param *ptr        The pointer to the object to free.
@@ -3536,21 +3713,28 @@ ir_node *new_Alloc  (ir_node *store, ir_node *size, type *alloc_type,
  * @param *free_type  The type of the freed variable.
  *
  */
-
 ir_node *new_Free   (ir_node *store, ir_node *ptr, ir_node *size,
              type *free_type);
 
-/**
- * Constructor for a  Sync node. Adds the node to the block in current_ir_block.
+/**Constructor for a  Sync node.
+ *
+ * Merges several memory values.  The node assumes that a variable
+ * either occurs only in one of the memories, or it contains the same
+ * value in all memories where it occurs.
+ * Adds the node to the block in current_ir_block.
  *
  * @param  arity    The number of memories to syncronize.
- * @param  **in     An array of pointers to nodes that produce an output of  type memory.
+ * @param  **in     An array of pointers to nodes that produce an output of type
+ *                  memory.  The constructor copies this array.
  *
  */
 ir_node *new_Sync   (int arity, ir_node *in[]);
 
-/**
- * Constructor for a Proj node. Adds the node to the block in current_ir_block.
+/**Constructor for a Proj node.
+ *
+ * Projects a single value out of a tuple.  The parameter proj gives the
+ * position of the value within the tuple.
+ * Adds the node to the block in current_ir_block.
  *
  * @param arg    A node producing a tuple.
  * @param *mode  The mode of the value to project.
@@ -3559,7 +3743,7 @@ ir_node *new_Sync   (int arity, ir_node *in[]);
  */
 ir_node *new_Proj   (ir_node *arg, ir_mode *mode, long proj);
 
-/**
+/**Costructor for a Filter node.
  *
  * Constructor for a Filter node. Adds the node to the block in current_ir_block.
  * Filter is a node with two views used to construct the interprocedural view.
@@ -3577,8 +3761,10 @@ ir_node *new_Proj   (ir_node *arg, ir_mode *mode, long proj);
  */
 ir_node *new_Filter (ir_node *arg, ir_mode *mode, long proj);
 
-/**
- * Constructor for a defaultProj node.Adds the node to the block in current_ir_block.
+/**Constructor for a defaultProj node.
+ *
+ * Represents the default control flow of a Switch-Cond node.
+ * Adds the node to the block in current_ir_block.
  *
  * @param arg       A node producing a tuple.
  * @param max_ proj The end  position of the value in the tuple.
@@ -3586,18 +3772,22 @@ ir_node *new_Filter (ir_node *arg, ir_mode *mode, long proj);
  */
 ir_node *new_defaultProj (ir_node *arg, long max_proj);
 
-/**
- * Constructor for a Tuple node. Adds the node to the block in current_ir_block.
+/**Constructor for a Tuple node.
+ *
+ * This is an auxiliary node to replace a node that returns a tuple
+ * without changing the corresponding Proj nodes.
+ * Adds the node to the block in current_ir_block.
  *
  * @param arity   The number of tuple elements.
  * @param **in    An array containing pointers to the nodes producing the tuple elements.
  *
  */
-
 ir_node *new_Tuple  (int arity, ir_node *in[]);
 
-/**
- * Constructor for a Id node. Adds the node to the block in current_ir_block.
+/**Constructor for a Id node.
+ *
+ * This is an auxiliary node to replace a node that returns a single
+ * value. Adds the node to the block in current_ir_block.
  *
  * @param *val    The operand to Id.
  * @param *mode   The mode of *val.
@@ -3605,18 +3795,19 @@ ir_node *new_Tuple  (int arity, ir_node *in[]);
  */
 ir_node *new_Id     (ir_node *val, ir_mode *mode);
 
-/**
+/**Constructor for a Bad node.
  *
- * Constructor for a Bad node.
- * Adds the node to the block in current_ir_block.
+ * Returns the unique Bad node of the graph.  The same as
+ * get_irg_bad().
  *
  */
 
 ir_node *new_Bad    (void);
 
-/**
- * Constructor for a Confirm node. Adds the node to the block in current_ir_block.
+/** Constructor for a Confirm node.
+ *
  * Specifies constraints for a value.  To support dataflow analyses.
+ * Adds the node to the block in current_ir_block.
  *
  * Example: If the value never exceeds '100' this is expressed by placing a
  * Confirm node val = new_d_Confirm(db, val, 100, '<') on the dataflow edge.
@@ -3628,8 +3819,9 @@ ir_node *new_Bad    (void);
  */
 ir_node *new_Confirm (ir_node *val, ir_node *bound, pn_Cmp cmp);
 
- /**
- * Constructor for a Unknown node.  Represents an arbitrary value.  Places the node in
+/** Constructor for a Unknown node.
+ *
+ * Represents an arbitrary value.  Places the node in
  * the start block.
  *
  * @param *m      The mode of the unknown value.
@@ -3637,16 +3829,18 @@ ir_node *new_Confirm (ir_node *val, ir_node *bound, pn_Cmp cmp);
  */
 ir_node *new_Unknown(ir_mode *m);
 
-/**
- * Constructor for a FuncCall node. Adds the node to the block in current_ir_block.
+/** Constructor for a FuncCall node.
+ *
+ *  FuncCall is a function Call that has no side effects.  Therefore there
+ *  is not memory operand or result.Adds the node to the block in current_ir_block.
  *
  * @param *callee A pointer to the called procedure.
  * @param arity   The number of procedure parameters.
- * @param **in    An array with the pointers to the parameters. The constructor copies this array.
+ * @param **in    An array with the pointers to the parameters.
+ *                The constructor copies this array.
  * @param *tp     Type information of the procedure called.
  *
  */
-
 ir_node *new_FuncCall (ir_node *callee, int arity, ir_node *in[],
                       type *tp);
 
index 402998e..a3743cd 100644 (file)
@@ -452,14 +452,18 @@ dump_node_opcode(FILE *F, ir_node *n)
   } break;
 
   case iro_SymConst: {
-    if (get_SymConst_kind(n) == linkage_ptr_info) {
+    if (get_SymConst_kind(n) == symconst_addr_name) {
       /* don't use get_SymConst_ptr_info as it mangles the name. */
-      fprintf (F, "SymC %s", get_id_str(get_SymConst_ptrinfo(n)));
+      fprintf (F, "SymC %s", get_id_str(get_SymConst_name(n)));
+    } else if (get_SymConst_kind(n) == symconst_addr_ent) {
+      assert(get_SymConst_entity(n));
+      assert(is_entity(get_SymConst_entity(n)));
+      fprintf (F, "SymC &%s", get_entity_name(get_SymConst_entity(n)));
     } else {
       assert(get_kind(get_SymConst_type(n)) == k_type);
       assert(get_type_ident(get_SymConst_type(n)));
       fprintf (F, "SymC %s ", get_type_name_ex(get_SymConst_type(n), &bad));
-      if (get_SymConst_kind(n) == type_tag)
+      if (get_SymConst_kind(n) == symconst_type_tag)
         fprintf (F, "tag");
       else
         fprintf (F, "size");
@@ -626,6 +630,7 @@ static INLINE int dump_node_info(ir_node *n)
   fprintf (F, " info1: \"");
   if (opt_dump_pointer_values_to_info)
     fprintf (F, "addr:    %p \n", (void *)n);
+  fprintf (F, "mode:    %s\n", get_mode_name(get_irn_mode(n)));
   fprintf (F, "visited: %ld \n", get_irn_visited(n));
   irg = get_irn_irg(n);
   if (irg != get_const_code_irg())
@@ -1159,8 +1164,8 @@ static void dump_node2type_edges (ir_node *n, void *env)
     /* @@@ some consts have an entity */
     break;
   case iro_SymConst:
-    if (   (get_SymConst_kind(n) == type_tag)
-       || (get_SymConst_kind(n) == size))
+    if (   (get_SymConst_kind(n) ==symconst_type_tag)
+       || (get_SymConst_kind(n) ==symconst_size))
       {
     print_node_type_edge(F,n,get_SymConst_type(n),NODE2TYPE_EDGE_ATTR);
       }
index 2175030..45b5507 100644 (file)
@@ -23,7 +23,9 @@
 
 # include "irgraph.h"
 
-/** Applies local optimizations (see iropt.h) to all nodes in the graph. */
+/** Applies local optimizations (see iropt.h) to all nodes in the graph.
+ *
+ * @param irg  The graph to be optimized. */
 void local_optimize_graph (ir_graph *irg);
 
 /** Performs dead node elimination by copying the ir graph to a new obstack.
@@ -43,14 +45,19 @@ void local_optimize_graph (ir_graph *irg);
  *  Callee information must be freed (irg_callee_info_none).
  *
  *  Attention: the numbers assigned to nodes if the library is compiled for
- *  development/debugging are not conserved by copying. */
+ *  development/debugging are not conserved by copying.
+ *
+ * @param irg  The graph to be optimized. */
 void dead_node_elimination(ir_graph *irg);
 
-/** Removes Bad Bad predecesors from Blocks and the corresponding
-    inputs to Phi nodes as in dead_node_elimination but without
-    copying the graph.
-
-    @todo not implemented! / buggy?  */
+/**  Cleans the control flow from Bad predecesors.
+ *
+ * Removes Bad predecesors from Blocks and the corresponding
+ * inputs to Phi nodes as in dead_node_elimination but without
+ * copying the graph.
+ *
+ * @param irg  The graph to be optimized.
+ */
 void remove_bad_predecessors(ir_graph *irg);
 
 /** Inlines a method at the given call site.
index d095983..5281e81 100644 (file)
@@ -75,9 +75,10 @@ typedef struct ir_graph ir_graph;
  *             did actually change something).  Code placement is necessary.
  */
 
-/** Global variable holding the current IR-graph.
- * This global variable is used by the ir construction
- * interface in ircons and by the optimizations.
+/** Global variable holding the current ir graph.
+ *
+ *  This global variable is used by the ir construction
+ *  interface in ircons and by the optimizations.
  */
 extern ir_graph *current_ir_graph;
 
index 57ab55f..7b25a2a 100644 (file)
@@ -80,7 +80,7 @@ const char *pns_name_arr [] = {
 };
 
 const char *symconst_name_arr [] = {
-  "type_tag", "size", "linkage_ptr_info"
+  "type_tag", "size", "addr_name", "addr_ent"
 };
 
 void
@@ -893,43 +893,59 @@ set_SymConst_kind (ir_node *node, symconst_kind num) {
 type *
 get_SymConst_type (ir_node *node) {
   assert (   (node->op == op_SymConst)
-          && (   get_SymConst_kind(node) == type_tag
-              || get_SymConst_kind(node) == size));
-  return node->attr.i.tori.typ = skip_tid(node->attr.i.tori.typ);
+          && (   get_SymConst_kind(node) == symconst_type_tag
+              || get_SymConst_kind(node) == symconst_size));
+  return node->attr.i.sym.type_p = skip_tid(node->attr.i.sym.type_p);
 }
 
 void
 set_SymConst_type (ir_node *node, type *tp) {
   assert (   (node->op == op_SymConst)
-          && (   get_SymConst_kind(node) == type_tag
-              || get_SymConst_kind(node) == size));
-  node->attr.i.tori.typ = tp;
+          && (   get_SymConst_kind(node) == symconst_type_tag
+              || get_SymConst_kind(node) == symconst_size));
+  node->attr.i.sym.type_p = tp;
 }
 
 ident *
-get_SymConst_ptrinfo (ir_node *node) {
+get_SymConst_name (ir_node *node) {
   assert (   (node->op == op_SymConst)
-          && (get_SymConst_kind(node) == linkage_ptr_info));
-  return node->attr.i.tori.ptrinfo;
+          && (get_SymConst_kind(node) == symconst_addr_name));
+  return node->attr.i.sym.ident_p;
 }
 
 void
-set_SymConst_ptrinfo (ir_node *node, ident *ptrinfo) {
+set_SymConst_name (ir_node *node, ident *name) {
   assert (   (node->op == op_SymConst)
-          && (get_SymConst_kind(node) == linkage_ptr_info));
-  node->attr.i.tori.ptrinfo = ptrinfo;
+          && (get_SymConst_kind(node) == symconst_addr_name));
+  node->attr.i.sym.ident_p = name;
 }
 
-type_or_id_p
+
+/* Only to access SymConst of kind symconst_addr_ent.  Else assertion: */
+entity   *get_SymConst_entity (ir_node *node) {
+  assert (   (node->op == op_SymConst)
+          && (get_SymConst_kind(node) == symconst_addr_ent));
+  return node->attr.i.sym.entity_p;
+}
+
+void     set_SymConst_entity (ir_node *node, entity *ent) {
+  assert (   (node->op == op_SymConst)
+          && (get_SymConst_kind(node) == symconst_addr_ent));
+  node->attr.i.sym.entity_p  = ent;
+}
+
+
+symconst_symbol
 get_SymConst_type_or_id (ir_node *node) {
   assert (node->op == op_SymConst);
-  return &(node->attr.i.tori);
+  return node->attr.i.sym;
 }
 
 void
-set_SymConst_type_or_id (ir_node *node, type_or_id_p tori) {
+set_SymConst_type_or_id (ir_node *node, symconst_symbol sym) {
   assert (node->op == op_SymConst);
-  memcpy (&(node->attr.i.tori), tori, sizeof(type_or_id));
+  //memcpy (&(node->attr.i.sym), sym, sizeof(type_or_id));
+  node->attr.i.sym = sym;
 }
 
 ir_node *
index 584dab8..e17a8de 100644 (file)
@@ -391,31 +391,60 @@ void     set_Const_type   (ir_node *node, type *tp);
      represented by SymConst.  The content of the attribute type_or_id
      depends on this tag.  Use the proper access routine after testing
      this flag. */
+
+#define type_tag         symconst_type_tag
+//#define size             symconst_size   geht nicht, benennt auf size in type.c um!
+#define linkage_ptr_info symconst_addr_name
 typedef enum {
-  type_tag,          /**< The SymConst is a type tag for the given type.
-                       Type_or_id_p is type *. */
-  size,              /**< The SymConst is the size of the given type.
-                       Type_or_id_p is type *. */
-  linkage_ptr_info   /**< The SymConst is a symbolic pointer to be filled in
-                       by the linker. Type_or_id_p is ident *.  If the name
-                       refers to an entity also compiled, this entity must be external_visible,
-                       so that it is not removed by some optimization.  An optimization must
-                       not analyse linkage_ptr_info SymConsts. */
+  symconst_type_tag,    /**< The SymConst is a type tag for the given type.
+                          Type_or_id_p is type *. */
+  symconst_size,        /**< The SymConst is the size of the given type.
+                          Type_or_id_p is type *. */
+  symconst_addr_name,   /**< The SymConst is a symbolic pointer to be filled in
+                          by the linker.  The pointer is represented by a string.
+                          Type_or_id_p is ident *. */
+  symconst_addr_ent     /**< The SymConst is a symbolic pointer to be filled in
+                          by the linker.  The pointer is represented by an entity.
+                          Type_or_id_p is entity *. */
 } symconst_kind;
 
-typedef union type_or_id * type_or_id_p;
+/** SymConst attributes
+    This union contains the symbolic information represented by the node  */
+union symconst_symbol {
+  type   *type_p;           //old typ
+  ident  *ident_p;         // old ptrinfo
+  entity *entity_p;        // entity_p
+};
+typedef union symconst_symbol symconst_symbol;
+
+/** Access the kind of the SymConst. */
 symconst_kind get_SymConst_kind (const ir_node *node);
 void          set_SymConst_kind (ir_node *node, symconst_kind num);
-/* Only to access SymConst of kind type_tag or size.  Else assertion: */
+
+/** Only to access SymConst of kind type_tag or size.  Else assertion: */
 type    *get_SymConst_type (ir_node *node);
 void     set_SymConst_type (ir_node *node, type *tp);
-/* Only to access SymConst of kind linkage_ptr_info.  Else assertion: */
+
+/** Only to access SymConst of kind addr_name.  Else assertion: */
+/* old:
 ident   *get_SymConst_ptrinfo (ir_node *node);
 void     set_SymConst_ptrinfo (ir_node *node, ident *ptrinfo);
-/* Sets both: type and ptrinfo.  Needed to treat the node independent of
-   its semantics.  Does a memcpy for the memory tori points to. */
-type_or_id_p get_SymConst_type_or_id (ir_node *node);
-void set_SymConst_type_or_id (ir_node *node, type_or_id_p tori);
+*/
+#define get_SymConst_ptrinfo get_SymConst_name
+#define set_SymConst_ptrinfo set_SymConst_name
+ident   *get_SymConst_name (ir_node *node);
+void     set_SymConst_name (ir_node *node, ident *name);
+
+/** Only to access SymConst of kind addr_ent.  Else assertion: */
+entity  *get_SymConst_entity (ir_node *node);
+void     set_SymConst_entity (ir_node *node, entity *ent);
+
+/** Sets both: type and ptrinfo.  Needed to treat the node independent of
+   its semantics.  Does a memcpy for the memory sym points to. */
+#define get_SymConst_type_or_id get_SymConst_symbol
+#define set_SymConst_type_or_id set_SymConst_symbol
+symconst_symbol get_SymConst_symbol (ir_node *node);
+void            set_SymConst_symbol (ir_node *node, symconst_symbol sym);
 
 ir_node *get_Sel_mem (ir_node *node);
 void     set_Sel_mem (ir_node *node, ir_node *mem);
index 518c63c..f0ca0dc 100644 (file)
 
 # include "exc.h"
 
+#include "set.h"
+#include "entity_t.h"
+#include "type_t.h"
+
 /** ir node attributes **/
 
 /** Block attributes */
@@ -85,15 +89,8 @@ typedef struct {
   type   *tp;        /**< the source type, for analyses. default: type_unknown. */
 } const_attr;
 
-/** SymConst attributes
-    This union contains the symbolic information represented by the node */
-typedef union type_or_id {
-  type  *typ;
-  ident *ptrinfo;
-} type_or_id;
-
 typedef struct {
-  type_or_id tori;
+  symconst_symbol sym;  // old tori
   symconst_kind num;
 } symconst_attr;
 
@@ -170,7 +167,7 @@ typedef union {
   callbegin_attr callbegin; /**< For CallBegin */
   alloc_attr     a;     /**< For Alloc. */
   io_attr        io;    /**< For InstOf */
-  type           *f;    /**< For Free. */
+  type          *f;     /**< For Free. */
   cast_attr      cast;  /**< For Cast. */
   int            phi0_pos;  /**< For Phi. Used to remember the value defined by
                    this Phi node.  Needed when the Phi is completed
index 8daff11..c0733b1 100644 (file)
@@ -60,7 +60,7 @@ static tarval *computed_value_Const(ir_node *n)
 
 static tarval *computed_value_SymConst(ir_node *n)
 {
-  if ((get_SymConst_kind(n) == size) &&
+  if ((get_SymConst_kind(n) ==symconst_size) &&
       (get_type_state(get_SymConst_type(n))) == layout_fixed)
     return new_tarval_from_long(get_type_size_bytes(get_SymConst_type(n)), mode_Is);
   return tarval_bad;
@@ -1376,7 +1376,7 @@ static int node_cmp_attr_Free(ir_node *a, ir_node *b)
 static int node_cmp_attr_SymConst(ir_node *a, ir_node *b)
 {
     return (get_irn_symconst_attr(a).num != get_irn_symconst_attr(b).num)
-      || (get_irn_symconst_attr(a).tori.typ != get_irn_symconst_attr(b).tori.typ);
+      || (get_irn_symconst_attr(a).sym.type_p != get_irn_symconst_attr(b).sym.type_p);
 }
 
 static int node_cmp_attr_Call(ir_node *a, ir_node *b)
index 8b11075..031f9d4 100644 (file)
@@ -82,10 +82,12 @@ new_entity (type *owner, ident *name, type *type)
   res->visibility = visibility_local;
   res->offset = -1;
   if (is_method_type(type)) {
+    symconst_symbol sym;
+    sym.entity_p = res;
     res->variability = variability_constant;
     rem = current_ir_graph;
     current_ir_graph = get_const_code_irg();
-    res->value = new_Const(mode_P_mach, new_tarval_from_entity(res, mode_P_mach));
+    res->value = new_SymConst(sym, symconst_addr_ent);
     current_ir_graph = rem;
   } else {
     res->variability = variability_uninitialized;
@@ -488,7 +490,9 @@ ir_node *copy_const_value(ir_node *n) {
   case iro_Const:
     nn = new_Const(m, get_Const_tarval(n)); break;
   case iro_SymConst:
-    nn = new_SymConst(get_SymConst_type_or_id(n), get_SymConst_kind(n)); break;
+
+    nn = new_SymConst(get_SymConst_type_or_id(n), get_SymConst_kind(n));
+    break;
   case iro_Add:
     nn = new_Add(copy_const_value(get_Add_left(n)),
          copy_const_value(get_Add_right(n)), m); break;
index 9d5fb48..1aa70de 100644 (file)
@@ -165,8 +165,8 @@ static void start_type_walk(ir_node *node, void *env) {
 
   switch (get_irn_opcode(node)) {  /* node label */
   case iro_SymConst:
-    if (   (get_SymConst_kind(node) == type_tag)
-          || (get_SymConst_kind(node) == size))
+    if (   (get_SymConst_kind(node) ==symconst_type_tag)
+          || (get_SymConst_kind(node) ==symconst_size))
       type_walk_2((type_or_ent *)get_SymConst_type(node), pre, post, envi);
     break;
   case iro_Sel:
index 7b633ed..330b941 100644 (file)
@@ -404,7 +404,9 @@ long double tarval_to_double(tarval *tv)
 }
 
 /* The tarval represents the address of the entity.  As the address must
-   be constant the entity must have as owner the global type. */
+   be constant the entity must have as owner the global type.
+ * We no more support this function: Use the new SymConst instead.
+ */
 tarval *new_tarval_from_entity (entity *ent, ir_mode *mode)
 {
   ANNOUNCE();
@@ -413,6 +415,8 @@ tarval *new_tarval_from_entity (entity *ent, ir_mode *mode)
 
   return get_tarval((void *)ent, 0, mode);
 }
+
+
 int tarval_is_entity(tarval *tv)
 {
   ANNOUNCE();
@@ -1470,32 +1474,32 @@ int tarval_snprintf(char *buf, size_t len, tarval *tv)
       break;
 
     case irms_reference:
-      if (tv==tarval_P_void) return snprintf(buf, len, "NULL");
+      if (tv == tarval_P_void) return snprintf(buf, len, "NULL");
       if (tv->value != NULL)
-        if (tarval_is_entity(tv)) {
-          if (get_entity_peculiarity((entity *)tv->value) != peculiarity_description)
-            return snprintf(buf, len, "%s%s%s", prefix, get_entity_ld_name((entity *)tv->value), suffix);
-          else {
-        if (mode_info->mode_output == TVO_NATIVE)
-              return snprintf(buf, len, "NULL");
-        else
-              return snprintf(buf, len, "0");
-      }
-    }
-        else {
-      if (size > tv->length) {
-        memcpy(buf, tv->value, tv->length);
-        buf[tv->length] = '\0';
-      }
-      else {
-        /* truncated */
-        memcpy(buf, tv->value, size-1);
-        buf[size-1] = '\0';
-      }
-          return tv->length;
-    }
+       if (tarval_is_entity(tv)) {
+         if (get_entity_peculiarity((entity *)tv->value) != peculiarity_description)
+           return snprintf(buf, len, "%s%s%s", prefix, get_entity_ld_name((entity *)tv->value), suffix);
+         else {
+           if (mode_info->mode_output == TVO_NATIVE)
+             return snprintf(buf, len, "NULL");
+           else
+             return snprintf(buf, len, "0");
+         }
+       }
+       else {
+         if (len > tv->length) {
+           memcpy(buf, tv->value, tv->length);
+           buf[tv->length] = '\0';
+         }
+         else {
+           /* truncated */
+           memcpy(buf, tv->value, len-1);
+           buf[len-1] = '\0';
+         }
+         return tv->length;
+       }
       else
-        return snprintf(buf, len, "void");
+       return snprintf(buf, len, "void");
 
     case irms_internal_boolean:
       switch (mode_info->mode_output) {
index 1eeab60..ab2feb7 100644 (file)
@@ -217,6 +217,7 @@ int tarval_is_double(tarval *tv);
  * Construct a tarval that represents the address of the entity.
  *
  * The address must be constant, the entity must have as owner the global type.
+ * We no more support this function: Use the new SymConst instead.
  */
 tarval *new_tarval_from_entity (entity *ent, ir_mode *mode);