* Copyright: (c) 1998-2003 Universität Karlsruhe
* Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
*/
-
# ifndef _IRNODE_H_
# define _IRNODE_H_
#include <stddef.h>
-/**
- * Projection numbers of compare: use for Proj nodes!
- * @remark there are numbers with normalized names below!
- */
-typedef enum {
- False = 0, /**< false */
- Eq, /**< equal */
- Lt, /**< less */
- Le, /**< less or equal */
- Gt, /**< greater */
- Ge, /**< greater or equal */
- Lg, /**< less or greater */
- Leg = 7, /**< less, equal or greater = ordered */
- Uo, /**< unordered */
- Ue, /**< unordered or equal */
- Ul, /**< unordered or less */
- Ule, /**< unordered, less or equal */
- Ug, /**< unordered or greater */
- Uge, /**< unordered, greater or equal */
- Ne, /**< unordered, less or greater = not equal */
- True = 15 /**< true */
- /* not_mask = Leg*/ /* bits to flip to negate comparison * @@ hack for jni interface */
-} pnc_number; /* pnc: Projection Number Cmp */
-#define not_mask Leg
-
-# include "tv.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 "exc.h" */
/**
* @file irnode.h
Assumes that current_ir_graph is set to the graph containing "node".
"in" must contain all predecessors except the block that are required for
the nodes opcode. */
-void set_irn_in (ir_node *node, int arity,
- ir_node *in[]);
+void set_irn_in (ir_node *node, int arity, ir_node *in[]);
+
/* to iterate through the predecessors without touching the array. No
order of predecessors guaranteed.
To iterate over the operands iterate from 0 to i < get_irn_arity(),
void set_Block_cfgpred (ir_node *node, int pos, ir_node *pred);
bool get_Block_matured (ir_node *node);
void set_Block_matured (ir_node *node, bool matured);
+
+/** A visited flag only for block nodes.
+ * @see also: get_irn_visited() inc_irg_visited() inc_irg_block_visited()*/
unsigned long get_Block_block_visited (ir_node *node);
void set_Block_block_visited (ir_node *node, unsigned long visit);
ir_node *set_Block_dead(ir_node *block);
/* frees the memory. */
void remove_Block_cg_cfgpred_arr(ir_node * node);
+/** returns the extended basic block a block belongs to */
+ir_extblk *get_Block_extbb(const ir_node *block);
+/** sets the extended basic block a block belongs to */
+void set_Block_extbb(ir_node *block, ir_extblk *extblk);
+
/** Return the number of Keep alive node. */
int get_End_n_keepalives(ir_node *end);
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). */
+ CNST_ALL_ONE = -1, /**< The node is a const(11111...). */
+ CNST_OTHER = 2, /**< The tarvel of the const has another value. */
+ CNST_SYMCONST = 3, /**< The node is symconst. */
+ CNST_NO_CONST = 4 /**< The node is no const at all. */
+} cnst_classify_t;
+
tarval *get_Const_tarval (ir_node *node);
void set_Const_tarval (ir_node *node, tarval *con);
+/**
+ * Classify a node concerning constant properties.
+ * @param irn A node to check for.
+ * @return Constant properties of that node.
+ */
+cnst_classify_t classify_Const(ir_node *irn);
+
/** Returns the source language type of a Const node.
* Must be an atomic type. Mode of type must be mode of node.
*/
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!
*/
an exception */
pn_Call_max = 5 /**< number of projections from a Call */
} pn_Call; /* Projection numbers for Call. */
+#define pn_Call_M pn_Call_M_regular
ir_node *get_Call_mem (ir_node *node);
void set_Call_mem (ir_node *node, ir_node *mem);
} pn_Cmp; /* Projection numbers for Cmp */
/* #define not_mask pn_Cmp_Leg */
+/** returns the pnc name from an pnc constant */
const char *get_pnc_string(int pnc);
+
+/** Calculates the negated (Complement(R)) pnc condition. */
int get_negated_pnc(int pnc);
+
+/** Calculates the inversed (R^-1) pnc condition, i.e., "<" --> ">" */
+int get_inversed_pnc(int pnc);
+
ir_node *get_Cmp_left (ir_node *node);
void set_Cmp_left (ir_node *node, ir_node *left);
ir_node *get_Cmp_right (ir_node *node);
type *get_Cast_type (ir_node *node);
void set_Cast_type (ir_node *node, type *to_tp);
+/** Checks for upcast.
+ *
+ * Returns true if the Cast node casts a class type to a super type.
+ * Works also for pointers to classes (recursively).
+ */
+int is_Cast_upcast(ir_node *node);
+
+/** Checks for downcast.
+ *
+ * Returns true if the Cast node casts a class type to a sub type.
+ * Works also for pointers to classes (recursively).
+ */
+int is_Cast_downcast(ir_node *node);
+
+
/** 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. */
type *get_Free_type (ir_node *node);
void set_Free_type (ir_node *node, type *tp);
+where_alloc get_Free_where (ir_node *node);
+void set_Free_where (ir_node *node, where_alloc where);
+
ir_node **get_Sync_preds_arr (ir_node *node);
int get_Sync_n_preds (ir_node *node);
ir_node *get_Sync_pred (ir_node *node, int pos);
void set_Sync_pred (ir_node *node, int pos, ir_node *pred);
-ir_node *get_Proj_pred (ir_node *node);
+/** 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);
+
+/** Return the predecessor of a Proj node. */
+ir_node *get_Proj_pred (const ir_node *node);
void set_Proj_pred (ir_node *node, ir_node *pred);
-long get_Proj_proj (ir_node *node);
+/** Return the projection number of a Proj node. */
+long get_Proj_proj (const ir_node *node);
void set_Proj_proj (ir_node *node, long proj);
ir_node **get_Tuple_preds_arr (ir_node *node);
ir_node *skip_Tuple (ir_node *node);
/** returns operand of node if node is a Cast */
ir_node *skip_Cast (ir_node *node);
+/** returns operand of node if node is a Confirm */
+ir_node *skip_Confirm (ir_node *node);
+/** Skip all high-level Operations. */
+ir_node *skip_HighLevel(ir_node *node);
+/** returns true if irn is a Const node. */
+int is_Const(const ir_node *node);
/** returns true if node is a Bad node. */
int is_Bad (const ir_node *node);
/** returns true if the node is not a Block */
int is_ip_cfop(const ir_node *node);
/** Returns true if the operation can change the control flow because
of an exception: Call, Quot, DivMod, Div, Mod, Load, Store, Alloc,
- Bad. */
+ Bad. Raise is not fragile, but a unconditional jump. */
int is_fragile_op(const ir_node *node);
/** Returns the memory operand of fragile operations. */
ir_node *get_fragile_op_mem(ir_node *node);
* operation: Cond. */
int is_forking_op(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);
+
/**
* Access custom node data.
* The data must have been registered with
/** Output the firm kind of the node */
#define DDMK(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, print_firm_kind(X), (void *)(X));
/** Output information about a node */
-#define DDMN(X) printf("%s(l.%i) %s%s: %ld (%p)\n", __MYFUNC__, __LINE__, get_irn_opname(X), get_mode_name(get_irn_mode(X)), get_irn_node_nr(X), (void *)(X))
+
+/*#define DDMN(X) printf("%s(l.%i) %s%s: %ld (%p)\n", __MYFUNC__, __LINE__, get_irn_opname(X), get_mode_name(get_irn_mode(X)), get_irn_node_nr(X), (void *)(X))*/
+int dump_node_opcode(FILE *F, ir_node *n);
+#define DDMN(X) do { printf("%s(l.%i) ", __MYFUNC__, __LINE__); dump_node_opcode(stdout, X); printf(": %ld (%p)\n", get_irn_node_nr(X), (void *)(X)); } while (0)
+
/** Output information about a node and its block */
#define DDMNB(X) printf("%s%s: %ld (in block %ld)\n", get_irn_opname(X), get_mode_name(get_irn_mode(X)), get_irn_node_nr(X), get_irn_node_nr(get_nodes_block(X)))
/** Output information about a type */