# ifndef _IRNODE_H_
# define _IRNODE_H_
+/** Projection numbers of compare: use for Proj nodes! */
+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;
+#define not_mask Leg
+
+# include "tv.h"
# include "irgraph.h"
# include "entity.h"
# include "firm_common.h"
# include "irop.h"
# include "irmode.h"
-# include "tv.h"
# include "type.h"
# include "dbginfo.h"
# include "exc.h"
* of nodes, it's just a big graph.
*/
+/**
+ * Checks whether a pointer points to a ir node.
+ *
+ * @param thing an arbitrary pointer
+ *
+ * @return
+ * true if the thing is a ir mode, else false
+ */
+int
+is_ir_node (void *thing);
+
/** returns the number of predecessors without the block predecessor: */
-int get_irn_arity (ir_node *node);
+int get_irn_arity (const ir_node *node);
/** Replaces the old in array by a new one that will contain the ins given in
the parameters. Conserves the block predecessor. It copies the array passed.
/* get_irn_n removes Id predecessors. */
INLINE ir_node *get_irn_n (ir_node *node, int n);
INLINE void set_irn_n (ir_node *node, int n, ir_node *in);
-/* Get the mode struct. */
-INLINE ir_mode *get_irn_mode (ir_node *node);
-/* Get the mode-enum modecode */
-INLINE modecode get_irn_modecode (ir_node *node);
-/* Get the ident for a string representation of the mode */
-INLINE ident *get_irn_modeident (ir_node *node);
-/* Access the opcode struct of the node */
-INLINE ir_op *get_irn_op (ir_node *node);
+/** Sets the mode struct of node */
+INLINE void set_irn_mode (ir_node *node, ir_mode *mode);
+/** Gets the mode struct. */
+INLINE ir_mode *get_irn_mode (const ir_node *node);
+/** Gets the mode-enum modecode. */
+INLINE modecode get_irn_modecode (const ir_node *node);
+/** Gets the ident for a string representation of the mode .*/
+INLINE ident *get_irn_modeident (const ir_node *node);
+/** Gets the opcode struct of the node */
+INLINE ir_op *get_irn_op (const ir_node *node);
+/** Sets the opcode struct of the node. */
INLINE void set_irn_op (ir_node *node, ir_op *op);
-/* Get the opcode-enum of the node */
-INLINE opcode get_irn_opcode (ir_node *node);
-/* Get the ident for a string representation of the opcode */
-INLINE ident *get_irn_opident (ir_node *node);
-/* Get the string representation of the opcode */
-INLINE const char *get_irn_opname (ir_node *node);
+/** Gets the opcode-enum of the node. */
+INLINE opcode get_irn_opcode (const ir_node *node);
+/** Get the string representation of the opcode. */
+INLINE const char *get_irn_opname (const ir_node *node);
+/** Get the ident for a string representation of the opcode. */
+INLINE ident *get_irn_opident (const ir_node *node);
+INLINE unsigned long get_irn_visited (const ir_node *node);
INLINE void set_irn_visited (ir_node *node, unsigned long visited);
-INLINE unsigned long get_irn_visited (ir_node *node);
-/* Sets visited to get_irg_visited(current_ir_graph) */
+/** Sets visited to get_irg_visited(current_ir_graph). */
INLINE void mark_irn_visited (ir_node *node);
-/* Returns 1 if visited < get_irg_visited(current_ir_graph). */
-INLINE int irn_not_visited (ir_node *node);
-/* Returns 1 if visited >= get_irg_visited(current_ir_graph). */
-INLINE int irn_visited (ir_node *node);
+/** Returns 1 if visited < get_irg_visited(current_ir_graph). */
+INLINE int irn_not_visited (const ir_node *node);
+/** Returns 1 if visited >= get_irg_visited(current_ir_graph). */
+INLINE int irn_visited (const ir_node *node);
INLINE void set_irn_link (ir_node *node, void *link);
-INLINE void *get_irn_link (ir_node *node);
+INLINE void *get_irn_link (const ir_node *node);
/** Outputs a unique number for this node if libfirm is compiled for
debugging, (configure with --enable-debug) else returns 0. */
-INLINE long get_irn_node_nr(ir_node *node);
+INLINE long get_irn_node_nr(const ir_node *node);
/** Returns the ir_graph this node belongs to. Only valid for
* CallBegin, EndReg and EndExcept */
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_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;
/* @@@ no more supported */
free_End frees these data structures. */
INLINE void free_End (ir_node *end);
-ir_graph *get_EndReg_irg (ir_node *end);
-ir_graph *get_EndExcept_irg (ir_node *end);
+ir_graph *get_EndReg_irg (const ir_node *end);
+ir_graph *get_EndExcept_irg (const 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.
by the linker. Type_or_id_p is ident *. */
} symconst_kind;
typedef union type_or_id * type_or_id_p;
-INLINE symconst_kind get_SymConst_kind (ir_node *node);
+INLINE symconst_kind get_SymConst_kind (const ir_node *node);
INLINE void set_SymConst_kind (ir_node *node, symconst_kind num);
/* Only to access SymConst of kind type_tag or size. Else assertion: */
INLINE type *get_SymConst_type (ir_node *node);
INLINE ir_node *get_Call_ptr (ir_node *node);
INLINE void set_Call_ptr (ir_node *node, ir_node *ptr);
INLINE ir_node **get_Call_param_arr (ir_node *node);
+/** Gets the number of parameters of a call. */
INLINE int get_Call_n_params (ir_node *node);
+/** Gets the call parameter at position pos. */
INLINE ir_node *get_Call_param (ir_node *node, int pos);
+/** Sets the call parameter at position pos. */
INLINE void set_Call_param (ir_node *node, int pos, ir_node *param);
+/** Gets the type of a call. */
INLINE type *get_Call_type (ir_node *node);
+/** Sets the type of a call. */
INLINE void set_Call_type (ir_node *node, type *tp);
+/** Gets the arity of a call. Identical to get_Call_n_params(). */
INLINE int get_Call_arity (ir_node *node);
/* Set, get and remove the callee-analysis. */
INLINE ir_node *get_Not_op (ir_node *node);
INLINE void set_Not_op (ir_node *node, ir_node *op);
-/** Projection numbers of compare: use for Proj nodes! */
-typedef enum {
- False, /**< false */
- Eq, /**< equal */
- Lt, /**< less */
- Le, /**< less or equal */
- Gt, /**< greater */
- Ge, /**< greater or equal */
- Lg, /**< less or greater */
- Leg, /**< 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 /**< true */
- /* not_mask = Leg*/ /* bits to flip to negate comparison * @@ hack for jni interface */
-} pnc_number;
-#define not_mask Leg
-INLINE char *get_pnc_string(int pnc);
+INLINE const char *get_pnc_string(int pnc);
+
INLINE int get_negated_pnc(int pnc);
INLINE ir_node *get_Cmp_left (ir_node *node);
INLINE void set_Cmp_left (ir_node *node, ir_node *left);
INLINE int is_Block (ir_node *node);
/** returns true if node is a Proj node or a Filter node in
* intraprocedural view */
-INLINE int is_Proj (ir_node *node);
+INLINE int is_Proj (const ir_node *node);
/** Returns true if the operation manipulates control flow:
Start, End, Jmp, Cond, Return, Raise, Bad, CallBegin, EndReg, EndExcept */
int is_cfop(ir_node *node);
#include "ident.h"
-/*@{*/
-/** Makros for debugging the libfirm */
#ifdef __GNUC__
-/* GNU C has the extension */
+/* GNU C has the __FUNCTION__ extension */
#define __MYFUNC__ __FUNCTION__
#else
/* use Filename instead */
#define __MYFUNC__ __FILE__
#endif
+/* !!!!!!!!! @@@
+ Don't format with "\", firmjni gets problems */
+/** Output location */
+#define DDM printf("%s(l.%i).\n", __MYFUNC__, __LINE__);
/** Output the firm kind of the node */
-#define DDMK(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, \
- print_firm_kind(X), (X));
+#define DDMK(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, print_firm_kind(X), (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), (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), (X))
/** 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)))
+#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 */
-#define DDMT(X) printf("%s(l.%i) %s %s: %ld (%p)\n", __MYFUNC__, __LINE__, \
- get_type_tpop_name(X), get_type_name(X), get_type_nr(X), (X))
+#define DDMT(X) printf("%s(l.%i) %s %s: %ld (%p)\n", __MYFUNC__, __LINE__, get_type_tpop_name(X), get_type_name(X), get_type_nr(X), (X))
/** Output information about an entity */
-#define DDME(X) printf("%s(l.%i) %s: %ld (%p\n", __MYFUNC__, __LINE__, \
- get_entity_name(X), get_entity_nr(X), (X))
+#define DDME(X) printf("%s(l.%i) %s: %ld (%p)\n", __MYFUNC__, __LINE__, get_entity_name(X), get_entity_nr(X), (X))
/** 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), (X))
+#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), (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), (X))
+#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), (X))
/** Output information about an ident */
-#define DDMI(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, \
- id_to_str(X), (X))
+#define DDMI(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, id_to_str(X), (X))
/** Output information about a mode */
-#define DDMM(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, \
- get_mode_name(X), (X))
-
-/*@}*/ /* Macros for debug.. */
+#define DDMM(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, get_mode_name(X), (X))
+/** Output information about a loop */
+#define DDML(X) printf("%s(l.%i) loop with depth %d: %p\n", __MYFUNC__, __LINE__, get_loop_depth(X), (X))
+/** Output information about a tarVal */
+#define DDMV(X) printf("%s(l.%i) tarval: ",__MYFUNC__, __LINE__); tarval_printf(X); printf(" (%p)\n", (X));
/*@}*/ /* end of ir_node group definition */