* Copyright: (c) 1998-2003 Universität Karlsruhe
* Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
*/
-# ifndef _IRNODE_H_
-# define _IRNODE_H_
+#ifndef _IRNODE_H_
+#define _IRNODE_H_
#include <stddef.h>
-# include "irgraph.h"
-# include "entity.h"
-# include "firm_common.h"
-# include "irop.h"
-# include "irmode.h"
-# include "type.h"
-# include "irextbb.h"
-# include "dbginfo.h"
+#include "irgraph.h"
+#include "entity.h"
+#include "firm_common.h"
+#include "irop.h"
+#include "irmode.h"
+#include "type.h"
+#include "irextbb.h"
+#include "dbginfo.h"
/**
* @file irnode.h
*
* Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
* from Start. If so returns frame type, else Null. */
-type *is_frame_pointer(ir_node *n);
+ir_type *is_frame_pointer(ir_node *n);
/** Test whether arbitrary node is globals pointer.
*
* Test whether arbitrary node is globals pointer, i.e. Proj(pn_Start_P_globals)
* from Start. If so returns global type, else Null. */
-type *is_globals_pointer(ir_node *n);
+ir_type *is_globals_pointer(ir_node *n);
/** Test whether arbitrary node is value arg base.
*
void set_Block_cfgpred (ir_node *node, int pos, ir_node *pred);
/** Get the predecessor block.
*
- * Returns the block corresonding to the predecessor pos of block.
+ * Returns the block corresponding to the predecessor pos of block.
*
* There are several ambiguities we resolve with this function:
* - The direct predecessor can be a Proj, which is not pinned.
* Start, but the Bad node.
*/
ir_node *get_Block_cfgpred_block(ir_node *node, int pos);
-bool get_Block_matured (ir_node *node);
-void set_Block_matured (ir_node *node, bool matured);
+int get_Block_matured (ir_node *node);
+void set_Block_matured (ir_node *node, int matured);
/** A visited flag only for block nodes.
* @see also: get_irn_visited() inc_irg_visited() inc_irg_block_visited()*/
ir_node *get_Return_res (ir_node *node, int pos);
void set_Return_res (ir_node *node, int pos, ir_node *res);
-ir_node *get_Raise_mem (ir_node *node);
-void set_Raise_mem (ir_node *node, ir_node *mem);
-ir_node *get_Raise_exo_ptr (ir_node *node); /* PoinTeR to EXception Object */
-void set_Raise_exo_ptr (ir_node *node, ir_node *exoptr);
-
-/**
- * Projection numbers for Raise.
- */
-typedef enum {
- pn_Raise_X, /**< Execution result. */
- pn_Raise_M, /**< Memory result. */
- pn_Raise_max /**< number of projections from a Raise */
-} pn_Raise; /* Projection numbers for Raise. */
-
typedef enum {
CNST_NULL = 0, /**< The node is a const(0). */
CNST_ONE = +1, /**< The node is a const(1). */
/** Returns the source language type of a Const node.
* Must be an atomic type. Mode of type must be mode of node.
*/
-type *get_Const_type (ir_node *node);
+ir_type *get_Const_type (ir_node *node);
/** Sets the source language type of a Const node. */
-void set_Const_type (ir_node *node, type *tp);
+void set_Const_type (ir_node *node, ir_type *tp);
/** This enum names the three different kinds of symbolic Constants
represented by SymConst. The content of the attribute type_or_id
*
* This union contains the symbolic information represented by the node. */
union symconst_symbol {
- type *type_p;
- ident *ident_p;
- entity *entity_p;
+ ir_type *type_p;
+ ident *ident_p;
+ entity *entity_p;
};
typedef union symconst_symbol symconst_symbol;
void set_SymConst_kind (ir_node *node, symconst_kind num);
/** 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);
+ir_type *get_SymConst_type (ir_node *node);
+void set_SymConst_type (ir_node *node, ir_type *tp);
/** Only to access SymConst of kind addr_name. Else assertion: */
ident *get_SymConst_name (ir_node *node);
/** Access the type of the value represented by the SymConst.
*
* Example: primitive type int for SymConst size. */
-type *get_SymConst_value_type (ir_node *node);
-void set_SymConst_value_type (ir_node *node, type *tp);
+ir_type *get_SymConst_value_type (ir_node *node);
+void set_SymConst_value_type (ir_node *node, ir_type *tp);
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);
-/** InstOf access */
-type *get_InstOf_ent (ir_node *node);
-void set_InstOf_ent (ir_node *node, type *ent);
-ir_node *get_InstOf_store (ir_node *node);
-void set_InstOf_store (ir_node *node, ir_node *obj);
-ir_node *get_InstOf_obj (ir_node *node);
-void set_InstOf_obj (ir_node *node, ir_node *obj);
-
/**
* Projection numbers for result of Call node: use for Proj nodes!
*/
/** Sets the call parameter at position pos. */
void set_Call_param (ir_node *node, int pos, ir_node *param);
/** Gets the type of a call. */
-type *get_Call_type (ir_node *node);
+ir_type *get_Call_type (ir_node *node);
/** Sets the type of a call. */
-void set_Call_type (ir_node *node, type *tp);
+void set_Call_type (ir_node *node, ir_type *tp);
/** Gets the arity of a call. Identical to get_Call_n_params(). */
int get_Call_arity (ir_node *node);
*/
ir_node *get_Cast_op (ir_node *node);
void set_Cast_op (ir_node *node, ir_node *op);
-type *get_Cast_type (ir_node *node);
-void set_Cast_type (ir_node *node, type *to_tp);
+ir_type *get_Cast_type (ir_node *node);
+void set_Cast_type (ir_node *node, ir_type *to_tp);
/** Checks for upcast.
*
void set_Alloc_mem (ir_node *node, ir_node *mem);
ir_node *get_Alloc_size (ir_node *node);
void set_Alloc_size (ir_node *node, ir_node *size);
-type *get_Alloc_type (ir_node *node);
-void set_Alloc_type (ir_node *node, type *tp);
+ir_type *get_Alloc_type (ir_node *node);
+void set_Alloc_type (ir_node *node, ir_type *tp);
/** The allocation place. */
typedef enum {
void set_Free_ptr (ir_node *node, ir_node *ptr);
ir_node *get_Free_size (ir_node *node);
void set_Free_size (ir_node *node, ir_node *size);
-type *get_Free_type (ir_node *node);
-void set_Free_type (ir_node *node, type *tp);
+ir_type *get_Free_type (ir_node *node);
+void set_Free_type (ir_node *node, ir_type *tp);
where_alloc get_Free_where (ir_node *node);
void set_Free_where (ir_node *node, where_alloc where);
/** Returns the source language type of a Proj node.
* Must be an atomic type. Mode of type must be mode of node.
*/
-type *get_Proj_type (ir_node *node);
+ir_type *get_Proj_type (ir_node *node);
/** Return the predecessor of a Proj node. */
ir_node *get_Proj_pred (const ir_node *node);
pn_Cmp get_Confirm_cmp (ir_node *node);
void set_Confirm_cmp (ir_node *node, pn_Cmp cmp);
+/*
+ * Mux Support: Note that Psi nodes with one condition can be handled
+ * like Mux nodes, and the access functions work as expected.
+ */
ir_node *get_Mux_sel (ir_node *node);
void set_Mux_sel (ir_node *node, ir_node *sel);
ir_node *get_Mux_false (ir_node *node);
ir_node *get_Mux_true (ir_node *node);
void set_Mux_true (ir_node *node, ir_node *ir_true);
+ir_node *get_Psi_cond (ir_node *node, int pos);
+void set_Psi_cond (ir_node *node, int pos, ir_node *cond);
+ir_node *get_Psi_val (ir_node *node, int pos);
+void set_Psi_val (ir_node *node, int pos, ir_node *val);
+ir_node *get_Psi_default(ir_node *node);
+void set_Psi_default(ir_node *node, ir_node *val);
+int get_Psi_n_conds(ir_node *node);
+
+/**
+ * Projection numbers for result of CopyB node: use for Proj nodes!
+ */
+typedef enum {
+ pn_CopyB_M_regular = 0, /**< The memory result. */
+ pn_CopyB_X_except = 1, /**< The control flow result branching to the exception handler */
+ pn_CopyB_M_except = 2, /**< The memory result in case the runtime function terminated with
+ an exception */
+ pn_CopyB_max = 3 /**< number of projections from a CopyB */
+} pn_CopyB; /* Projection numbers for CopyB. */
+#define pn_CopyB_M pn_CopyB_M_regular
+
+ir_node *get_CopyB_mem (ir_node *node);
+void set_CopyB_mem (ir_node *node, ir_node *mem);
+ir_node *get_CopyB_dst (ir_node *node);
+void set_CopyB_dst (ir_node *node, ir_node *dst);
+ir_node *get_CopyB_src (ir_node *node);
+void set_CopyB_src (ir_node *node, ir_node *src);
+ir_type *get_CopyB_type(ir_node *node);
+void set_CopyB_type(ir_node *node, ir_type *data_type);
+
+/**
+ * Projection numbers for result of InstOf node: use for Proj nodes!
+ */
+typedef enum {
+ pn_InstOf_M_regular = 0, /**< The memory result. */
+ pn_InstOf_X_except = 1, /**< The control flow result branching to the exception handler */
+ pn_InstOf_res = 2, /**< The checked object pointer. */
+ pn_InstOf_M_except = 3, /**< The memory result in case the runtime function terminated with
+ an exception */
+ pn_InstOf_max = 4 /**< number of projections from an InstOf */
+} pn_InstOf;
+#define pn_InstOf_M pn_InstOf_M_regular
+
+/** InstOf access */
+ir_type *get_InstOf_type (ir_node *node);
+void set_InstOf_type (ir_node *node, ir_type *type);
+ir_node *get_InstOf_store (ir_node *node);
+void set_InstOf_store (ir_node *node, ir_node *obj);
+ir_node *get_InstOf_obj (ir_node *node);
+void set_InstOf_obj (ir_node *node, ir_node *obj);
+
+/**
+ * Projection numbers for Raise.
+ */
+typedef enum {
+ pn_Raise_X = 0, /**< The control flow to the exception handler. */
+ pn_Raise_M = 1, /**< The Memory result. */
+ pn_Raise_max /**< number of projections from a Raise */
+} pn_Raise; /* Projection numbers for Raise. */
+
+ir_node *get_Raise_mem (ir_node *node);
+void set_Raise_mem (ir_node *node, ir_node *mem);
+ir_node *get_Raise_exo_ptr (ir_node *node); /* PoinTeR to EXception Object */
+void set_Raise_exo_ptr (ir_node *node, ir_node *exoptr);
+
+/**
+ * Projection numbers for result of Bound node: use for Proj nodes!
+ */
+typedef enum {
+ pn_Bound_M_regular = 0, /**< The memory result. */
+ pn_Bound_X_except = 1, /**< The control flow result branching to the exception handler */
+ pn_Bound_res = 2, /**< The checked index. */
+ pn_Bound_M_except = 3, /**< The memory result in case the runtime function terminated with
+ an exception */
+ pn_Bound_max = 4 /**< number of projections from a Bound */
+} pn_Bound;
+#define pn_Bound_M pn_Bound_M_regular
+
+/** Returns the memory input of a Bound operation. */
+ir_node *get_Bound_mem(ir_node *bound);
+void set_Bound_mem (ir_node *bound, ir_node *mem);
+
+/** Returns the index input of a Bound operation. */
+ir_node *get_Bound_index(ir_node *bound);
+void set_Bound_index(ir_node *bound, ir_node *idx);
+
+/** Returns the lower bound input of a Bound operation. */
+ir_node *get_Bound_lower(ir_node *bound);
+void set_Bound_lower(ir_node *bound, ir_node *lower);
+
+/** Returns the upper bound input of a Bound operation. */
+ir_node *get_Bound_upper(ir_node *bound);
+void set_Bound_upper(ir_node *bound, ir_node *upper);
/*
*
/** 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_Id (ir_node *node); /* Same as skip_nop. */
+ir_node *skip_Id (ir_node *node); /* Old name is skip_nop(). */
/** returns corresponding operand of Tuple if node is a Proj from
a Tuple. */
ir_node *skip_Tuple (ir_node *node);
int is_no_Block (const ir_node *node);
/** returns true if the node is a Block */
int is_Block (const ir_node *node);
-/** returns true if node is a Unknown node. */
+/** returns true if node is an Unknown node. */
int is_Unknown (const ir_node *node);
+/** returns true if node is a Return node. */
+int is_Return (const ir_node *node);
+/** returns true if node is a Call node. */
+int is_Call (const ir_node *node);
+/** returns true if node is a Sel node. */
+int is_Sel (const ir_node *node);
+/** returns true if node is a Mux node or a Psi with only one condition. */
+int is_Mux (const ir_node *node);
/** returns true if node is a Proj node or a Filter node in
* intraprocedural view */
int is_Proj (const ir_node *node);
/** Return the type associated with the value produced by n
* if the node remarks this type as it is the case for
- * Cast, Const, SymConst and some Proj nodes. */
-type *get_irn_type(ir_node *n);
+ * Cast, Const, SymConst and some Proj nodes or unknown_type. */
+ir_type *get_irn_type(ir_node *n);
+
+/** Return the type attribute of a node n (SymConst, Call, Alloc, Free,
+ Cast) or NULL.*/
+ir_type *get_irn_type_attr(ir_node *n);
+
+/** Return the entity attribute of a node n (SymConst, Sel) or NULL. */
+entity *get_irn_entity_attr(ir_node *n);
/** Returns non-zero for constant-like nodes. */
int is_irn_constlike(const ir_node *node);
+/**
+ * Returns non-zero for nodes that are allowed to have keep-alives and
+ * are neither Block nor PhiM.
+ */
+int is_irn_keep(const ir_node *node);
+
+/**
+ * Returns non-zero for nodes that are machine operations.
+ */
+int is_irn_machine_op(const ir_node *node);
+
+/**
+ * Returns non-zero for nodes that are machine operands.
+ */
+int is_irn_machine_operand(const ir_node *node);
+
+/**
+ * Returns non-zero for nodes that have the n'th user machine flag set.
+ */
+int is_irn_machine_user(const ir_node *node, unsigned n);
+
/**
* A type to express conditional jump predictions.
*/
*/
void *get_irn_generic_attr(ir_node *node);
+/**
+ * Returns the unique node index for the node in its graph.
+ * This index is used to access phase information for this node.
+ */
+unsigned get_irn_idx(const ir_node *node);
+
/*-----------------------------------------------------------------*/
/** Debug aides **/
/*-----------------------------------------------------------------*/
void dump_irn(ir_node *n);
#include "ident.h"
+#include <stdio.h>
#ifdef __GNUC__
/* GNU C has the __FUNCTION__ extension */
}
#endif
-# endif /* _IRNODE_H_ */
+#endif /* _IRNODE_H_ */