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