firmjni does not like two similar enums.
[libfirm] / ir / ir / irnode.h
1 /*
2  * Project:     libFIRM
3  * File name:   ir/ir/irnode.h
4  * Purpose:     Representation of an intermediate operation.
5  * Author:      Martin Trapp, Christian Schaefer
6  * Modified by: Goetz Lindenmaier
7  * Created:
8  * CVS-ID:      $Id$
9  * Copyright:   (c) 1998-2003 Universität Karlsruhe
10  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
11  */
12 # ifndef _IRNODE_H_
13 # define _IRNODE_H_
14
15 #include <stddef.h>
16
17 # include "irgraph.h"
18 # include "entity.h"
19 # include "firm_common.h"
20 # include "irop.h"
21 # include "irmode.h"
22 # include "type.h"
23 # include "irextbb.h"
24 # include "dbginfo.h"
25
26 /**
27  * @file irnode.h
28  *
29  * @author Martin Trapp, Christian Schaefer
30  *
31  * Declarations of an ir node.
32  */
33
34 /**
35  * @defgroup ir_node Declarations of an ir node.
36  *
37  * The type definition of ir_node is also in irgraph.h to resolve
38  *  recursion between irnode.h and irgraph.h
39  *
40  * ir_node - a datatype representing a Firm node
41  *
42  *  The common fields are:
43  *
44  *  - firm_kind - A firm_kind tag containing k_type.  This is useful
45  *                for dynamically checking whether a node is a ir_node.
46  *  - arity     - The number of predecessors in the Firm graph.
47  *  - in        - A list with the predecessors in the Firm graph.  There are
48  *                routines to access individual elements and to obtain the
49  *                array.  The method returning the array should not be used.
50  *  - mode      - The mode of the node.  There are routines to get the mode
51  *                but also to access the mode's fields directly.
52  *  - opcode    - The opcode of the node. There are routines to get the opcode
53  *                but also to access the opcode's fields directly.
54  *  - node_nr   - A unique number for the node.  Available only if debugging
55  *                is turned on.
56  * @{
57  */
58
59 #ifndef _IR_NODE_TYPEDEF_
60 #define _IR_NODE_TYPEDEF_
61 typedef struct ir_node ir_node;
62 #endif
63
64 #ifdef __cplusplus
65 extern "C" {
66 #endif
67
68 /**
69  *   you can work on the graph without considering the different types
70  *   of nodes, it's just a big graph.
71  */
72
73 /**
74  *   Checks whether a pointer points to a ir node.
75  *
76  *   @param thing   an arbitrary pointer
77  *   @return        non-zero if the thing is a ir mode, else zero
78  */
79 int is_ir_node (const void *thing);
80
81 /**
82  * Returns the number of predecessors without the block predecessor.
83  *
84  * @param node   the IR-node
85  */
86 int           get_irn_arity         (const ir_node *node);
87 int           get_irn_intra_arity   (const ir_node *node);
88 int           get_irn_inter_arity   (const ir_node *node);
89
90 /** Replaces the old in array by a new one that will contain the ins given in
91    the parameters.  Conserves the block predecessor.  It copies the array passed.
92    This function is necessary to adjust in arrays of blocks, calls and phis.
93    Assumes that current_ir_graph is set to the graph containing "node".
94    "in" must contain all predecessors except the block that are required for
95    the nodes opcode. */
96 void          set_irn_in            (ir_node *node, int arity, ir_node *in[]);
97
98 /* to iterate through the predecessors without touching the array. No
99    order of predecessors guaranteed.
100    To iterate over the operands iterate from 0 to i < get_irn_arity(),
101    to iterate including the Block predecessor iterate from i = -1 to
102    i < get_irn_arity. */
103 /* Access predecessor n */
104
105 /**
106  * Get the n-th predecessor of a node.
107  * This function removes Id predecessors.
108  */
109 ir_node      *get_irn_n             (const ir_node *node, int n);
110 ir_node      *get_irn_intra_n       (const ir_node *node, int n);
111 ir_node      *get_irn_inter_n       (const ir_node *node, int n);
112
113 /** Replace the n-th predecessor of a node with a new one. */
114 void          set_irn_n             (ir_node *node, int n, ir_node *in);
115 /* Sets the mode struct of node.  */
116 void          set_irn_mode (ir_node *node, ir_mode *mode);
117 /** Gets the mode struct of a node.  */
118 ir_mode      *get_irn_mode          (const ir_node *node);
119 /** Gets the mode-enum modecode. */
120 modecode      get_irn_modecode      (const ir_node *node);
121 /** Gets the ident for a string representation of the mode .*/
122 ident        *get_irn_modeident     (const ir_node *node);
123 /** Gets the string representation of the mode .*/
124 const char   *get_irn_modename      (const ir_node *node);
125 /** Gets the opcode struct of the node. */
126 ir_op        *get_irn_op            (const ir_node *node);
127 /** Sets the opcode struct of the node. */
128 void          set_irn_op            (ir_node *node, ir_op *op);
129 /** Gets the opcode-enum of the node. */
130 opcode        get_irn_opcode        (const ir_node *node);
131 /** Get the string representation of the opcode. */
132 const char   *get_irn_opname        (const ir_node *node);
133 /** Get the ident for a string representation of the opcode. */
134 ident        *get_irn_opident       (const ir_node *node);
135 /** Gets the visited counter of a node. */
136 unsigned long get_irn_visited (const ir_node *node);
137 /** Sets the visited counter of a node. */
138 void          set_irn_visited (ir_node *node, unsigned long visited);
139 /** Sets visited to get_irg_visited(current_ir_graph). */
140 void          mark_irn_visited (ir_node *node);
141 /** Returns 1 if visited < get_irg_visited(current_ir_graph). */
142 int           irn_not_visited  (const ir_node *node);
143 /** Returns 1 if visited >= get_irg_visited(current_ir_graph). */
144 int           irn_visited      (const ir_node *node);
145
146 /**
147  * Sets the link of a node.
148  * Only allowed if the graph is NOT in phase_building.
149  */
150 void          set_irn_link     (ir_node *node, void *link);
151
152 /** Returns the link of a node.  */
153 void         *get_irn_link     (const ir_node *node);
154
155 /** Returns the ir_graph this node belongs to. Only valid if irg
156  *  is in state op_pin_state_pinned (irg is only stored in the block. */
157 ir_graph     *get_irn_irg      (const ir_node *node);
158
159 /** Outputs a unique number for this node if libFIRM is compiled for
160    debugging, (configure with --enable-debug) else returns address
161    of node cast to long. */
162 long          get_irn_node_nr  (const ir_node *node);
163
164 /** Returns the pinned state of a node. */
165 op_pin_state get_irn_pinned    (const ir_node *node);
166
167 /** Set pin state for nodes with op pin state op_pin_state_exc_pinned */
168 void set_irn_pinned(ir_node *node, op_pin_state state);
169
170 /**
171  * irnode constructor.
172  * Create a new irnode in irg, with an op, mode, arity and
173  * some incoming irnodes.
174  * This constructor is used in every specified irnode constructor.
175  *
176  * @param db    Debug info.
177  * @param irg   IR-graph on with this new node should be constructed.
178  * @param op    The opcode of the new node.
179  * @param mode  The mode of the new node.
180  * @param arity The arity of the new node, may be <0 if yet.
181  * @param in    An array of arity predecessor nodes.
182  */
183 ir_node *
184 new_ir_node (dbg_info *db,
185          ir_graph *irg,
186          ir_node *block,
187          ir_op *op,
188          ir_mode *mode,
189          int arity,
190          ir_node *in[]);
191
192 /** Return the block the node belongs to.
193  *
194  * This works for all except Block.  It can return Blocks or the Bad node.
195  *
196  * To express the difference to access routines that work for all
197  * nodes we use infix "nodes" and do not name this function
198  * get_irn_block. */
199 ir_node  *get_nodes_block (const ir_node *node);
200
201 /** Sets the Block of a node. */
202 void      set_nodes_block (ir_node *node, ir_node *block);
203
204 /**
205  * @function get_irn_block()
206  * @see get_nodes_block()
207  */
208 /**
209  * Projection numbers for result of Start node: use for Proj nodes!
210  */
211 typedef enum {
212   pn_Start_X_initial_exec,   /**< Projection on the initial control flow. */
213   pn_Start_M,                /**< Projection on the initial memory. */
214   pn_Start_P_frame_base,     /**< Projection on the frame base pointer. */
215   pn_Start_P_globals,        /**< Projection on the pointer to the data segment
216                                   containing _all_ global entities. */
217   pn_Start_T_args,           /**< Projection on all arguments. */
218   pn_Start_P_value_arg_base, /**< Pointer to region of compound value arguments as defined by
219                                   type of this method. */
220   pn_Start_max               /**< number of projections from a Start */
221 } pn_Start; /* Projection numbers for Start. */
222
223
224 /** Test whether arbitrary node is frame pointer.
225  *
226  * Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
227  * from Start.  If so returns frame type, else Null. */
228 type *is_frame_pointer(ir_node *n);
229
230 /** Test whether arbitrary node is globals pointer.
231  *
232  * Test whether arbitrary node is globals pointer, i.e. Proj(pn_Start_P_globals)
233  * from Start.  If so returns global type, else Null. */
234 type *is_globals_pointer(ir_node *n);
235
236 /** Test whether arbitrary node is value arg base.
237  *
238  * Test whether arbitrary node is value arg base, i.e. Proj(pn_Start_P_value_arg_base)
239  * from Start.   If so returns 1, else 0. */
240 int   is_value_arg_pointer(ir_node *n);
241
242
243 /* @@@ no more supported  */
244 ir_node **get_Block_cfgpred_arr (ir_node *node);
245 int       get_Block_n_cfgpreds (ir_node *node);
246 ir_node  *get_Block_cfgpred (ir_node *node, int pos);
247 void      set_Block_cfgpred (ir_node *node, int pos, ir_node *pred);
248 bool      get_Block_matured (ir_node *node);
249 void      set_Block_matured (ir_node *node, bool matured);
250
251 /** A visited flag only for block nodes.
252  *  @see also: get_irn_visited() inc_irg_visited() inc_irg_block_visited()*/
253 unsigned long get_Block_block_visited (ir_node *node);
254 void      set_Block_block_visited (ir_node *node, unsigned long visit);
255 ir_node  *set_Block_dead(ir_node *block);
256 int       is_Block_dead(const ir_node *block);
257
258 /* For this current_ir_graph must be set. */
259 void      mark_Block_block_visited(ir_node *node);
260 int       Block_not_block_visited(ir_node *node);
261
262 /* Set and remove interprocedural predecessors. If the interprocedural
263  * predecessors are removed, the node has the same predecessors in
264  * both views.
265  * @@@ Maybe better:  arity is zero if no cg preds. */
266 void      set_Block_cg_cfgpred_arr(ir_node * node, int arity, ir_node ** in);
267 void      set_Block_cg_cfgpred(ir_node * node, int pos, ir_node * pred);
268 /* @@@ not supported */
269 ir_node **get_Block_cg_cfgpred_arr(ir_node * node);
270 /** Returns the number of interprocedural predecessors.  0 if none. */
271 int       get_Block_cg_n_cfgpreds(ir_node * node);
272 /** Return the interprocedural predecessor at position pos. */
273 ir_node  *get_Block_cg_cfgpred(ir_node * node, int pos);
274 /* frees the memory. */
275 void      remove_Block_cg_cfgpred_arr(ir_node * node);
276
277 /** returns the extended basic block a block belongs to */
278 ir_extblk *get_Block_extbb(const ir_node *block);
279 /** sets the extended basic block a block belongs to */
280 void set_Block_extbb(ir_node *block, ir_extblk *extblk);
281
282 /** Return the number of Keep alive node. */
283 int  get_End_n_keepalives(ir_node *end);
284
285 /** Return the Keep alive node a position pos. */
286 ir_node *get_End_keepalive(ir_node *end, int pos);
287
288 /** Keep alive dedicated nodes.  These must be either PhiM or Block nodes. */
289 void add_End_keepalive (ir_node *end, ir_node *ka);
290
291 /** Set the Keep alive node at position pos. */
292 void set_End_keepalive(ir_node *end, int pos, ir_node *ka);
293
294 /** Some parts of the End node are allocated separately -- their memory
295    is not recovered by dead_node_elimination if a End node is dead.
296    free_End() frees these data structures. */
297 void free_End (ir_node *end);
298
299
300 /* We distinguish three kinds of Cond nodes.  These can be distinguished
301    by the mode of the selector operand and an internal flag of type cond_kind.
302    First we distinguish binary Conds and switch Conds.
303    A binary Cond has as selector a boolean value.  Proj(0) projects the control
304    flow for case "False", Proj(1) the control flow for "True".  A binary Cond
305    is recognized by the boolean selector.
306    The switch Cond has as selector an unsigned integer.  It produces as result
307    an n+1 Tuple (cf0, ... , cfn) of control flows.
308    We differ two flavours of this Cond.  The first, the dense Cond, passes
309    control along output i if the selector value is i, 0 <= i <= n.  If the
310    selector value is >n it passes control along output n.
311    The second Cond flavor diffirences in the treatment of cases not specified in
312    the source program.  It magically knows about the existence of Proj nodes.
313    It only passes control along output i, 0 <= i <= n, if a node Proj(Cond, i)
314    exists.  Else it passes control along output n (even if this Proj does not
315    exist.)  This Cond we call "fragmentary".  There is a special constructor
316    new_defaultProj that automatically sets the flavor.
317    The two switch flavors are distinguished by a flag of type cond_kind.
318    Default flavor is "dense"
319 */
320 typedef enum {
321   dense,        /**< Default. Missing Proj nodes are dead control flow. */
322   fragmentary   /**< Special. No control flow optimizations allowed.  Missing
323            Proj nodes mean default control flow, i.e., Proj(n). */
324 } cond_kind;
325
326 ir_node  *get_Cond_selector (ir_node *node);
327 void      set_Cond_selector (ir_node *node, ir_node *selector);
328 cond_kind get_Cond_kind (ir_node *node);
329 void      set_Cond_kind (ir_node *node, cond_kind kind);
330 long      get_Cond_defaultProj (ir_node *node);
331
332 /**
333  * Projection numbers for conditions.
334  */
335 typedef enum {
336   pn_Cond_false,    /**< Control flow if operand is "false". */
337   pn_Cond_true,     /**< Control flow if operand is "true".  */
338   pn_Cond_max       /**< number of projections from a Cond */
339 } pn_Cond;  /* Projection numbers for Cond. */
340
341 ir_node  *get_Return_mem (ir_node *node);
342 void      set_Return_mem (ir_node *node, ir_node *mem);
343 ir_node **get_Return_res_arr (ir_node *node);
344 int       get_Return_n_ress (ir_node *node);
345 ir_node  *get_Return_res (ir_node *node, int pos);
346 void      set_Return_res (ir_node *node, int pos, ir_node *res);
347
348 ir_node *get_Raise_mem (ir_node *node);
349 void     set_Raise_mem (ir_node *node, ir_node *mem);
350 ir_node *get_Raise_exo_ptr (ir_node *node);  /* PoinTeR to EXception Object */
351 void     set_Raise_exo_ptr (ir_node *node, ir_node *exoptr);
352
353 /**
354  * Projection numbers for Raise.
355  */
356 typedef enum {
357   pn_Raise_X,    /**< Execution result. */
358   pn_Raise_M,    /**< Memory result.    */
359   pn_Raise_max   /**< number of projections from a Raise */
360 } pn_Raise;  /* Projection numbers for Raise. */
361
362 typedef enum {
363   CNST_NULL     =  0, /**< The node is a const(0). */
364   CNST_ONE      = +1, /**< The node is a const(1). */
365   CNST_ALL_ONE  = -1, /**< The node is a const(11111...). */
366   CNST_OTHER    =  2, /**< The tarvel of the const has another value. */
367   CNST_SYMCONST =  3, /**< The node is symconst. */
368   CNST_NO_CONST =  4  /**< The node is no const at all. */
369 } cnst_classify_t;
370
371 tarval  *get_Const_tarval (ir_node *node);
372 void     set_Const_tarval (ir_node *node, tarval *con);
373
374 /**
375  * Classify a node concerning constant properties.
376  * @param irn A node to check for.
377  * @return Constant properties of that node.
378  */
379 cnst_classify_t classify_Const(ir_node *irn);
380
381 /** Returns the source language type of a Const node.
382  * Must be an atomic type.  Mode of type must be mode of node.
383  */
384 type    *get_Const_type   (ir_node *node);
385
386 /** Sets the source language type of a Const node. */
387 void     set_Const_type   (ir_node *node, type *tp);
388
389 /**  This enum names the three different kinds of symbolic Constants
390      represented by SymConst.  The content of the attribute type_or_id
391      depends on this tag.  Use the proper access routine after testing
392      this flag. */
393 typedef enum {
394   symconst_type_tag,    /**< The SymConst is a type tag for the given type.
395                            Type_or_id_p is type *. */
396   symconst_size,        /**< The SymConst is the size of the given type.
397                            Type_or_id_p is type *. */
398   symconst_addr_name,   /**< The SymConst is a symbolic pointer to be filled in
399                            by the linker.  The pointer is represented by a string.
400                            Type_or_id_p is ident *. */
401   symconst_addr_ent     /**< The SymConst is a symbolic pointer to be filled in
402                            by the linker.  The pointer is represented by an entity.
403                            Type_or_id_p is entity *. */
404 } symconst_kind;
405
406 /** SymConst attributes
407     This union contains the symbolic information represented by the node  */
408 union symconst_symbol {
409   type   *type_p;
410   ident  *ident_p;
411   entity *entity_p;
412 };
413
414 typedef union symconst_symbol symconst_symbol;
415
416
417 /** Get the kind of the SymConst. */
418 symconst_kind get_SymConst_kind (const ir_node *node);
419 /** Set the kind of the SymConst. */
420 void          set_SymConst_kind (ir_node *node, symconst_kind num);
421
422 /** Only to access SymConst of kind type_tag or size.  Else assertion: */
423 type    *get_SymConst_type (ir_node *node);
424 void     set_SymConst_type (ir_node *node, type *tp);
425
426 /** Only to access SymConst of kind addr_name.  Else assertion: */
427 ident   *get_SymConst_name (ir_node *node);
428 void     set_SymConst_name (ir_node *node, ident *name);
429
430 /** Only to access SymConst of kind addr_ent.  Else assertion: */
431 entity  *get_SymConst_entity (ir_node *node);
432 void     set_SymConst_entity (ir_node *node, entity *ent);
433
434 /** Sets both: type and ptrinfo.  Needed to treat the node independent of
435    its semantics.  Does a memcpy for the memory sym points to. */
436 /* write 'union': firmjni then does not create a method... */
437 union symconst_symbol get_SymConst_symbol (ir_node *node);
438 void                  set_SymConst_symbol (ir_node *node,
439                                            union symconst_symbol sym);
440
441 /** Access the type of the value represented by the SymConst.
442  *
443  *  Example: primitive type int for SymConst size. */
444 type *get_SymConst_value_type (ir_node *node);
445 void  set_SymConst_value_type (ir_node *node, type *tp);
446
447 ir_node *get_Sel_mem (ir_node *node);
448 void     set_Sel_mem (ir_node *node, ir_node *mem);
449 ir_node *get_Sel_ptr (ir_node *node);  /* ptr to the object to select from */
450 void     set_Sel_ptr (ir_node *node, ir_node *ptr);
451 ir_node **get_Sel_index_arr (ir_node *node);
452 int      get_Sel_n_indexs (ir_node *node);
453 ir_node *get_Sel_index (ir_node *node, int pos);
454 void     set_Sel_index (ir_node *node, int pos, ir_node *index);
455 entity  *get_Sel_entity (ir_node *node); /* entity to select */
456 void     set_Sel_entity (ir_node *node, entity *ent);
457
458 /** InstOf access */
459 type    *get_InstOf_ent (ir_node *node);
460 void    set_InstOf_ent (ir_node *node, type *ent);
461 ir_node *get_InstOf_store (ir_node *node);
462 void    set_InstOf_store (ir_node *node, ir_node *obj);
463 ir_node *get_InstOf_obj (ir_node *node);
464 void    set_InstOf_obj (ir_node *node, ir_node *obj);
465
466 /**
467  * Projection numbers for result of Call node: use for Proj nodes!
468  */
469 typedef enum {
470   pn_Call_M_regular = 0,  /**< The memory result. */
471   pn_Call_T_result  = 2,  /**< The tuple containing all (0, 1, 2, ...) results */
472   pn_Call_P_value_res_base = 4,/**< A pointer to the memory region containing copied results
473                  passed by value (for compound result types). */
474   pn_Call_X_except  = 1,  /**< The control flow result branching to the exception handler */
475   pn_Call_M_except  = 3,  /**< The memory result in case the called method terminated with
476                  an exception */
477   pn_Call_max       = 5   /**< number of projections from a Call */
478 } pn_Call;   /* Projection numbers for Call. */
479 #define pn_Call_M pn_Call_M_regular
480
481 ir_node *get_Call_mem (ir_node *node);
482 void     set_Call_mem (ir_node *node, ir_node *mem);
483 ir_node *get_Call_ptr (ir_node *node);
484 void     set_Call_ptr (ir_node *node, ir_node *ptr);
485 ir_node **get_Call_param_arr (ir_node *node);
486 /** Gets the number of parameters of a call. */
487 int      get_Call_n_params (ir_node *node);
488 /** Gets the call parameter at position pos. */
489 ir_node *get_Call_param (ir_node *node, int pos);
490 /** Sets the call parameter at position pos. */
491 void     set_Call_param (ir_node *node, int pos, ir_node *param);
492 /** Gets the type of a call. */
493 type    *get_Call_type (ir_node *node);
494 /** Sets the type of a call. */
495 void     set_Call_type (ir_node *node, type *tp);
496 /** Gets the arity of a call. Identical to get_Call_n_params(). */
497 int      get_Call_arity (ir_node *node);
498
499 /** Set, get and remove the callee information for a Call node.
500  *
501  *  The callee information lists all method entities that can be called
502  *  from this node.  If the address expression can not be analyzed fully,
503  *  e.g., as entities can be called that are not in the compilation unit,
504  *  the array contains the unknown_entity.  The array contains only entities
505  *  with peculiarity_existent, but with all kinds of visibility.  The entities
506  *  not necessarily contain an irg.
507  *
508  *  The array is only accessible if callee information is valid.  See flag
509  *  in graph.
510  *
511  *  The memory allocated for the array is managed automatically, i.e., it must
512  *  not be freed if the Call node is removed from the graph.
513  *
514  *  @param node A Call node.
515  */
516 int     Call_has_callees      (ir_node *node);
517 int     get_Call_n_callees    (ir_node *node);
518 entity *get_Call_callee       (ir_node *node, int pos);
519
520 /** Set the full callee array.
521  *
522  *  The passed array is copied. Assumes current_ir_graph set properly! */
523 void    set_Call_callee_arr   (ir_node *node, const int n, entity **arr);
524 void    remove_Call_callee_arr(ir_node *node);
525
526 ir_node  *get_CallBegin_ptr  (ir_node *node);
527 void      set_CallBegin_ptr  (ir_node *node, ir_node *ptr);
528 ir_node  *get_CallBegin_call (ir_node *node);
529 void      set_CallBegin_call (ir_node *node, ir_node *call);
530
531 /* For unary and binary arithmetic operations the access to the
532    operands can be factored out.  Left is the first, right the
533    second arithmetic value  as listed in tech report 1999-44.
534    unops are: Minus, Abs, Not, Conv, Cast
535    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
536    Shr, Shrs, Rot, Cmp */
537 int      is_unop (const ir_node *node);
538 ir_node *get_unop_op (ir_node *node);
539 void     set_unop_op (ir_node *node, ir_node *op);
540 int      is_binop (const ir_node *node);
541 ir_node *get_binop_left (ir_node *node);
542 void     set_binop_left (ir_node *node, ir_node *left);
543 ir_node *get_binop_right (ir_node *node);
544 void     set_binop_right (ir_node *node, ir_node *right);
545
546 ir_node *get_Add_left (ir_node *node);
547 void     set_Add_left (ir_node *node, ir_node *left);
548 ir_node *get_Add_right (ir_node *node);
549 void     set_Add_right (ir_node *node, ir_node *right);
550
551 ir_node *get_Sub_left (ir_node *node);
552 void     set_Sub_left (ir_node *node, ir_node *left);
553 ir_node *get_Sub_right (ir_node *node);
554 void     set_Sub_right (ir_node *node, ir_node *right);
555
556 ir_node *get_Minus_op (ir_node *node);
557 void     set_Minus_op (ir_node *node, ir_node *op);
558
559 ir_node *get_Mul_left (ir_node *node);
560 void     set_Mul_left (ir_node *node, ir_node *left);
561 ir_node *get_Mul_right (ir_node *node);
562 void     set_Mul_right (ir_node *node, ir_node *right);
563
564 ir_node *get_Quot_left (ir_node *node);
565 void     set_Quot_left (ir_node *node, ir_node *left);
566 ir_node *get_Quot_right (ir_node *node);
567 void     set_Quot_right (ir_node *node, ir_node *right);
568 ir_node *get_Quot_mem (ir_node *node);
569 void     set_Quot_mem (ir_node *node, ir_node *mem);
570
571 /**
572  * Projection numbers for Quot: use for Proj nodes!
573  */
574 typedef enum {
575   pn_Quot_M,           /**< Memory result.    */
576   pn_Quot_X_except,    /**< Execution result if exception occurred. */
577   pn_Quot_res,         /**< Result of computation. */
578   pn_Quot_max          /**< number of projections from a Quot */
579 } pn_Quot;  /* Projection numbers for Quot. */
580
581 ir_node *get_DivMod_left (ir_node *node);
582 void     set_DivMod_left (ir_node *node, ir_node *left);
583 ir_node *get_DivMod_right (ir_node *node);
584 void     set_DivMod_right (ir_node *node, ir_node *right);
585 ir_node *get_DivMod_mem (ir_node *node);
586 void     set_DivMod_mem (ir_node *node, ir_node *mem);
587
588 /**
589  * Projection numbers for DivMod: use for Proj nodes!
590  */
591 typedef enum {
592   pn_DivMod_M,           /**< Memory result.    */
593   pn_DivMod_X_except,    /**< Execution result if exception occurred. */
594   pn_DivMod_res_div,     /**< Result of computation a / b. */
595   pn_DivMod_res_mod,     /**< Result of computation a % b. */
596   pn_DivMod_max          /**< number of projections from a DivMod */
597 } pn_DivMod;  /* Projection numbers for DivMod. */
598
599 ir_node *get_Div_left (ir_node *node);
600 void     set_Div_left (ir_node *node, ir_node *left);
601 ir_node *get_Div_right (ir_node *node);
602 void     set_Div_right (ir_node *node, ir_node *right);
603 ir_node *get_Div_mem (ir_node *node);
604 void     set_Div_mem (ir_node *node, ir_node *mem);
605
606 /**
607  * Projection numbers for Div: use for Proj nodes!
608  */
609 typedef enum {
610   pn_Div_M,           /**< Memory result.    */
611   pn_Div_X_except,    /**< Execution result if exception occurred. */
612   pn_Div_res          /**< Result of computation. */
613 } pn_Div;  /* Projection numbers for Div. */
614
615 ir_node *get_Mod_left (ir_node *node);
616 void     set_Mod_left (ir_node *node, ir_node *left);
617 ir_node *get_Mod_right (ir_node *node);
618 void     set_Mod_right (ir_node *node, ir_node *right);
619 ir_node *get_Mod_mem (ir_node *node);
620 void     set_Mod_mem (ir_node *node, ir_node *mem);
621
622 /**
623  * Projection numbers for Mod: use for Proj nodes!
624  */
625 typedef enum {
626   pn_Mod_M,           /**< Memory result.    */
627   pn_Mod_X_except,    /**< Execution result if exception occurred. */
628   pn_Mod_res,         /**< Result of computation. */
629   pn_Mod_max          /**< number of projections from a Mod */
630 } pn_Mod;  /* Projection numbers for Mod. */
631
632 ir_node *get_Abs_op (ir_node *node);
633 void     set_Abs_op (ir_node *node, ir_node *op);
634
635 ir_node *get_And_left (ir_node *node);
636 void     set_And_left (ir_node *node, ir_node *left);
637 ir_node *get_And_right (ir_node *node);
638 void     set_And_right (ir_node *node, ir_node *right);
639
640 ir_node *get_Or_left (ir_node *node);
641 void     set_Or_left (ir_node *node, ir_node *left);
642 ir_node *get_Or_right (ir_node *node);
643 void     set_Or_right (ir_node *node, ir_node *right);
644
645 ir_node *get_Eor_left (ir_node *node);
646 void     set_Eor_left (ir_node *node, ir_node *left);
647 ir_node *get_Eor_right (ir_node *node);
648 void     set_Eor_right (ir_node *node, ir_node *right);
649
650 ir_node *get_Not_op (ir_node *node);
651 void     set_Not_op (ir_node *node, ir_node *op);
652
653 /**
654  * Projection numbers for Cmp are defined several times.
655  * The bit patterns are used for various tests, so don't change.
656  * The "unordered" values are possible results of comparing
657  * floating point numbers.
658  * Note that the encoding is imported, so do NOT change the order.
659  */
660 typedef enum {
661   pn_Cmp_False = 0,                             /**< false */
662   pn_Cmp_Eq    = 1,                             /**< equal */
663   pn_Cmp_Lt    = 2,                             /**< less */
664   pn_Cmp_Le    = pn_Cmp_Eq|pn_Cmp_Lt,           /**< less or equal */
665   pn_Cmp_Gt    = 4,                             /**< greater */
666   pn_Cmp_Ge    = pn_Cmp_Eq|pn_Cmp_Gt,           /**< greater or equal */
667   pn_Cmp_Lg    = pn_Cmp_Lt|pn_Cmp_Gt,           /**< less or greater */
668   pn_Cmp_Leg   = pn_Cmp_Lt|pn_Cmp_Eq|pn_Cmp_Gt, /**< less, equal or greater = ordered */
669   pn_Cmp_Uo    = 8,                             /**< unordered */
670   pn_Cmp_Ue    = pn_Cmp_Uo|pn_Cmp_Eq,           /**< unordered or equal */
671   pn_Cmp_Ul    = pn_Cmp_Uo|pn_Cmp_Lt,           /**< unordered or less */
672   pn_Cmp_Ule   = pn_Cmp_Uo|pn_Cmp_Eq|pn_Cmp_Lt, /**< unordered, less or equal */
673   pn_Cmp_Ug    = pn_Cmp_Uo|pn_Cmp_Gt,           /**< unordered or greater */
674   pn_Cmp_Uge   = pn_Cmp_Uo|pn_Cmp_Eq|pn_Cmp_Gt, /**< unordered, greater or equal */
675   pn_Cmp_Ne    = pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Gt, /**< unordered, less or greater = not equal */
676   pn_Cmp_True  = 15                             /**< true */
677   /* not_mask = Leg*/   /* bits to flip to negate comparison * @@ hack for jni interface */
678 } pn_Cmp;   /* Projection numbers for Cmp */
679 /* #define not_mask pn_Cmp_Leg */
680
681 /** returns the pnc name from an pnc constant */
682 const char *get_pnc_string(int pnc);
683
684 /** Calculates the negated (Complement(R)) pnc condition. */
685 int         get_negated_pnc(int pnc);
686
687 /** Calculates the inversed (R^-1) pnc condition, i.e., "<" --> ">" */
688 int         get_inversed_pnc(int pnc);
689
690 ir_node *get_Cmp_left (ir_node *node);
691 void     set_Cmp_left (ir_node *node, ir_node *left);
692 ir_node *get_Cmp_right (ir_node *node);
693 void     set_Cmp_right (ir_node *node, ir_node *right);
694
695 ir_node *get_Shl_left (ir_node *node);
696 void     set_Shl_left (ir_node *node, ir_node *left);
697 ir_node *get_Shl_right (ir_node *node);
698 void     set_Shl_right (ir_node *node, ir_node *right);
699
700 ir_node *get_Shr_left (ir_node *node);
701 void     set_Shr_left (ir_node *node, ir_node *left);
702 ir_node *get_Shr_right (ir_node *node);
703 void     set_Shr_right (ir_node *node, ir_node *right);
704
705 ir_node *get_Shrs_left (ir_node *node);
706 void     set_Shrs_left (ir_node *node, ir_node *left);
707 ir_node *get_Shrs_right (ir_node *node);
708 void     set_Shrs_right (ir_node *node, ir_node *right);
709
710 ir_node *get_Rot_left (ir_node *node);
711 void     set_Rot_left (ir_node *node, ir_node *left);
712 ir_node *get_Rot_right (ir_node *node);
713 void     set_Rot_right (ir_node *node, ir_node *right);
714
715 ir_node *get_Conv_op (ir_node *node);
716 void     set_Conv_op (ir_node *node, ir_node *op);
717
718 /* Does Cast need a mem operator?
719  * Cast should only depend on the type, not on the state of an
720  * entity.  But:  we initialize various fields after Alloc, that
721  * are accessed in the cast.  This required some precaution, to
722  * get the right memory into the Loads generated from the cast.
723  */
724 ir_node *get_Cast_op (ir_node *node);
725 void     set_Cast_op (ir_node *node, ir_node *op);
726 type    *get_Cast_type (ir_node *node);
727 void     set_Cast_type (ir_node *node, type *to_tp);
728
729 /** Checks for upcast.
730  *
731  * Returns true if the Cast node casts a class type to a super type.
732  * Works also for pointers to classes (recursively).
733  */
734 int is_Cast_upcast(ir_node *node);
735
736 /** Checks for downcast.
737  *
738  * Returns true if the Cast node casts a class type to a sub type.
739  * Works also for pointers to classes (recursively).
740  */
741 int is_Cast_downcast(ir_node *node);
742
743
744 /** Returns true if n is Phi or Filter in interprocedural_view.
745    Returns false if irg in phase building and the Phi has zero
746    predecessors: it's a Phi0. */
747 int       is_Phi (const ir_node *n);
748 /** Returns true  if irg in phase building and the Phi has zero
749    predecessors: it's a Phi0. */
750 int       is_Phi0 (const ir_node *n);
751 /* These routines also work for Filter nodes in interprocedural view. */
752 ir_node **get_Phi_preds_arr (ir_node *node);
753 int       get_Phi_n_preds (ir_node *node);
754 ir_node  *get_Phi_pred (ir_node *node, int pos);
755 void      set_Phi_pred (ir_node *node, int pos, ir_node *pred);
756
757 ir_node  *get_Filter_pred(ir_node *node);
758 void      set_Filter_pred(ir_node *node, ir_node *pred);
759 long      get_Filter_proj(ir_node *node);
760 void      set_Filter_proj(ir_node *node, long proj);
761 /* set the interprocedural predecessors, ...d_arr uses current_ir_graph.
762  * @@@ Maybe better:  arity is zero if no cg preds. */
763 void     set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in);
764 void     set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred);
765 int      get_Filter_n_cg_preds(ir_node *node);
766 ir_node *get_Filter_cg_pred(ir_node *node, int pos);
767
768 /** Return true if parameter is a memory operation.
769  *
770  *  A memory operation is an operation that changes the
771  *  memory.  I.e., a Load or a Store operation.
772  */
773 int is_memop(ir_node *node);
774 ir_node *get_memop_mem (ir_node *node);
775 void     set_memop_mem (ir_node *node, ir_node *mem);
776 ir_node *get_memop_ptr (ir_node *node);
777 void     set_memop_ptr (ir_node *node, ir_node *ptr);
778
779 /**
780  * Projection numbers for Load: use for Proj nodes!
781  */
782 typedef enum {
783   pn_Load_M,         /**< Memory result.    */
784   pn_Load_X_except,  /**< Execution result if exception occurred. */
785   pn_Load_res,       /**< Result of load operation. */
786   pn_Load_max        /**< number of projections from a Load */
787 } pn_Load;  /* Projection numbers for Load. */
788
789 ir_node       *get_Load_mem (ir_node *node);
790 void           set_Load_mem (ir_node *node, ir_node *mem);
791 ir_node       *get_Load_ptr (ir_node *node);
792 void           set_Load_ptr (ir_node *node, ir_node *ptr);
793 ir_mode       *get_Load_mode (ir_node *node);
794 void           set_Load_mode (ir_node *node, ir_mode *mode);
795 ent_volatility get_Load_volatility (ir_node *node);
796 void           set_Load_volatility (ir_node *node, ent_volatility volatility);
797
798 /**
799  * Projection numbers for Store: use for Proj nodes!
800  */
801 typedef enum {
802   pn_Store_M,         /**< Memory result.    */
803   pn_Store_X_except,  /**< Execution result if exception occurred. */
804   pn_Store_max        /**< number of projections from a Store */
805 } pn_Store;  /* Projection numbers for Store. */
806
807 ir_node       *get_Store_mem (ir_node *node);
808 void           set_Store_mem (ir_node *node, ir_node *mem);
809 ir_node       *get_Store_ptr (ir_node *node);
810 void           set_Store_ptr (ir_node *node, ir_node *ptr);
811 ir_node       *get_Store_value (ir_node *node);
812 void           set_Store_value (ir_node *node, ir_node *value);
813 ent_volatility get_Store_volatility (ir_node *node);
814 void           set_Store_volatility (ir_node *node, ent_volatility volatility);
815
816 /**
817  * Projection numbers for Alloc: use for Proj nodes!
818  */
819 typedef enum {
820   pn_Alloc_M,          /**< Memory result. */
821   pn_Alloc_X_except,  /**< Execution result if exception occurred. */
822   pn_Alloc_res,       /**< Result of allocation. */
823   pn_Alloc_max        /**< number of projections from an Alloc */
824 } pn_Alloc;  /* Projection numbers for Alloc. */
825
826 ir_node *get_Alloc_mem (ir_node *node);
827 void     set_Alloc_mem (ir_node *node, ir_node *mem);
828 ir_node *get_Alloc_size (ir_node *node);
829 void     set_Alloc_size (ir_node *node, ir_node *size);
830 type    *get_Alloc_type (ir_node *node);
831 void     set_Alloc_type (ir_node *node, type *tp);
832
833 /** The allocation place. */
834 typedef enum {
835   stack_alloc,          /**< Alloc allocates the object on the stack. */
836   heap_alloc            /**< Alloc allocates the object on the heap. */
837 } where_alloc;
838
839 where_alloc  get_Alloc_where (ir_node *node);
840 void         set_Alloc_where (ir_node *node, where_alloc where);
841
842 ir_node *get_Free_mem (ir_node *node);
843 void     set_Free_mem (ir_node *node, ir_node *mem);
844 ir_node *get_Free_ptr (ir_node *node);
845 void     set_Free_ptr (ir_node *node, ir_node *ptr);
846 ir_node *get_Free_size (ir_node *node);
847 void     set_Free_size (ir_node *node, ir_node *size);
848 type    *get_Free_type (ir_node *node);
849 void     set_Free_type (ir_node *node, type *tp);
850
851 where_alloc  get_Free_where (ir_node *node);
852 void         set_Free_where (ir_node *node, where_alloc where);
853
854 ir_node **get_Sync_preds_arr (ir_node *node);
855 int       get_Sync_n_preds (ir_node *node);
856 ir_node  *get_Sync_pred (ir_node *node, int pos);
857 void      set_Sync_pred (ir_node *node, int pos, ir_node *pred);
858
859 /** Returns the source language type of a Proj node.
860  * Must be an atomic type.  Mode of type must be mode of node.
861  */
862 type     *get_Proj_type (ir_node *node);
863
864 /** Return the predecessor of a Proj node. */
865 ir_node  *get_Proj_pred (const ir_node *node);
866 void      set_Proj_pred (ir_node *node, ir_node *pred);
867 /** Return the projection number of a Proj node. */
868 long      get_Proj_proj (const ir_node *node);
869 void      set_Proj_proj (ir_node *node, long proj);
870
871 ir_node **get_Tuple_preds_arr (ir_node *node);
872 int       get_Tuple_n_preds (ir_node *node);
873 ir_node  *get_Tuple_pred (ir_node *node, int pos);
874 void      set_Tuple_pred (ir_node *node, int pos, ir_node *pred);
875
876 ir_node  *get_Id_pred (ir_node *node);
877 void      set_Id_pred (ir_node *node, ir_node *pred);
878
879 /** Confirm has a single result and returns 'value' unchanged.
880  *  The node expresses a restriction on 'value':
881  *  'value' 'cmp' 'bound' == true.                                 */
882 ir_node *get_Confirm_value (ir_node *node);
883 void     set_Confirm_value (ir_node *node, ir_node *value);
884 ir_node *get_Confirm_bound (ir_node *node);
885 void     set_Confirm_bound (ir_node *node, ir_node *bound);
886 pn_Cmp   get_Confirm_cmp   (ir_node *node);
887 void     set_Confirm_cmp   (ir_node *node, pn_Cmp cmp);
888
889 ir_node *get_Mux_sel   (ir_node *node);
890 void     set_Mux_sel   (ir_node *node, ir_node *sel);
891 ir_node *get_Mux_false (ir_node *node);
892 void     set_Mux_false (ir_node *node, ir_node *ir_false);
893 ir_node *get_Mux_true  (ir_node *node);
894 void     set_Mux_true  (ir_node *node, ir_node *ir_true);
895
896
897 /*
898  *
899  * NAME Auxiliary routines
900  *
901  *  Not properly documented ;-)
902  *
903  */
904
905 /** returns operand of node if node is a Proj. */
906 ir_node *skip_Proj (ir_node *node);
907 /** returns operand of node if node is a Id */
908 ir_node *skip_Id  (ir_node *node);   /* Same as skip_nop. */
909 /* returns corresponding operand of Tuple if node is a Proj from
910    a Tuple. */
911 ir_node *skip_Tuple (ir_node *node);
912 /** returns operand of node if node is a Cast */
913 ir_node *skip_Cast  (ir_node *node);
914 /** returns operand of node if node is a Confirm */
915 ir_node *skip_Confirm  (ir_node *node);
916 /** Skip all high-level Operations. */
917 ir_node *skip_HighLevel(ir_node *node);
918 /** returns true if irn is a Const node. */
919 int                      is_Const(const ir_node *node);
920 /** returns true if node is a Bad node. */
921 int      is_Bad    (const ir_node *node);
922 /** returns true if the node is not a Block */
923 int      is_no_Block (const ir_node *node);
924 /** returns true if the node is a Block */
925 int      is_Block (const ir_node *node);
926 /** returns true if node is a Unknown node. */
927 int      is_Unknown (const ir_node *node);
928 /** returns true if node is a Proj node or a Filter node in
929  * intraprocedural view */
930 int      is_Proj (const ir_node *node);
931 /** Returns true if the operation manipulates control flow:
932    Start, End, Jmp, Cond, Return, Raise, Bad, CallBegin, EndReg, EndExcept */
933 int is_cfop(const ir_node *node);
934
935 /** Returns true if the operation manipulates interprocedural control flow:
936     CallBegin, EndReg, EndExcept */
937 int is_ip_cfop(const ir_node *node);
938 /** Returns true if the operation can change the control flow because
939     of an exception: Call, Quot, DivMod, Div, Mod, Load, Store, Alloc,
940     Bad. Raise is not fragile, but a unconditional jump. */
941 int is_fragile_op(const ir_node *node);
942 /** Returns the memory operand of fragile operations. */
943 ir_node *get_fragile_op_mem(ir_node *node);
944
945 /** Returns true if the operation is a forking control flow
946  *  operation: Cond. */
947 int is_forking_op(const ir_node *node);
948
949 /** Return the type associated with the value produced by n
950  *  if the node remarks this type as it is the case for
951  *  Cast, Const, SymConst and some Proj nodes. */
952 type *get_irn_type(ir_node *n);
953
954 /**
955  * Access custom node data.
956  * The data must have been registered with
957  * register_additional_node_data() before.
958  * @param node The ir node to get the data from.
959  * @param type The type of the data you registered.
960  * @param off The value returned by register_additional_node_data().
961  * @return A pointer of type @p type.
962  */
963 #define get_irn_data(node,type,off) \
964   (assert(off > 0 && "Invalid node data offset"), (type *) ((char *) (node) - (off)))
965
966 /**
967  * Get the pointer to the node some custom data belongs to.
968  * @param data The pointer to the custom data.
969  * @param off The number as returned by register_additional_node_data().
970  * @return A pointer to the ir node the custom data belongs to.
971  */
972 #define get_irn_data_base(data,off) \
973   (assert(off > 0 && "Invalid node data offset"), (ir_node *) ((char *) (data) + (off)))
974
975 /**
976  * Request additional data to be allocated with an ir node.
977  * @param size The size of the additional data required.
978  * @return A positive number, if the operation was successful, which
979  * must be passed to the access macro get_irn_data(), 0 if the
980  * registration failed.
981  */
982 unsigned register_additional_node_data(unsigned size);
983
984
985 /*-----------------------------------------------------------------*/
986 /** Debug aides                                                   **/
987 /*-----------------------------------------------------------------*/
988
989
990 /** Debug print the node.
991  *
992  *  Writes the node, all its attributes and the predecessors to stdout if DEBUG_libfirm
993  *  is set.  Else does nothing. */
994 void    dump_irn(ir_node *n);
995
996 #include "ident.h"
997
998 #ifdef __GNUC__
999 /* GNU C has the __FUNCTION__ extension */
1000 #define __MYFUNC__ __FUNCTION__
1001 #else
1002 /* use Filename instead */
1003 #define __MYFUNC__ __FILE__
1004 #endif
1005
1006 /* !!!!!!!!! @@@
1007    Don't format with "\", firmjni gets problems */
1008 /** Output location */
1009 #define DDM      printf("%s(l.%i).\n",                       __MYFUNC__, __LINE__);
1010 /** Output the firm kind of the node */
1011 #define DDMK(X)  printf("%s(l.%i) %s: %p\n",                 __MYFUNC__, __LINE__,  print_firm_kind(X), (void *)(X));
1012 /** Output information about a node */
1013
1014 /*#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))*/
1015 int dump_node_opcode(FILE *F, ir_node *n);
1016 #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)
1017
1018 /** Output information about a node and its block */
1019 #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)))
1020 /** Output information about a type */
1021 #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), (void *)(X))
1022 /** Output information about an entity */
1023 #define DDME(X)  printf("%s(l.%i) %s: %ld (%p)\n",           __MYFUNC__, __LINE__, get_entity_name(X), get_entity_nr(X), (void *)(X))
1024 /** Output information about an entity and its type */
1025 #define DDMET(X) printf("%s(l.%i) %s (typ: %s): %ld (%p)\n", __MYFUNC__, __LINE__, get_entity_name(X), get_type_name(get_entity_type(X)), get_entity_nr(X), (void *)(X))
1026 /** Output information about an entity and its owner */
1027 #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), (void *)(X))
1028 /** Output information about a graph */
1029 #define DDMG(X)  printf("%s(l.%i) graph %s: %ld (%p) in %s %s.\n", __MYFUNC__, __LINE__, get_entity_name(get_irg_entity(X)), get_irg_graph_nr(X), (void *)(X), get_type_tpop_name(get_entity_owner(get_irg_entity(X))), get_type_name(get_entity_owner(get_irg_entity(X))))
1030 /** Output information about an ident */
1031 #define DDMI(X)  printf("%s(l.%i) %s: %p\n",                 __MYFUNC__, __LINE__, get_id_str(X), (void *)(X))
1032 /** Output information about a mode */
1033 #define DDMM(X)  printf("%s(l.%i) %s: %p\n",                 __MYFUNC__, __LINE__, get_mode_name(X), (void *)(X))
1034 /** Output information about a loop */
1035 #define DDML(X)  printf("%s(l.%i) loop with depth %d: %d\n", __MYFUNC__, __LINE__, get_loop_depth(X), get_loop_loop_nr(X))
1036 /** Output information about a tarVal */
1037 #define DDMV(X)  printf("%s(l.%i) tarval: ",__MYFUNC__, __LINE__); tarval_printf(X); printf(" (%p)\n", (void *)(X));
1038
1039 /*@}*/ /* end of ir_node group definition */
1040
1041
1042 #ifdef __cplusplus
1043 }
1044 #endif
1045
1046 # endif /* _IRNODE_H_ */