477e5704e07042122ff65247bf3673a54652ce00
[libfirm] / ir / ir / irnode.h
1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
3 **
4 ** Authors: Martin Trapp, Christian Schaefer
5 **
6 ** declarations of an ir node
7 */
8
9 # ifndef _IRNODE_H_
10 # define _IRNODE_H_
11
12 # include "irgraph.h"
13 # include "entity.h"
14 # include "common.h"
15 # include "irop.h"
16 # include "irmode.h"
17 # include "tv.h"
18 # include "type.h"
19
20 /* The typedefiniton of ir_node is also in irgraph.h to resolve
21    recursion between irnode.h and irgraph.h */
22 #ifndef _IR_NODE_TYPEDEF_
23 #define _IR_NODE_TYPEDEF_
24 /****s* irnode/irnode
25  *
26  * NAME ir_node - a datatype representing a Firm node
27  *
28  * NOTE Not properly documented ;-)
29  *
30  * ATTRIBUTES
31  *  The common fields are:
32  *
33  *  firm_kind    A firm_kind tag containing k_type.  This is useful
34  *               for dynamically checking whether a node is a ir_node.
35  *  arity        The number of predecessors in the Firm graph.
36  *  in           A list with the predecessors in the Firm graph.  There are
37  *               routines to access individual elements and to obtain the
38  *               array.  The method returning the array should not be used.
39  *  mode         The mode of the node.  There are routines to get the mode but
40  *               also to access the mode's fields directly.
41  *  opcode       The opcode of the node.  There are routines to get the opcode but
42  *               also to access the opcode's fields directly.
43  *  node_nr      A unique number for the node.  Available only if debugging is
44  *               turned on.
45  * SOURCE
46  */
47 typedef struct ir_node ir_node;
48 #endif
49
50 /** Manipulate the fields of ir_node.  With these access routines
51     you can work on the graph without considering the different types
52     of nodes, it's just a big graph. **/
53
54 /* returns the number of predecessors without the block predecessor: */
55 int                  get_irn_arity         (ir_node *node);
56 /* returns the array with the ins: */
57 inline ir_node     **get_irn_in            (ir_node *node);
58 /* to iterate through the predecessors without touching the array. No
59    order of predecessors guaranteed.
60    To iterate over the operands iterate from 0 to i < get_irn_arity(),
61    to iterate including the Block predecessor iterate from i = -1 to
62    i < get_irn_arity. */
63 /* Access predecessor n */
64 inline ir_node      *get_irn_n             (ir_node *node, int n);
65 inline void          set_irn_n             (ir_node *node, int n, ir_node *in);
66 /* Get the mode struct. */
67 inline ir_mode      *get_irn_mode          (ir_node *node);
68 /* Get the mode-enum modecode */
69 inline modecode      get_irn_modecode      (ir_node *node);
70 /* Get the ident for a string representation of the mode */
71 inline ident        *get_irn_modeident     (ir_node *node);
72 /* Access the opcode struct of the node */
73 inline ir_op        *get_irn_op            (ir_node *node);
74 inline void          set_irn_op            (ir_node *node, ir_op *op);
75 /* Get the opcode-enum of the node */
76 inline opcode        get_irn_opcode        (ir_node *node);
77 /* Get the ident for a string representation of the opcode */
78 inline const char   *get_irn_opname        (ir_node *node);
79 inline ident        *get_irn_opident       (ir_node *node);
80 inline void          set_irn_visited (ir_node *node, unsigned long visited);
81 inline unsigned long get_irn_visited (ir_node *node);
82 inline void          set_irn_link          (ir_node *node, ir_node *link);
83 inline ir_node      *get_irn_link          (ir_node *node);
84 #ifdef DEBUG_libfirm
85 /* Outputs a unique number for this node */
86 inline long get_irn_node_nr(ir_node *node);
87 #endif
88 /*****/
89
90 /* irnode constructor                                             */
91 /* Create a new irnode in irg, with an op, mode, arity and        */
92 /* some incoming irnodes.                                         */
93 /* If arity is negative, a node with a dynamic array is created.  */
94
95 inline ir_node *
96 new_ir_node (ir_graph *irg,
97              ir_node *block,
98              ir_op *op,
99              ir_mode *mode,
100              int arity,
101              ir_node **in);
102
103 /****s* irnode/other
104  *
105  * NAME access functions for node fields.
106  *
107  * NOTE Not properly documented ;-)
108  *
109  * SOURCE
110  */
111
112 /* this works for all except Block */
113 inline ir_node  *get_nodes_Block (ir_node *node);
114 inline void      set_nodes_Block (ir_node *node, ir_node *block);
115
116 /* Projection numbers for result of Start node: use for Proj nodes! */
117 typedef enum {
118   pns_initial_exec,     /* Projection on an executable, the initial control
119                            flow. */
120   pns_global_store,     /* Projection on the global store */
121   pns_frame_base,       /* Projection on the frame base */
122   pns_globals,          /* Projection on the pointer to the data segment
123                            containing _all_ global entities. */
124   pns_args              /* Projection on all arguments */
125 } pns_number;
126
127 inline ir_node **get_Block_cfgpred_arr (ir_node *node);
128 int              get_Block_n_cfgpreds (ir_node *node);
129 /* inline void    set_Block_n_cfgpreds (ir_node *node, int n_preds); */
130 inline ir_node  *get_Block_cfgpred (ir_node *node, int pos);
131 inline void      set_Block_cfgpred (ir_node *node, int pos, ir_node *pred);
132 inline bool      get_Block_matured (ir_node *node);
133 inline void      set_Block_matured (ir_node *node, bool matured);
134 inline unsigned long get_Block_block_visited (ir_node *node);
135 inline void      set_Block_block_visited (ir_node *node, unsigned long visit);
136 inline ir_node  *get_Block_graph_arr (ir_node *node, int pos);
137 inline void      set_Block_graph_arr (ir_node *node, int pos, ir_node *value);
138
139 inline ir_node  *get_Cond_selector (ir_node *node);
140 inline void      set_Cond_selector (ir_node *node, ir_node *selector);
141
142 inline ir_node  *get_Return_mem (ir_node *node);
143 inline void      set_Return_mem (ir_node *node, ir_node *mem);
144 inline ir_node **get_Return_res_arr (ir_node *node);
145 inline int       get_Return_n_res (ir_node *node);
146 /*inline void     set_Return_n_res (ir_node *node, int results); */
147 inline ir_node  *get_Return_res (ir_node *node, int pos);
148 inline void      set_Return_res (ir_node *node, int pos, ir_node *res);
149
150 inline ir_node *get_Raise_mem (ir_node *node);
151 inline void     set_Raise_mem (ir_node *node, ir_node *mem);
152 inline ir_node *get_Raise_exo_ptr (ir_node *node);  /* PoinTeR to EXception Object */
153 inline void     set_Raise_exo_ptr (ir_node *node, ir_node *exoptr);
154
155 inline tarval  *get_Const_tarval (ir_node *node);
156 inline void     set_Const_tarval (ir_node *node, tarval *con);
157
158 /*   This enum names the three different kinds of symbolic Constants
159      represented by SymConst.  The content of the attribute type_or_id
160      depends on this tag.  Use the proper access routine after testing
161      this flag. */
162 typedef enum {
163   type_tag,          /* The SymConst is a type tag for the given type.
164                         Type_or_id_p is type *. */
165   size,              /* The SymConst is the size of the given type.
166                         Type_or_id_p is type *. */
167   linkage_ptr_info   /* The SymConst is a symbolic pointer to be filled in
168                         by the linker. Type_or_id_p is ident *. */
169 } symconst_kind;
170 typedef union type_or_id * type_or_id_p;
171 inline symconst_kind get_SymConst_kind (ir_node *node);
172 inline void          set_SymConst_kind (ir_node *node, symconst_kind num);
173 /* Only to access SymConst of kind type_tag or size.  Else assertion: */
174 inline type    *get_SymConst_type (ir_node *node);
175 inline void     set_SymConst_type (ir_node *node, type *type);
176 /* Only to access SymConst of kind linkage_ptr_info.  Else assertion: */
177 inline ident   *get_SymConst_ptrinfo (ir_node *node);
178 inline void     set_SymConst_ptrinfo (ir_node *node, ident *ptrinfo);
179 /* Sets both: type and ptrinfo.  Needed to treat the node independent of
180    its semantics.  Does a memcpy for the memory tori points to. */
181 inline type_or_id_p get_SymConst_type_or_id (ir_node *node);
182 inline void set_SymConst_type_or_id (ir_node *node, type_or_id_p tori);
183
184 inline ir_node *get_Sel_mem (ir_node *node);
185 inline void     set_Sel_mem (ir_node *node, ir_node *mem);
186 inline ir_node *get_Sel_ptr (ir_node *node);  /* ptr to the object to select from */
187 inline void     set_Sel_ptr (ir_node *node, ir_node *ptr);
188 inline ir_node **get_Sel_index_arr (ir_node *node);
189 inline int      get_Sel_n_index (ir_node *node);
190 /*inline void     set_Sel_n_index (ir_node *node, int n_index); */
191 inline ir_node *get_Sel_index (ir_node *node, int pos);
192 inline void     set_Sel_index (ir_node *node, int pos, ir_node *index);
193 inline entity  *get_Sel_entity (ir_node *node); /* entity to select */
194 inline void     set_Sel_entity (ir_node *node, entity *ent);
195 typedef enum {
196   static_linkage,       /* entity is used internal and not visible out of this
197                            file/class. */
198   external_linkage,     /* */
199   no_linkage
200 } linkage_type;
201 inline linkage_type get_Sel_linkage_type (ir_node *node);
202 inline void     set_Sel_linkage_type (ir_node *node, linkage_type lt);
203
204 inline ir_node *get_Call_mem (ir_node *node);
205 inline void     set_Call_mem (ir_node *node, ir_node *mem);
206 inline ir_node *get_Call_ptr (ir_node *node);
207 inline void     set_Call_ptr (ir_node *node, ir_node *ptr);
208 inline ir_node **get_Call_param_arr (ir_node *node);
209 inline int      get_Call_n_params (ir_node *node);
210 inline int      get_Call_arity (ir_node *node);
211 /* inline void     set_Call_arity (ir_node *node, ir_node *arity); */
212 inline ir_node *get_Call_param (ir_node *node, int pos);
213 inline void     set_Call_param (ir_node *node, int pos, ir_node *param);
214 inline type    *get_Call_type (ir_node *node);
215 inline void     set_Call_type (ir_node *node, type *type);
216
217 /* For unary and binary arithmetic operations the access to the
218    operands can be factored out.  Left is the first, right the
219    second arithmetic value  as listed in tech report 1999-44.
220    unops are: Minus, Abs, Not, Conv
221    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
222    Shr, Shrs, Rot, Cmp */
223 inline int      is_unop (ir_node *node);
224 inline ir_node *get_unop_op (ir_node *node);
225 inline void     set_unop_op (ir_node *node, ir_node *op);
226 inline int      is_binop (ir_node *node);
227 inline ir_node *get_binop_left (ir_node *node);
228 inline void     set_binop_left (ir_node *node, ir_node *left);
229 inline ir_node *get_binop_right (ir_node *node);
230 inline void     set_binop_right (ir_node *node, ir_node *right);
231
232 inline ir_node *get_Add_left (ir_node *node);
233 inline void     set_Add_left (ir_node *node, ir_node *left);
234 inline ir_node *get_Add_right (ir_node *node);
235 inline void     set_Add_right (ir_node *node, ir_node *right);
236
237 inline ir_node *get_Sub_left (ir_node *node);
238 inline void     set_Sub_left (ir_node *node, ir_node *left);
239 inline ir_node *get_Sub_right (ir_node *node);
240 inline void     set_Sub_right (ir_node *node, ir_node *right);
241
242 inline ir_node *get_Minus_op (ir_node *node);
243 inline void     set_Minus_op (ir_node *node, ir_node *op);
244
245 inline ir_node *get_Mul_left (ir_node *node);
246 inline void     set_Mul_left (ir_node *node, ir_node *left);
247 inline ir_node *get_Mul_right (ir_node *node);
248 inline void     set_Mul_right (ir_node *node, ir_node *right);
249
250 inline ir_node *get_Quot_left (ir_node *node);
251 inline void     set_Quot_left (ir_node *node, ir_node *left);
252 inline ir_node *get_Quot_right (ir_node *node);
253 inline void     set_Quot_right (ir_node *node, ir_node *right);
254 inline ir_node *get_Quot_mem (ir_node *node);
255 inline void     set_Quot_mem (ir_node *node, ir_node *mem);
256
257 inline ir_node *get_DivMod_left (ir_node *node);
258 inline void     set_DivMod_left (ir_node *node, ir_node *left);
259 inline ir_node *get_DivMod_right (ir_node *node);
260 inline void     set_DivMod_right (ir_node *node, ir_node *right);
261 inline ir_node *get_DivMod_mem (ir_node *node);
262 inline void     set_DivMod_mem (ir_node *node, ir_node *mem);
263
264 inline ir_node *get_Div_left (ir_node *node);
265 inline void     set_Div_left (ir_node *node, ir_node *left);
266 inline ir_node *get_Div_right (ir_node *node);
267 inline void     set_Div_right (ir_node *node, ir_node *right);
268 inline ir_node *get_Div_mem (ir_node *node);
269 inline void     set_Div_mem (ir_node *node, ir_node *mem);
270
271 inline ir_node *get_Mod_left (ir_node *node);
272 inline void     set_Mod_left (ir_node *node, ir_node *left);
273 inline ir_node *get_Mod_right (ir_node *node);
274 inline void     set_Mod_right (ir_node *node, ir_node *right);
275 inline ir_node *get_Mod_mem (ir_node *node);
276 inline void     set_Mod_mem (ir_node *node, ir_node *mem);
277
278 inline ir_node *get_Abs_op (ir_node *node);
279 inline void     set_Abs_op (ir_node *node, ir_node *op);
280
281 inline ir_node *get_And_left (ir_node *node);
282 inline void     set_And_left (ir_node *node, ir_node *left);
283 inline ir_node *get_And_right (ir_node *node);
284 inline void     set_And_right (ir_node *node, ir_node *right);
285
286 inline ir_node *get_Or_left (ir_node *node);
287 inline void     set_Or_left (ir_node *node, ir_node *left);
288 inline ir_node *get_Or_right (ir_node *node);
289 inline void     set_Or_right (ir_node *node, ir_node *right);
290
291 inline ir_node *get_Eor_left (ir_node *node);
292 inline void     set_Eor_left (ir_node *node, ir_node *left);
293 inline ir_node *get_Eor_right (ir_node *node);
294 inline void     set_Eor_right (ir_node *node, ir_node *right);
295
296 inline ir_node *get_Not_op (ir_node *node);
297 inline void     set_Not_op (ir_node *node, ir_node *op);
298
299 /* Projection numbers of compare: use for Proj nodes! */
300 typedef enum {
301   False,                /* false */
302   Eq,                   /* equal */
303   Lt,                   /* less */
304   Le,                   /* less or equal */
305   Gt,                   /* greater */
306   Ge,                   /* greater or equal */
307   Lg,                   /* less or greater */
308   Leg,                  /* less, equal or greater = ordered */
309   Uo,                   /* unordered */
310   Ue,                   /* unordered or equal */
311   Ul,                   /* unordered or less */
312   Ule,                  /* unordered, less or equal */
313   Ug,                   /* unordered or greater */
314   Uge,                  /* unordered, greater or equal */
315   Ne,                   /* unordered, less or greater = not equal */
316   True,                 /* true */
317   not_mask = Leg        /* bits to flip to negate comparison */
318 } pnc_number;
319 inline char *get_pnc_string(int pnc);
320 inline int   get_negated_pnc(int pnc);
321 inline ir_node *get_Cmp_left (ir_node *node);
322 inline void     set_Cmp_left (ir_node *node, ir_node *left);
323 inline ir_node *get_Cmp_right (ir_node *node);
324 inline void     set_Cmp_right (ir_node *node, ir_node *right);
325
326 inline ir_node *get_Shl_left (ir_node *node);
327 inline void     set_Shl_left (ir_node *node, ir_node *left);
328 inline ir_node *get_Shl_right (ir_node *node);
329 inline void     set_Shl_right (ir_node *node, ir_node *right);
330
331 inline ir_node *get_Shr_left (ir_node *node);
332 inline void     set_Shr_left (ir_node *node, ir_node *left);
333 inline ir_node *get_Shr_right (ir_node *node);
334 inline void     set_Shr_right (ir_node *node, ir_node *right);
335
336 inline ir_node *get_Shrs_left (ir_node *node);
337 inline void     set_Shrs_left (ir_node *node, ir_node *left);
338 inline ir_node *get_Shrs_right (ir_node *node);
339 inline void     set_Shrs_right (ir_node *node, ir_node *right);
340
341 inline ir_node *get_Rot_left (ir_node *node);
342 inline void     set_Rot_left (ir_node *node, ir_node *left);
343 inline ir_node *get_Rot_right (ir_node *node);
344 inline void     set_Rot_right (ir_node *node, ir_node *right);
345
346 inline ir_node *get_Conv_op (ir_node *node);
347 inline void     set_Conv_op (ir_node *node, ir_node *op);
348
349 inline ir_node **get_Phi_preds_arr (ir_node *node);
350 inline int       get_Phi_n_preds (ir_node *node);
351 /* inline void     set_Phi_n_preds (ir_node *node, int n_preds); */
352 inline ir_node  *get_Phi_pred (ir_node *node, int pos);
353 inline void      set_Phi_pred (ir_node *node, int pos, ir_node *pred);
354
355 inline ir_node *get_Load_mem (ir_node *node);
356 inline void     set_Load_mem (ir_node *node, ir_node *mem);
357 inline ir_node *get_Load_ptr (ir_node *node);
358 inline void     set_Load_ptr (ir_node *node, ir_node *ptr);
359
360 inline ir_node *get_Store_mem (ir_node *node);
361 inline void     set_Store_mem (ir_node *node, ir_node *mem);
362 inline ir_node *get_Store_ptr (ir_node *node);
363 inline void     set_Store_ptr (ir_node *node, ir_node *ptr);
364 inline ir_node *get_Store_value (ir_node *node);
365 inline void     set_Store_value (ir_node *node, ir_node *value);
366
367 inline ir_node *get_Alloc_mem (ir_node *node);
368 inline void     set_Alloc_mem (ir_node *node, ir_node *mem);
369 inline ir_node *get_Alloc_size (ir_node *node);
370 inline void     set_Alloc_size (ir_node *node, ir_node *size);
371 inline type    *get_Alloc_type (ir_node *node);
372 inline void     set_Alloc_type (ir_node *node, type *type);
373 typedef enum {
374   stack_alloc,          /* Alloc allocates the object on the stack. */
375   heap_alloc            /* Alloc allocates the object on the heap. */
376 } where_alloc;
377 inline where_alloc  get_Alloc_where (ir_node *node);
378 inline void         set_Alloc_where (ir_node *node, where_alloc where);
379
380 inline ir_node *get_Free_mem (ir_node *node);
381 inline void     set_Free_mem (ir_node *node, ir_node *mem);
382 inline ir_node *get_Free_ptr (ir_node *node);
383 inline void     set_Free_ptr (ir_node *node, ir_node *ptr);
384 inline ir_node *get_Free_size (ir_node *node);
385 inline void     set_Free_size (ir_node *node, ir_node *size);
386 inline type    *get_Free_type (ir_node *node);
387 inline void     set_Free_type (ir_node *node, type *type);
388
389 inline ir_node **get_Sync_preds_arr (ir_node *node);
390 inline int       get_Sync_n_preds (ir_node *node);
391 /* inline void     set_Sync_n_preds (ir_node *node, int n_preds); */
392 inline ir_node  *get_Sync_pred (ir_node *node, int pos);
393 inline void      set_Sync_pred (ir_node *node, int pos, ir_node *pred);
394
395 inline ir_node  *get_Proj_pred (ir_node *node);
396 inline void      set_Proj_pred (ir_node *node, ir_node *pred);
397 inline long      get_Proj_proj (ir_node *node);
398 inline void      set_Proj_proj (ir_node *node, long proj);
399
400 inline ir_node **get_Tuple_preds_arr (ir_node *node);
401 inline int       get_Tuple_n_preds (ir_node *node);
402 /* inline void     set_Tuple_n_preds (ir_node *node, int n_preds); */
403 inline ir_node  *get_Tuple_pred (ir_node *node, int pos);
404 inline void      set_Tuple_pred (ir_node *node, int pos, ir_node *pred);
405
406 inline ir_node  *get_Id_pred (ir_node *node);
407 inline void      set_Id_pred (ir_node *node, ir_node *pred);
408
409 /*****/
410
411 /****s* irnode/other2
412  *
413  * NAME Auxiliary routines
414  *
415  * NOTE Not properly documented ;-)
416  *
417  * SOURCE
418  */
419
420 /* returns operand of node if node is a Proj. */
421 inline ir_node *skip_Proj (ir_node *node);
422 /* returns operand of node if node is a Id */
423 inline ir_node *skip_nop  (ir_node *node);
424 /* returns true if node is a Bad node. */
425 inline int      is_Bad    (ir_node *node);
426 /* returns true if the node is not a Block */
427 inline int      is_no_Block (ir_node *node);
428 /* Returns true if the operation manipulates control flow:
429    Start, End, Jmp, Cond, Return, Raise */
430 int is_cfop(ir_node *node);
431 /* Returns true if the operation can change the control flow because
432    of an exception. */
433 int is_fragile_op(ir_node *node);
434
435 /*****/
436
437 /* Makros for debugging the libfirm */
438 #ifdef DEBUG_libfirm
439 #include "ident.h"
440
441 #define DDMSG        printf("%s(l.%i)\n", __FUNCTION__, __LINE__)
442 #define DDMSG1(X)    printf("%s(l.%i) %s\n", __FUNCTION__, __LINE__,         \
443                             id_to_str(get_irn_opident(X)))
444 #define DDMSG2(X)    printf("%s(l.%i) %s: %ld\n", __FUNCTION__, __LINE__,     \
445                      id_to_str(get_irn_opident(X)), get_irn_node_nr(X))
446 #define DDMSG3(X)    printf("%s(l.%i) %s: %p\n", __FUNCTION__, __LINE__,     \
447                      print_firm_kind(X), (X))
448
449 #endif
450
451 # endif /* _IRNODE_H_ */