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