* --------------------------------------------
*
* Creates a new Block with the given list of predecessors. This block
- * is mature.
+ * is mature. As other constructors calls optimization and vrfy for the
+ * block. If one of the predecessors is Unknown (as it has to be filled in
+ * later) optimizations are skipped. This is necessary to
+ * construct Blocks in loops. Leaving Unknown in the Block after finishing
+ * the construction may have strange effects, especially for interprocedural
+ * representation and analyses.
*
*
* CONTROL FLOW OPERATIONS
* datastructure don't use
* new_SymConst((type_or_id*)get_entity_ld_ident(ent), linkage_ptr_info);.
* Use a real const instead:
- * new_Const(mode_P, tarval_p_from_entity(ent));
+ * new_Const(mode_P_mach, tarval_p_from_entity(ent));
* This makes the Constant independent of name changes of the entity due to
* mangling.
*
* attr.i.*type, a pointer to a type_class. The mode of the node is mode_Is.
* if it is linkage_ptr_info it contains
* attr.i.*ptrinfo, an ident holding information for the linker. The mode
- * of the node is mode_P.
+ * of the node is mode_P_mach.
*
* ---------------
*
*
* Creates a Phi node. The in's order has to correspond to the order
* of in's of current_block. This is not checked by the library!
+ * If one of the predecessors is Unknown (as it has to be filled in
+ * later) optimizations are skipped. This is necessary to
+ * construct Phi nodes in loops. Leaving Unknown in the Phi after finishing
+ * the construction may have strange effects, especially for interprocedural
+ * representation and analyses.
*
* Parameter
* arity number of predecessors
int arity, ir_node *in[]);
ir_node *new_rd_Id (dbg_info *db, ir_graph *irg, ir_node *block,
ir_node *val, ir_mode *mode);
-ir_node *new_rd_Bad ();
-ir_node *new_rd_Unknown();
+ir_node *new_rd_Bad (ir_graph *irg);
+ir_node *new_rd_Unknown(ir_graph *irg);
ir_node *new_rd_CallBegin(dbg_info *db, ir_graph *irg, ir_node *block, ir_node *callee);
ir_node *new_rd_EndReg (dbg_info *db, ir_graph *irg, ir_node *block);
ir_node *new_rd_EndExcept(dbg_info *db, 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);
-ir_node *new_r_Bad ();
-ir_node *new_r_Unknown();
+ir_node *new_r_Bad (ir_graph *irg);
+ir_node *new_r_Unknown(ir_graph *irg);
ir_node *new_r_CallBegin(ir_graph *irg, ir_node *block, ir_node *callee);
ir_node *new_r_EndReg (ir_graph *irg, ir_node *block);
ir_node *new_r_EndExcept(ir_graph *irg, ir_node *block);
/* --- Useful access routines --- */
/** Returns the current block of the current graph. To set the current
block use switch_block(). */
-ir_node *get_cur_block();
+ir_node *get_cur_block(void);
/** Returns the frame type of the current graph */
-type *get_cur_frame_type();
+type *get_cur_frame_type(void);
/* --- initialize and finalize ir construction --- */
/** Puts the graph into state "phase_high" */
void finalize_cons (ir_graph *irg);
+/* --- Initialization --- */
+
+/**
+ * This function is called, whenever a local variable is used before definition
+ *
+ * @parameter mode the mode of the local var
+ * @pos position choosen be the frontend for this var
+ *
+ * @return a firm node of mode @p mode that initialises the var at position pos
+ *
+ * @note
+ * Do not return NULL
+ * If this function is not set, FIRM will create a const node with tarval BAD
+ */
+typedef ir_node *default_initialize_local_variable_func_t(ir_mode *mode, int pos);
+
+/**
+ * Initializes the graph construction.
+ *
+ * @param func @see default_initialize_local_variable_func_t
+ */
+void init_cons (default_initialize_local_variable_func_t *func);
# endif /* _IRCONS_H_ */