/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
-** All rights reserved.
-**
-** Authors: Martin Trapp, Christian Schaefer
-**
-** declarations of an ir node
+* All rights reserved.
+*
+* Authors: Martin Trapp, Christian Schaefer
+*
+* declarations of an ir node
*/
+/* $Id$ */
+
# ifndef _IRNODE_T_H_
# define _IRNODE_T_H_
# include "irnode.h"
# include "xprintf.h"
# include "irop_t.h"
+# include "firm_common_t.h"
+# include "irdom_t.h" /* For size of struct dom_info. */
+# include "dbginfo.h"
+
+# include "exc.h"
/** ir node attributes **/
+
/* Block attributes */
typedef struct {
unsigned long block_visited; /* for the walker that walks over all blocks. */
/* Attributes private to construction: */
bool matured; /* if set, all in-nodes of the block are fixed */
struct ir_node **graph_arr; /* array to store all parameters */
+ struct dom_info dom; /* Datastructure that holds information about dominators.
+ @@@ Eventually overlay with graph_arr as only valid
+ in different phases. Eventually inline the whole
+ datastructure. */
+ exc_t exc; /* role of this block for exception handling */
+ ir_node *handler_entry; /* handler entry block iff this block is part of a region */
+ ir_node ** in_cg; /* array with predecessors in
+ * interprocedural_view, if they differ
+ * from intraprocedural predecessors */
+ int *backedge; /* Field n set to true if pred n is backedge.
+ @@@ Ev. replace by bitfield! */
+ int *cg_backedge; /* Field n set to true if pred n is interprocedural backedge.
+ @@@ Ev. replace by bitfield! */
} block_attr;
+/* Cond attributes */
+typedef struct {
+ cond_kind kind; /* flavor of Cond */
+ long default_proj; /* for optimization: biggest Proj number, i.e. the one
+ used for default. */
+} cond_attr;
+
/* SymConst attributes */
/* This union contains the symbolic information represented by the node */
typedef union type_or_id {
/* Sel attributes */
typedef struct {
entity *ent; /* entity to select */
- linkage_type ltyp; /* linkage type of the entity */
} sel_attr;
+typedef struct {
+ type *cld_tp; /* type of called procedure */
+#if PRECISE_EXC_CONTEXT
+ struct ir_node **frag_arr; /* For Phi node construction in case of exceptions */
+#endif
+ entity ** callee_arr; /* result of callee analysis */
+} call_attr;
+
/* Alloc attributes */
typedef struct {
type *type; /* Type of the allocated object. */
where_alloc where; /* stack, heap or other managed part of memory */
+#if PRECISE_EXC_CONTEXT
+ struct ir_node **frag_arr; /* For Phi node construction in case of exceptions */
+#endif
} alloc_attr;
+/* InstOf attributes */
+typedef struct
+{
+ type *ent;
+ int dfn;
+} io_attr;
+
+/* Filter attributes */
+typedef struct {
+ long proj; /* contains the result position to project (Proj) */
+ ir_node ** in_cg; /* array with interprocedural predecessors (Phi) */
+ int *backedge; /* Field n set to true if pred n is backedge.
+ @@@ Ev. replace by bitfield! */
+} filter_attr;
+
+/* EndReg/EndExcept attributes */
+typedef struct {
+ ir_graph * irg; /* ir_graph this node belongs to (for
+ * navigating in interprocedural graphs) */
+} end_attr;
+
+/* CallBegin attributes */
+typedef struct {
+ ir_graph * irg; /* ir_graph this node belongs to (for
+ * navigating in interprocedural graphs) */
+ ir_node * call; /* associated Call-operation */
+} callbegin_attr;
+
/* Some irnodes just have one attribute, these are stored here,
some have more. Their name is 'irnodename_attr' */
typedef union {
block_attr block; /* For Block: Fields needed to construct it */
+ cond_attr c; /* For Cond. */
struct tarval *con; /* For Const: contains the value of the constant */
symconst_attr i; /* For SymConst. */
sel_attr s; /* For Sel. */
- type *call; /* For Call: pointer to the type of the method to call */
- long proj; /* For Proj: contains the result position to project */
+ call_attr call; /* For Call: pointer to the type of the method to call */
+ callbegin_attr callbegin; /* For CallBegin */
alloc_attr a; /* For Alloc. */
+ io_attr io; /* For InstOf */
type *f; /* For Free. */
- cond_kind c; /* For Cond. */
int phi0_pos; /* For Phi. Used to remember the value defined by
this Phi node. Needed when the Phi is completed
to call get_r_internal_value to find the
predecessors. If this attribute is set, the Phi
node takes the role of the obsolete Phi0 node,
therefore the name. */
+ int *phi_backedge; /* For Phi after construction.
+ Field n set to true if pred n is backedge.
+ @@@ Ev. replace by bitfield! */
+ long proj; /* For Proj: contains the result position to project */
+ filter_attr filter; /* For Filter */
+ end_attr end; /* For EndReg, EndExcept */
+#if PRECISE_EXC_CONTEXT
+ struct ir_node **frag_arr; /* For Phi node construction in case of exceptions
+ for nodes Store, Load, Div, Mod, Quot, DivMod. */
+#endif
} attr;
/* if the node has some attributes, they are stored in attr */
struct ir_node {
+ /** Basics of the representation **/
firm_kind kind; /* distinguishes this node from others */
ir_op *op; /* Opcode of this node. */
ir_mode *mode; /* Mode of this node. */
unsigned long visited; /* visited counter for walks of the graph */
struct ir_node **in; /* array with predecessors / operands */
- struct ir_node *link; /* for linking nodes somehow to a list, e.g.
+ void *link; /* to attach additional information to the node, e.g.
used while construction to link Phi0 nodes and
during optimization to link to nodes that
shall replace a node. */
+ /** Fields for optimizations / analysis information **/
+ struct ir_node **out; /* array of out edges */
+ struct dbg_info* dbi; /* A pointer to information for debug support. */
+ /** For debugging **/
#ifdef DEBUG_libfirm
int node_nr; /* a unique node number for each node to make output
readable. */
/* @@@@ brauchen wir dienoch? dann fliegt ev. das xprint raus?*/
int ir_node_print (XP_PAR1, const xprintf_info *, XP_PARN);
+/* Returns the array with the ins. The content of the array may not be
+ changed. */
+ir_node **get_irn_in (ir_node *node);
/** access attributes directly **/
-inline tarval *get_irn_const_attr (ir_node *node);
-inline long get_irn_proj_attr (ir_node *node);
-inline alloc_attr get_irn_alloc_attr (ir_node *node);
-inline type *get_irn_free_attr (ir_node *node);
-inline symconst_attr get_irn_symconst_attr (ir_node *node);
+INLINE tarval *get_irn_const_attr (ir_node *node);
+INLINE long get_irn_proj_attr (ir_node *node);
+INLINE alloc_attr get_irn_alloc_attr (ir_node *node);
+INLINE type *get_irn_free_attr (ir_node *node);
+INLINE symconst_attr get_irn_symconst_attr (ir_node *node);
type *get_irn_call_attr (ir_node *node);
sel_attr get_irn_sel_attr (ir_node *node);
int get_irn_phi_attr (ir_node *node);
-block_attr get_irn_return_attr (ir_node *node);
+block_attr get_irn_block_attr (ir_node *node);
# endif /* _IRNODE_T_H_ */