From b8f363d7be29eb5702e130be3796ff7162410e6a Mon Sep 17 00:00:00 2001 From: Beyhan Date: Tue, 6 Jul 2004 12:30:50 +0000 Subject: [PATCH] new SymConst semantics [r3313] --- ir/ana/cgana.c | 56 ++- ir/ana/rta.c | 24 +- ir/common/firm.h | 10 +- ir/ir/ircons.c | 27 +- ir/ir/ircons.h | 996 ++++++++++++++++++++++++++++------------------- ir/ir/irdump.c | 15 +- ir/ir/irgopt.h | 21 +- ir/ir/irgraph.h | 7 +- ir/ir/irnode.c | 50 ++- ir/ir/irnode.h | 61 ++- ir/ir/irnode_t.h | 15 +- ir/ir/iropt.c | 4 +- ir/tr/entity.c | 8 +- ir/tr/typewalk.c | 4 +- ir/tv/tv.c | 54 +-- ir/tv/tv.h | 1 + 16 files changed, 831 insertions(+), 522 deletions(-) diff --git a/ir/ana/cgana.c b/ir/ana/cgana.c index 2df8c88fd..5af9fcebf 100644 --- a/ir/ana/cgana.c +++ b/ir/ana/cgana.c @@ -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; diff --git a/ir/ana/rta.c b/ir/ana/rta.c index b1f79e6d7..b521c7848 100644 --- a/ir/ana/rta.c +++ b/ir/ana/rta.c @@ -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 * diff --git a/ir/common/firm.h b/ir/common/firm.h index a911e9d0a..f6e2ed280 100644 --- a/ir/common/firm.h +++ b/ir/common/firm.h @@ -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 */ diff --git a/ir/ir/ircons.c b/ir/ir/ircons.c index d479d4279..ab9c65d55 100644 --- a/ir/ir/ircons.c +++ b/ir/ir/ircons.c @@ -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) { diff --git a/ir/ir/ircons.h b/ir/ir/ircons.h index c292b7e80..56cb597b9 100644 --- a/ir/ir/ircons.h +++ b/ir/ir/ircons.h @@ -325,7 +325,7 @@ * 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); @@ -1155,7 +1155,7 @@ /** 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); diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index 402998e87..a3743cd27 100644 --- a/ir/ir/irdump.c +++ b/ir/ir/irdump.c @@ -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); } diff --git a/ir/ir/irgopt.h b/ir/ir/irgopt.h index 2175030f2..45b55076d 100644 --- a/ir/ir/irgopt.h +++ b/ir/ir/irgopt.h @@ -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. diff --git a/ir/ir/irgraph.h b/ir/ir/irgraph.h index d095983cf..5281e814e 100644 --- a/ir/ir/irgraph.h +++ b/ir/ir/irgraph.h @@ -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; diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index 57ab55f07..7b25a2af4 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -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 * diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index 584dab8c9..e17a8deae 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -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); diff --git a/ir/ir/irnode_t.h b/ir/ir/irnode_t.h index 518c63c6d..f0ca0dc91 100644 --- a/ir/ir/irnode_t.h +++ b/ir/ir/irnode_t.h @@ -39,6 +39,10 @@ # 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 diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 8daff11f5..c0733b14b 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -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) diff --git a/ir/tr/entity.c b/ir/tr/entity.c index 8b11075c9..031f9d48a 100644 --- a/ir/tr/entity.c +++ b/ir/tr/entity.c @@ -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; diff --git a/ir/tr/typewalk.c b/ir/tr/typewalk.c index 9d5fb4885..1aa70deb4 100644 --- a/ir/tr/typewalk.c +++ b/ir/tr/typewalk.c @@ -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: diff --git a/ir/tv/tv.c b/ir/tv/tv.c index 7b633ed17..330b941d4 100644 --- a/ir/tv/tv.c +++ b/ir/tv/tv.c @@ -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) { diff --git a/ir/tv/tv.h b/ir/tv/tv.h index 1eeab6008..ab2feb762 100644 --- a/ir/tv/tv.h +++ b/ir/tv/tv.h @@ -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); -- 2.20.1