/* 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$ */
# 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 */
/* Sel attributes */
typedef struct {
entity *ent; /* entity to select */
- linkage_type ltyp; /* linkage type of the entity */
} sel_attr;
typedef struct {
#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 */
#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 {
symconst_attr i; /* For SymConst. */
sel_attr s; /* For Sel. */
call_attr call; /* For Call: pointer to the type of the method to call */
- long proj; /* For Proj: contains the result position to project */
+ callbegin_attr callbegin; /* For CallBegin */
alloc_attr a; /* For Alloc. */
+ io_attr io; /* For InstOf */
type *f; /* For Free. */
int phi0_pos; /* For Phi. Used to remember the value defined by
this Phi node. Needed when the Phi is completed
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_ */