-/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
-* All rights reserved.
-*/
-
-/* $Id$ */
+/*
+ * Project: libFIRM
+ * File name: ir/ir/ircons.h
+ * Purpose: Various irnode constructors. Automatic construction
+ * of SSA representation.
+ * Author: Martin Trapp, Christian Schaefer
+ * Modified by: Goetz Lindenmaier, Boris Boesler
+ * Created:
+ * CVS-ID: $Id$
+ * Copyright: (c) 1998-2003 Universität Karlsruhe
+ * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
+ */
/**
@todo
/**
* @file ircons.h
*
+ * documentation no more supported since 2001
+ *
* ir node construction.
*
* @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier
* 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);
- * ir_node *new_InstOf (ir_node *store, ir_node *objptr, type *ent);
* ir_node *new_Call (ir_node *store, ir_node *callee, int arity,
* ir_node **in, type_method *type);
* ir_node *new_Add (ir_node *op1, ir_node *op2, ir_mode *mode);
* ir_node *new_Rot (ir_node *op, ir_node *k, ir_mode *mode);
* ir_node *new_Cmp (ir_node *op1, ir_node *op2);
* ir_node *new_Conv (ir_node *op, ir_mode *mode);
+ * ir_node *new_Cast (ir_node *op, type *to_tp);
* ir_node *new_Load (ir_node *store, ir_node *addr);
* ir_node *new_Store (ir_node *store, ir_node *addr, ir_node *val);
* ir_node *new_Alloc (ir_node *store, ir_node *size, type *alloc_type,
* --------------------------------------------
*
* 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
ir_node *store, int arity, ir_node *in[]);
ir_node *new_rd_Raise (dbg_info *db, ir_graph *irg, ir_node *block,
ir_node *store, ir_node *obj);
+ir_node *new_rd_Const_type (dbg_info* db, ir_graph *irg, ir_node *block,
+ ir_mode *mode, tarval *con, type *tp);
ir_node *new_rd_Const (dbg_info *db, ir_graph *irg, ir_node *block,
ir_mode *mode, tarval *con);
ir_node *new_rd_SymConst (dbg_info *db, ir_graph *irg, ir_node *block,
ir_node *op, ir_node *k, ir_mode *mode);
ir_node *new_rd_Conv (dbg_info *db, ir_graph *irg, ir_node *block,
ir_node *op, ir_mode *mode);
+ir_node *new_rd_Cast (dbg_info* db, ir_graph *irg, ir_node *block,
+ ir_node *op, type *to_tp);
ir_node *new_rd_Phi (dbg_info *db, ir_graph *irg, ir_node *block, int arity,
ir_node *in[], ir_mode *mode);
ir_node *new_rd_Load (dbg_info *db, ir_graph *irg, ir_node *block,
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);
ir_node *op, ir_node *k, ir_mode *mode);
ir_node *new_r_Conv (ir_graph *irg, ir_node *block,
ir_node *op, ir_mode *mode);
+ir_node *new_r_Cast (ir_graph *irg, ir_node *block,
+ ir_node *op, type *to_tp);
ir_node *new_r_Phi (ir_graph *irg, ir_node *block, int arity,
ir_node *in[], ir_mode *mode);
ir_node *new_r_Load (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);
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[]);
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);
ir_node *new_d_Const (dbg_info* db, ir_mode *mode, tarval *con);
ir_node *new_d_SymConst (dbg_info* db, type_or_id_p value, symconst_kind kind);
ir_node *new_d_simpleSel(dbg_info* db, ir_node *store, ir_node *objptr, entity *ent);
ir_node *new_d_Rot (dbg_info* db, ir_node *op, ir_node *k, ir_mode *mode);
ir_node *new_d_Cmp (dbg_info* db, ir_node *op1, ir_node *op2);
ir_node *new_d_Conv (dbg_info* db, ir_node *op, ir_mode *mode);
+ir_node *new_d_Cast (dbg_info* db, ir_node *op, type *to_tp);
ir_node *new_d_Phi (dbg_info* db, int arity, ir_node *in[], ir_mode *mode);
ir_node *new_d_Load (dbg_info* db, ir_node *store, ir_node *addr);
ir_node *new_d_Store (dbg_info* db, ir_node *store, ir_node *addr, ir_node *val);
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);
-ir_node *new_InstOf (ir_node *store, ir_node *objptr, type *ent);
ir_node *new_Call (ir_node *store, ir_node *callee, int arity, ir_node *in[],
type *tp);
ir_node *new_CallBegin(ir_node *callee);
ir_node *new_Rot (ir_node *op, ir_node *k, ir_mode *mode);
ir_node *new_Cmp (ir_node *op1, ir_node *op2);
ir_node *new_Conv (ir_node *op, ir_mode *mode);
+ir_node *new_Cast (ir_node *op, type *to_tp);
ir_node *new_Phi (int arity, ir_node *in[], ir_mode *mode);
ir_node *new_Load (ir_node *store, ir_node *addr);
ir_node *new_Store (ir_node *store, ir_node *addr, ir_node *val);
/* --- 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_ */