X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.h;h=e7fcdf6aac123a9e1f48759b7ca7c91ce0d7ad13;hb=76a6c3b40390427bc516a943316642bb57daa465;hp=aa96f26a59f9fe19945feebc54bb5e98d5502679;hpb=333a4e6fda9e1f2f8aa619c5b0ea6da1ac46a0ad;p=libfirm diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index aa96f26a5..e7fcdf6aa 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -9,38 +9,11 @@ * Copyright: (c) 1998-2003 Universität Karlsruhe * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. */ - # ifndef _IRNODE_H_ # define _IRNODE_H_ #include -/** - * 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" @@ -48,7 +21,6 @@ typedef enum { # include "irmode.h" # include "type.h" # include "dbginfo.h" -/* # include "exc.h" */ /** * @file irnode.h @@ -120,8 +92,8 @@ int get_irn_inter_arity (const ir_node *node); 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(), @@ -274,6 +246,9 @@ ir_node *get_Block_cfgpred (ir_node *node, int pos); 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); @@ -378,9 +353,25 @@ typedef enum { 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. */ @@ -713,6 +704,21 @@ 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); +/** 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. */ @@ -820,13 +826,23 @@ 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); +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); +/** 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 (ir_node *node); void set_Proj_pred (ir_node *node, ir_node *pred); +/** Return the projection number of a Proj node. */ long get_Proj_proj (ir_node *node); void set_Proj_proj (ir_node *node, long proj); @@ -893,7 +909,7 @@ int is_cfop(const ir_node *node); 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); @@ -902,6 +918,11 @@ 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