typedef struct ir_node ir_node;
#endif
+#ifdef __cplusplus
+ extern "C" {
+
+#endif
+
/**
* you can work on the graph without considering the different types
* of nodes, it's just a big graph.
void *get_irn_link (const ir_node *node);
/** Returns the ir_graph this node belongs to. Only valid if irg
- * is in state pinned (irg is only stored in the block. */
+ * is in state op_pin_state_pinned (irg is only stored in the block. */
ir_graph *get_irn_irg (ir_node *node);
/** Outputs a unique number for this node if libFIRM is compiled for
* access routines that work for all nodes we use infix "nodes" and do not
* name this function get_irn_block. */
#define get_nodes_block get_nodes_Block
-ir_node *get_nodes_Block (ir_node *node);
+ir_node *get_nodes_block (ir_node *node);
#define set_nodes_block set_nodes_Block
-void set_nodes_Block (ir_node *node, ir_node *block);
+void set_nodes_block (ir_node *node, ir_node *block);
/**
* @function get_irn_block
type of this method. */
} pn_Start; /* Projection numbers for Start. */
-/**
- * Projection numbers for result of Start node: use for Proj nodes!
- * @remark This is the old name convention, don't use anymore.
- */
-typedef enum {
- pns_initial_exec, /**< Projection on an executable, the initial control
- flow. */
- pns_global_store, /**< Projection on the global store */
- pns_frame_base, /**< Projection on the frame base */
- pns_globals, /**< Projection on the pointer to the data segment
- containing _all_ global entities. */
- pns_args, /**< Projection on all arguments */
- pns_value_arg_base /**< Pointer to region of compound value arguments as defined by
- type of this method. */
-} pns_number; /* pns: Projection Number Start */
/** Test whether arbitrary node is frame pointer.
*
/* @@@ no more supported */
ir_node **get_Block_cfgpred_arr (ir_node *node);
-int get_Block_n_cfgpreds (ir_node *node);
+int get_Block_n_cfgpreds (ir_node *node);
ir_node *get_Block_cfgpred (ir_node *node, int pos);
void set_Block_cfgpred (ir_node *node, int pos, ir_node *pred);
bool get_Block_matured (ir_node *node);
/* frees the memory. */
void remove_Block_cg_cfgpred_arr(ir_node * node);
-/* Start references the irg it is in.
- @@@ old -- use get_irn_irg instead! */
-ir_graph *get_Start_irg(ir_node *node);
-
int get_End_n_keepalives(ir_node *end);
ir_node *get_End_keepalive(ir_node *end, int pos);
void add_End_keepalive (ir_node *end, ir_node *ka);
free_End frees these data structures. */
void free_End (ir_node *end);
-/* @@@ old -- use get_irn_irg instead! */
-ir_graph *get_EndReg_irg (ir_node *end);
-ir_graph *get_EndExcept_irg (ir_node *end);
/* We distinguish three kinds of Cond nodes. These can be distinguished
by the mode of the selector operand and an internal flag of type cond_kind.
represented by SymConst. The content of the attribute type_or_id
depends on this tag. Use the proper access routine after testing
this flag. */
+
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 *. */
+ 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;
+ ident *ident_p;
+ entity *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: */
-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);
+
+/** Only to access SymConst of kind addr_name. Else assertion: */
+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. */
+/* write 'union': firmjni then does not create a method... */
+union symconst_symbol get_SymConst_symbol (ir_node *node);
+void set_SymConst_symbol (ir_node *node,
+ union symconst_symbol sym);
ir_node *get_Sel_mem (ir_node *node);
void set_Sel_mem (ir_node *node, ir_node *mem);
entity *get_Sel_entity (ir_node *node); /* entity to select */
void set_Sel_entity (ir_node *node, entity *ent);
-/**
- * Projection numbers for result of Call node: use for Proj nodes!
- *
- * @remark old name convention!
- */
-typedef enum {
- pncl_memory = 0, /**< The memory result. */
- pncl_exc_target = 1, /**< The control flow result branching to the exception handler */
- pncl_result_tuple = 2, /**< The tuple containing all (0, 1, 2, ...) results */
- pncl_exc_memory = 3, /**< The memory result in case the called method terminated with
- an exception */
- pncl_value_res_base = 4 /**< A pointer to the memory region containing copied results
- passed by value (for compound result types). */
-} pncl_number; /* pncl: Projection Number CaLl */
-
/**
* Projection numbers for result of Call node: use for Proj nodes!
*/
pn_Call_P_value_res_base = 4,/**< A pointer to the memory region containing copied results
passed by value (for compound result types). */
pn_Call_X_except = 1, /**< The control flow result branching to the exception handler */
- pn_Call_M_except = 3 /**< The memory result in case the called method terminated with
+ pn_Call_M_except = 3, /**< The memory result in case the called method terminated with
an exception */
+ pn_Call_max = 5 /**< number of prejections from a Call */
} pn_Call; /* Projection numbers for Call. */
ir_node *get_Call_mem (ir_node *node);
ir_node *get_CallBegin_ptr (ir_node *node);
void set_CallBegin_ptr (ir_node *node, ir_node *ptr);
-/* @@@ old -- use get_irn_irg instead! */
-ir_graph *get_CallBegin_irg (ir_node *node);
ir_node *get_CallBegin_call (ir_node *node);
void set_CallBegin_call (ir_node *node, ir_node *call);
type *get_Cast_type (ir_node *node);
void set_Cast_type (ir_node *node, type *to_tp);
-/* Returns true if n is Phi or Filter in interprocedural_view. */
+/** Returns true if n is Phi or Filter in interprocedural_view.
+ Returns false if irg in phase building and the Phi has zero
+ predecessors: it's a Phi0. */
int is_Phi (ir_node *n);
+/** Returns true if irg in phase building and the Phi has zero
+ predecessors: it's a Phi0. */
+int is_Phi0 (ir_node *n);
/* These routines also work for Filter nodes in interprocedural view. */
ir_node **get_Phi_preds_arr (ir_node *node);
int get_Phi_n_preds (ir_node *node);
void set_Filter_proj(ir_node *node, long proj);
/* set the interprocedural predecessors, ...d_arr uses current_ir_graph.
* @@@ Maybe better: arity is zero if no cg preds. */
-void set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in);
-void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred);
-int get_Filter_n_cg_preds(ir_node *node);
-ir_node * get_Filter_cg_pred(ir_node *node, int pos);
+void set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in);
+void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred);
+int get_Filter_n_cg_preds(ir_node *node);
+ir_node *get_Filter_cg_pred(ir_node *node, int pos);
/**
* Projection numbers for Load: use for Proj nodes!
ir_node *get_Proj_pred (ir_node *node);
void set_Proj_pred (ir_node *node, ir_node *pred);
-/* Why long? shouldn't int be enough, and smaller? Or even byte? */
long get_Proj_proj (ir_node *node);
void set_Proj_proj (ir_node *node, long proj);
/** returns operand of node if node is a Proj. */
ir_node *skip_Proj (ir_node *node);
/** returns operand of node if node is a Id */
-ir_node *skip_nop (ir_node *node);
ir_node *skip_Id (ir_node *node); /* Same as skip_nop. */
/* returns corresponding operand of Tuple if node is a Proj from
a Tuple. */
Start, End, Jmp, Cond, Return, Raise, Bad, CallBegin, EndReg, EndExcept */
int is_cfop(ir_node *node);
-/* @@@ old -- use get_irn_irg instead! */
-ir_graph *get_ip_cfop_irg(ir_node *n);
-
/** Returns true if the operation manipulates interprocedural control flow:
CallBegin, EndReg, EndExcept */
int is_ip_cfop(ir_node *node);
/** Returns the memory operand of fragile operations. */
ir_node *get_fragile_op_mem(ir_node *node);
+/*-----------------------------------------------------------------*/
+/** Debug aides **/
+/*-----------------------------------------------------------------*/
+
+
+/** Debug print the node.
+ *
+ * Writes the node, all its attributes and the predecessors to stdout if DEBUG_libfirm
+ * is set. Else does nothing. */
+void dump_irn(ir_node *n);
+
#include "ident.h"
#ifdef __GNUC__
/** Output information about an entity and its owner */
#define DDMEO(X) printf("%s(l.%i) %s (own: %s): %ld (%p)\n", __MYFUNC__, __LINE__, get_entity_name(X), get_type_name(get_entity_owner(X)), get_entity_nr(X), (void *)(X))
/** Output information about a graph */
-#define DDMG(X) printf("%s(l.%i) %s: %ld (%p)\n", __MYFUNC__, __LINE__, get_entity_name(get_irg_ent(X)), get_irg_graph_nr(X), (void *)(X))
+#define DDMG(X) printf("%s(l.%i) %s: %ld (%p)\n", __MYFUNC__, __LINE__, get_entity_name(get_irg_entity(X)), get_irg_graph_nr(X), (void *)(X))
/** Output information about an ident */
-#define DDMI(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, id_to_str(X), (void *)(X))
+#define DDMI(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, get_id_str(X), (void *)(X))
/** Output information about a mode */
#define DDMM(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, get_mode_name(X), (void *)(X))
/** Output information about a loop */
/*@}*/ /* end of ir_node group definition */
+#ifdef __cplusplus
+}
+#endif
+
# endif /* _IRNODE_H_ */