Fixed comments and convert them to doxygen.
[libfirm] / ir / tr / entity.c
1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 * All rights reserved.
3 *
4 * Authors: Martin Trapp, Christian Schaefer
5 *
6 */
7
8 /* $Id$ */
9
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13
14 # include <stdlib.h>
15 # include <stddef.h>
16 # include <string.h>
17
18 # include "entity_t.h"
19 # include "mangle.h"
20 # include "typegmod_t.h"
21 # include "array.h"
22 /* All this is needed to build the constant node for methods: */
23 # include "irprog.h"
24 # include "ircons.h"
25
26 /*******************************************************************/
27 /** general                                                       **/
28 /*******************************************************************/
29
30 void
31 init_entity (void)
32 {
33 }
34
35 /*******************************************************************/
36 /** ENTITY                                                        **/
37 /*******************************************************************/
38
39 INLINE type *get_entity_owner (entity *ent);
40
41 INLINE void insert_entity_in_owner (entity *ent) {
42   type *owner = ent->owner;
43   switch (get_type_tpop_code(owner)) {
44   case tpo_class: {
45     add_class_member (owner, ent);
46   } break;
47   case tpo_struct: {
48     add_struct_member (owner, ent);
49   } break;
50   case tpo_union: {
51     add_union_member (owner, ent);
52   } break;
53   case tpo_array: {
54     set_array_element_entity(owner, ent);
55   } break;
56   default: assert(0);
57   }
58 }
59
60 entity *
61 new_entity (type *owner, ident *name, type *type)
62 {
63   entity *res;
64   ir_graph *rem;
65
66   res = (entity *) malloc (sizeof (entity));
67   res->kind = k_entity;
68   assert_legal_owner_of_ent(owner);
69   res->owner = owner;
70   res->name = name;
71   res->type = type;
72   if (get_type_tpop(type) == type_method)
73     res->allocation = static_allocated;
74   else
75     res->allocation = automatic_allocated;
76   res->visibility = local;
77   res->offset = -1;
78   if (is_method_type(type)) {
79     res->variability = constant;
80     rem = current_ir_graph;
81     current_ir_graph = get_const_code_irg();
82     res->value = new_Const(mode_P, tarval_P_from_entity(res));
83     current_ir_graph = rem;
84   } else {
85     res->variability = uninitialized;
86   }
87   res->peculiarity = existent;
88   res->volatility = non_volatile;
89   res->ld_name = NULL;
90   res->overwrites = NEW_ARR_F(entity *, 1);
91   res->overwrittenby = NEW_ARR_F(entity *, 1);
92
93   res->irg = NULL;
94
95   res->visit = 0;
96
97   /* Remember entity in it's owner. */
98   insert_entity_in_owner (res);
99   return res;
100 }
101 entity *
102 new_d_entity (type *owner, ident *name, type *type, dbg_info *db) {
103   entity *res = new_entity(owner, name, type);
104   set_entity_dbg_info(res, db);
105   return res;
106 }
107 INLINE void free_entity_attrs(entity *ent) {
108   assert(ent);
109   if (get_type_tpop(get_entity_owner(ent)) == type_class) {
110     DEL_ARR_F(ent->overwrites);
111     DEL_ARR_F(ent->overwrittenby);
112   }
113 }
114
115 entity *
116 copy_entity_own (entity *old, type *new_owner) {
117   entity *new;
118
119   assert_legal_owner_of_ent(new_owner);
120   if (old->owner == new_owner) return old;
121   new = (entity *) malloc (sizeof (entity));
122   memcpy (new, old, sizeof (entity));
123   new->owner = new_owner;
124   /*
125   if ((get_type_tpop(get_entity_owner(old)) == type_class) &&
126       (get_type_tpop(new_owner) == type_class)) {
127     new->overwrites = DUP_ARR_F(entity *, old->overwrites);
128     new->overwrittenby = DUP_ARR_F(entity *, old->overwrittenby);
129   } else if ((get_type_tpop(get_entity_owner(old)) != type_class) &&
130              (get_type_tpop(new_owner) == type_class)) {
131     new->overwrites = NEW_ARR_F(entity *, 1);
132     new->overwrittenby = NEW_ARR_F(entity *, 1);
133   }
134   */
135   if (is_class_type(new_owner)) {
136     new->overwrites = NEW_ARR_F(entity *, 1);
137     new->overwrittenby = NEW_ARR_F(entity *, 1);
138   }
139
140   insert_entity_in_owner (new);
141
142   return new;
143 }
144
145 entity *
146 copy_entity_name (entity *old, ident *new_name) {
147   entity *new;
148
149   if (old->name == new_name) return old;
150   new = (entity *) malloc (sizeof (entity));
151   memcpy (new, old, sizeof (entity));
152   new->name = new_name;
153   new->ld_name = NULL;
154   new->overwrites = DUP_ARR_F(entity *, old->overwrites);
155   new->overwrittenby = DUP_ARR_F(entity *, old->overwrittenby);
156
157   insert_entity_in_owner (new);
158
159   return new;
160 }
161
162 void
163 free_entity (entity *ent) {
164   free_entity_attrs(ent);
165   free(ent);
166 }
167
168 INLINE const char *
169 get_entity_name (entity *ent) {
170   assert (ent);
171   return id_to_str(get_entity_ident(ent));
172 }
173
174 ident *
175 get_entity_ident    (entity *ent) {
176   assert(ent);
177   return ent->name;
178 }
179
180 /*
181 void   set_entitye_ld_name  (entity *, char *ld_name);
182 void   set_entity_ld_ident (entity *, ident *ld_ident);
183 */
184
185 INLINE type *
186 get_entity_owner (entity *ent) {
187   return ent->owner = skip_tid(ent->owner);
188 }
189
190 INLINE void
191 set_entity_owner (entity *ent, type *owner) {
192   assert_legal_owner_of_ent(owner);
193   ent->owner = owner;
194 }
195
196 INLINE void   /* should this go into type.c? */
197 assert_legal_owner_of_ent(type *owner) {
198   assert (get_type_tpop_code(owner) == tpo_class ||
199           get_type_tpop_code(owner) == tpo_union ||
200           get_type_tpop_code(owner) == tpo_struct ||
201           get_type_tpop_code(owner) == tpo_array);   /* Yes, array has an entity
202                                                         -- to select fields! */
203 }
204
205 INLINE ident *
206 get_entity_ld_ident (entity *ent)
207 {
208   if (ent->ld_name == NULL)
209     ent->ld_name = mangle_entity (ent);
210   return ent->ld_name;
211 }
212
213 INLINE void
214 set_entity_ld_ident (entity *ent, ident *ld_ident) {
215   ent->ld_name = ld_ident;
216 }
217
218 INLINE const char *
219 get_entity_ld_name (entity *ent) {
220   return id_to_str(get_entity_ld_ident(ent));
221 }
222
223 /*
224 char  *get_entity_ld_name  (entity *);
225 void   set_entity_ld_name  (entity *, char *ld_name);
226 */
227
228 INLINE type *
229 get_entity_type (entity *ent) {
230   return ent->type = skip_tid(ent->type);
231 }
232
233 INLINE void
234 set_entity_type (entity *ent, type *type) {
235   ent->type = type;
236 }
237
238
239 INLINE ent_allocation
240 get_entity_allocation (entity *ent) {
241   return ent->allocation;
242 }
243
244 INLINE void
245 set_entity_allocation (entity *ent, ent_allocation al) {
246   ent->allocation = al;
247 }
248
249
250 INLINE ent_visibility
251 get_entity_visibility (entity *ent) {
252   return ent->visibility;
253 }
254
255 INLINE void
256 set_entity_visibility (entity *ent, ent_visibility vis) {
257   if (vis != local)
258     assert((ent->allocation == static_allocated) ||
259            (ent->allocation == automatic_allocated));
260   // @@@ Test that the owner type is not local, but how??
261   //       && get_class_visibility(get_entity_owner(ent)) != local));
262   ent->visibility = vis;
263 }
264
265 INLINE ent_variability
266 get_entity_variability (entity *ent) {
267   return ent->variability;
268 }
269
270 INLINE void
271 set_entity_variability (entity *ent, ent_variability var){
272   if (var == part_constant)
273     assert(is_class_type(ent->type) || is_struct_type(ent->type));
274   if ((is_compound_type(ent->type)) &&
275       (ent->variability == uninitialized) && (var != uninitialized)) {
276     /* Allocate datastructures for constant values */
277     ent->values = NEW_ARR_F(ir_node *, 1);
278     ent->val_ents = NEW_ARR_F(entity *, 1);
279   }
280   if ((is_compound_type(ent->type)) &&
281       (var == uninitialized) && (ent->variability != uninitialized)) {
282     /* Free datastructures for constant values */
283     DEL_ARR_F(ent->values);
284     DEL_ARR_F(ent->val_ents);
285   }
286   ent->variability = var;
287 }
288
289
290 INLINE ent_volatility
291 get_entity_volatility (entity *ent) {
292   assert (ent);
293   return ent->volatility;
294 }
295
296 INLINE void
297 set_entity_volatility (entity *ent, ent_volatility vol) {
298   assert (ent);
299   ent->volatility = vol;
300 }
301
302 INLINE peculiarity
303 get_entity_peculiarity (entity *ent) {
304   assert (ent);
305   return ent->peculiarity;
306 }
307
308 INLINE void
309 set_entity_peculiarity (entity *ent, peculiarity pec) {
310   assert (ent);
311   /* @@@ why peculiarity only for methods? */
312   assert (is_method_type(ent->type));
313   ent->peculiarity = pec;
314 }
315
316 /* Set has no effect for entities of type method. */
317 INLINE ir_node *
318 get_atomic_ent_value(entity *ent) {
319   assert(ent); assert(is_atomic_entity(ent));
320   assert((ent->variability != uninitialized));
321   return ent->value;
322 }
323
324 INLINE void
325 set_atomic_ent_value(entity *ent, ir_node *val) {
326   assert(ent && is_atomic_entity(ent) && (ent->variability != uninitialized));
327   if (is_method_type(ent->type)) return;
328   ent->value = val;
329 }
330
331
332 ir_node *copy_const_value(ir_node *n) {
333   ir_node *nn;
334   ir_mode *m;
335
336   m = get_irn_mode(n);
337   switch(get_irn_opcode(n)) {
338   case iro_Const:
339     nn = new_Const(m, get_Const_tarval(n)); break;
340   case iro_SymConst:
341     nn = new_SymConst(get_SymConst_type_or_id(n), get_SymConst_kind(n)); break;
342   case iro_Add:
343     nn = new_Add(copy_const_value(get_Add_left(n)), copy_const_value(get_Add_right(n)), m); break;
344   default:
345     assert(0 && "opdope invalid or not implemented"); break;
346   }
347   return nn;
348 }
349
350 /* A value of a compound entity is a pair of value and the corresponding member of
351    the compound. */
352 INLINE void
353 add_compound_ent_value(entity *ent, ir_node *val, entity *member) {
354   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
355   ARR_APP1 (ir_node *, ent->values, val);
356   ARR_APP1 (entity *, ent->val_ents, member);
357 }
358
359 /* Copies the firm subgraph referenced by val to const_code_irg and adds
360    the node as constant initialization to ent.
361    The subgraph may not contain control flow operations.
362 INLINE void
363 copy_and_add_compound_ent_value(entity *ent, ir_node *val, entity *member) {
364   ir_graph *rem = current_ir_graph;
365
366   assert(get_entity_variability(ent) != uninitialized);
367   current_ir_graph = get_const_code_irg();
368
369   val = copy_const_value(val);
370   add_compound_ent_value(ent, val, member);
371   current_ir_graph = rem;
372   }*/
373
374 INLINE int
375 get_compound_ent_n_values(entity *ent) {
376   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
377   return (ARR_LEN (ent->values))-1;
378 }
379
380 INLINE ir_node  *
381 get_compound_ent_value(entity *ent, int pos) {
382   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
383   return ent->values[pos+1];
384 }
385
386 /* Copies the value i of the entity to current_block in current_ir_graph.
387 ir_node *
388 copy_compound_ent_value(entity *ent, int pos) {
389   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
390   return copy_const_value(ent->values[pos+1]);
391   }*/
392
393 INLINE entity   *
394 get_compound_ent_value_member(entity *ent, int pos) {
395   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
396   return ent->val_ents[pos+1];
397 }
398
399 INLINE void
400 set_compound_ent_value(entity *ent, ir_node *val, entity *member, int pos) {
401   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
402   ent->values[pos+1] = val;
403   ent->val_ents[pos+1] = member;
404 }
405
406 void
407 remove_compound_ent_value(entity *ent, entity *value_ent) {
408   int i;
409   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
410   for (i = 1; i < (ARR_LEN (ent->val_ents)); i++) {
411     if (ent->val_ents[i] == value_ent) {
412       for(; i < (ARR_LEN (ent->val_ents))-1; i++) {
413         ent->val_ents[i] = ent->val_ents[i+1];
414         ent->values[i]   = ent->values[i+1];
415       }
416       ARR_SETLEN(entity*,  ent->val_ents, ARR_LEN(ent->val_ents) - 1);
417       ARR_SETLEN(ir_node*, ent->values,   ARR_LEN(ent->values) - 1);
418       break;
419     }
420   }
421 }
422
423 void
424 set_array_entity_values(entity *ent, tarval **values, int num_vals) {
425   int i;
426   ir_graph *rem = current_ir_graph;
427   type *arrtp = get_entity_type(ent);
428   ir_node *val;
429
430   assert(is_array_type(arrtp));
431   assert(get_array_n_dimensions(arrtp) == 1);
432   /* One bound is sufficient, the nunmber of constant fields makes the
433      size. */
434   assert(get_array_lower_bound (arrtp, 0) || get_array_upper_bound (arrtp, 0));
435   assert(get_entity_variability(ent) != uninitialized);
436   current_ir_graph = get_const_code_irg();
437
438   for (i = 0; i < num_vals; i++) {
439     val = new_Const(get_tv_mode (values[i]), values[i]);
440     add_compound_ent_value(ent, val, get_array_element_entity(arrtp));
441   }
442   current_ir_graph = rem;
443 }
444
445 INLINE int
446 get_entity_offset (entity *ent) {
447   return ent->offset;
448 }
449
450 INLINE void
451 set_entity_offset (entity *ent, int offset) {
452   ent->offset = offset;
453 }
454
455 INLINE void
456 add_entity_overwrites   (entity *ent, entity *overwritten) {
457   assert(ent);
458   assert(is_class_type(get_entity_owner(ent)));
459   ARR_APP1 (entity *, ent->overwrites, overwritten);
460   ARR_APP1 (entity *, overwritten->overwrittenby, ent);
461 }
462
463 INLINE int
464 get_entity_n_overwrites (entity *ent) {
465   assert(ent);
466   assert(is_class_type(get_entity_owner(ent)));
467   return (ARR_LEN (ent->overwrites))-1;
468 }
469
470 int
471 get_entity_overwrites_index(entity *ent, entity *overwritten) {
472   int i;
473   assert(ent && is_class_type(get_entity_owner(ent)));
474   for (i = 0; i < get_entity_n_overwrites(ent); i++)
475     if (get_entity_overwrites(ent, i) == overwritten)
476       return i;
477   return -1;
478 }
479
480 INLINE entity *
481 get_entity_overwrites   (entity *ent, int pos) {
482   assert(ent);
483   assert(is_class_type(get_entity_owner(ent)));
484   assert(pos < get_entity_n_overwrites(ent));
485   return ent->overwrites[pos+1];
486 }
487
488 INLINE void
489 set_entity_overwrites   (entity *ent, int pos, entity *overwritten) {
490   assert(ent);
491   assert(is_class_type(get_entity_owner(ent)));
492   assert(pos < get_entity_n_overwrites(ent));
493   ent->overwrites[pos+1] = overwritten;
494 }
495
496 void
497 remove_entity_overwrites(entity *ent, entity *overwritten) {
498   int i;
499   assert(ent && is_class_type(get_entity_owner(ent)));
500   for (i = 1; i < (ARR_LEN (ent->overwrites)); i++)
501     if (ent->overwrites[i] == overwritten) {
502       for(; i < (ARR_LEN (ent->overwrites))-1; i++)
503         ent->overwrites[i] = ent->overwrites[i+1];
504       ARR_SETLEN(entity*, ent->overwrites, ARR_LEN(ent->overwrites) - 1);
505       break;
506     }
507 }
508
509 INLINE void
510 add_entity_overwrittenby   (entity *ent, entity *overwrites) {
511   assert(ent);
512   assert(is_class_type(get_entity_owner(ent)));
513   add_entity_overwrites(overwrites, ent);
514 }
515
516 INLINE int
517 get_entity_n_overwrittenby (entity *ent) {
518   assert(ent);
519   assert(is_class_type(get_entity_owner(ent)));
520   return (ARR_LEN (ent->overwrittenby))-1;
521 }
522
523 int
524 get_entity_overwrittenby_index(entity *ent, entity *overwrites) {
525   int i;
526   assert(ent && is_class_type(get_entity_owner(ent)));
527   for (i = 0; i < get_entity_n_overwrittenby(ent); i++)
528     if (get_entity_overwrittenby(ent, i) == overwrites)
529       return i;
530   return -1;
531 }
532
533 INLINE entity *
534 get_entity_overwrittenby   (entity *ent, int pos) {
535   assert(ent);
536   assert(is_class_type(get_entity_owner(ent)));
537   assert(pos < get_entity_n_overwrittenby(ent));
538   return ent->overwrittenby[pos+1];
539 }
540
541 INLINE void
542 set_entity_overwrittenby   (entity *ent, int pos, entity *overwrites) {
543   assert(ent);
544   assert(is_class_type(get_entity_owner(ent)));
545   assert(pos < get_entity_n_overwrittenby(ent));
546   ent->overwrittenby[pos+1] = overwrites;
547 }
548
549 void    remove_entity_overwrittenby(entity *ent, entity *overwrites) {
550   int i;
551   assert(ent && is_class_type(get_entity_owner(ent)));
552   for (i = 1; i < (ARR_LEN (ent->overwrittenby)); i++)
553     if (ent->overwrittenby[i] == overwrites) {
554       for(; i < (ARR_LEN (ent->overwrittenby))-1; i++)
555         ent->overwrittenby[i] = ent->overwrittenby[i+1];
556       ARR_SETLEN(entity*, ent->overwrittenby, ARR_LEN(ent->overwrittenby) - 1);
557       break;
558     }
559 }
560
561 /* A link to store intermediate information */
562 void *
563 get_entity_link(entity *ent) {
564   assert(ent);
565   return ent->link;
566 }
567
568 void
569 set_entity_link(entity *ent, void *l) {
570   assert(ent);
571   ent->link = l;
572 }
573
574 INLINE ir_graph *
575 get_entity_irg(entity *ent) {
576   assert (ent);
577   assert (is_method_type(ent->type));
578   return ent->irg;
579 }
580
581 INLINE void
582 set_entity_irg(entity *ent, ir_graph *irg) {
583   assert (ent && ent->type);
584   /* Wie kann man die Referenz auf einen IRG löschen, z.B. wenn die
585    * Methode selbst nicht mehr aufgerufen werden kann, die Entität
586    * aber erhalten bleiben soll. */
587   /* assert (irg); */
588   assert (is_method_type(ent->type));
589   assert (ent->peculiarity == existent);
590   ent->irg = irg;
591 }
592
593 int is_entity (void *thing) {
594   assert(thing);
595   if (get_kind(thing) == k_entity)
596     return 1;
597   else
598     return 0;
599 }
600
601 int is_atomic_entity(entity *ent) {
602   type* t = get_entity_type(ent);
603   return (is_primitive_type(t) || is_pointer_type(t) ||
604           is_enumeration_type(t) || is_method_type(t));
605 }
606
607 int is_compound_entity(entity *ent) {
608   type* t = get_entity_type(ent);
609   return (is_class_type(t) || is_struct_type(t) ||
610           is_array_type(t) || is_union_type(t));
611 }
612
613 /* @@@ not implemnted!!! */
614 bool equal_entity(entity *ent1, entity *ent2) {
615   printf(" calling unimplemented equal entity!!! \n");
616   return true;
617 }
618
619
620 unsigned long get_entity_visited(entity *ent) {
621   assert (ent);
622   return ent->visit;
623 }
624 void        set_entity_visited(entity *ent, unsigned long num) {
625   assert (ent);
626   ent->visit = num;
627 }
628 /* Sets visited field in entity to entity_visited. */
629 void        mark_entity_visited(entity *ent) {
630   assert (ent);
631   ent->visit = type_visited;
632 }
633
634
635 INLINE bool entity_visited(entity *ent) {
636   return get_entity_visited(ent) >= type_visited;
637 }
638 INLINE bool entity_not_visited(entity *ent) {
639   return get_entity_visited(ent) < type_visited;
640 }