New directory: ana for analyses. Adapted configure/makefiles
[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 "entity_t.h"
17 # include "mangle.h"
18 # include "typegmod_t.h"
19 # include "array.h"
20 /* All this is needed to build the constant node for methods: */
21 # include "irprog.h"
22 # include "ircons.h"
23
24 /*******************************************************************/
25 /** general                                                       **/
26 /*******************************************************************/
27
28 void
29 init_entity (void)
30 {
31 }
32
33 /*******************************************************************/
34 /** ENTITY                                                        **/
35 /*******************************************************************/
36
37 inline void insert_entity_in_owner (entity *ent) {
38   type *owner = ent->owner;
39   switch (get_type_tpop_code(owner)) {
40   case tpo_class: {
41     add_class_member (owner, ent);
42   } break;
43   case tpo_struct: {
44     add_struct_member (owner, ent);
45   } break;
46   case tpo_union: {
47     add_union_member (owner, ent);
48   } break;
49   case tpo_array: {
50     set_array_element_entity(owner, ent);
51   } break;
52   default: assert(0);
53   }
54 }
55
56 entity *
57 new_entity (type *owner, ident *name, type *type)
58 {
59   entity *res;
60   ir_graph *rem;
61
62   res = (entity *) malloc (sizeof (entity));
63   res->kind = k_entity;
64   assert_legal_owner_of_ent(owner);
65   res->owner = owner;
66   res->name = name;
67   res->type = type;
68   if (get_type_tpop(type) == type_method)
69     res->allocation = static_allocated;
70   else
71     res->allocation = automatic_allocated;
72   res->visibility = local;
73   res->offset = -1;
74   if (is_method_type(type)) {
75     res->variability = constant;
76     rem = current_ir_graph;
77     current_ir_graph = get_const_code_irg();
78     res->value = new_Const(mode_p, tarval_p_from_entity(res));
79     current_ir_graph = rem;
80   } else {
81     res->variability = uninitialized;
82   }
83   res->volatility = non_volatile;
84   res->ld_name = NULL;
85   res->overwrites = NEW_ARR_F(entity *, 1);
86
87   res->visit = 0;
88
89   /* Remember entity in it's owner. */
90   insert_entity_in_owner (res);
91   return res;
92 }
93 inline void free_entity_attrs(entity *ent) {
94   assert(ent);
95   DEL_ARR_F(ent->overwrites);
96 }
97
98 entity *
99 copy_entity_own (entity *old, type *new_owner) {
100   entity *new;
101
102   assert_legal_owner_of_ent(new_owner);
103   if (old->owner == new_owner) return old;
104   new = (entity *) malloc (sizeof (entity));
105   memcpy (new, old, sizeof (entity));
106   new->owner = new_owner;
107   new->overwrites = DUP_ARR_F(entity *, old->overwrites);
108
109   insert_entity_in_owner (new);
110
111   return new;
112 }
113
114 entity *
115 copy_entity_name (entity *old, ident *new_name) {
116   entity *new;
117
118   if (old->name == new_name) return old;
119   new = (entity *) malloc (sizeof (entity));
120   memcpy (new, old, sizeof (entity));
121   new->name = new_name;
122   new->ld_name = NULL;
123   new->overwrites = DUP_ARR_F(entity *, old->overwrites);
124
125   insert_entity_in_owner (new);
126
127   return new;
128 }
129
130 inline const char *
131 get_entity_name (entity *ent) {
132   assert (ent);
133   return id_to_str(get_entity_ident(ent));
134 }
135
136 ident *
137 get_entity_ident    (entity *ent) {
138   assert(ent);
139   return ent->name;
140 }
141
142 /*
143 void   set_entity_ld_name  (entity *, char *ld_name);
144 void   set_entity_ld_ident (entity *, ident *ld_ident);
145 */
146
147 inline type *
148 get_entity_owner (entity *ent) {
149   return ent->owner = skip_tid(ent->owner);
150 }
151
152 inline void
153 set_entity_owner (entity *ent, type *owner) {
154   assert_legal_owner_of_ent(owner);
155   ent->owner = owner;
156 }
157
158 inline void   /* should this go into type.c? */
159 assert_legal_owner_of_ent(type *owner) {
160   assert (get_type_tpop_code(owner) == tpo_class ||
161           get_type_tpop_code(owner) == tpo_union ||
162           get_type_tpop_code(owner) == tpo_struct ||
163           get_type_tpop_code(owner) == tpo_array);   /* Yes, array has an entity
164                                                         -- to select fields! */
165 }
166
167 inline ident *
168 get_entity_ld_ident (entity *ent)
169 {
170   if (ent->ld_name == NULL)
171     ent->ld_name = mangle_entity (ent);
172   return ent->ld_name;
173 }
174
175 inline void
176 set_entity_ld_ident (entity *ent, ident *ld_ident) {
177   ent->ld_name = ld_ident;
178 }
179
180 /*
181 char  *get_entity_ld_name  (entity *);
182 void   set_entity_ld_name  (entity *, char *ld_name);
183 */
184
185 inline type *
186 get_entity_type (entity *ent) {
187   return ent->type = skip_tid(ent->type);
188 }
189
190 inline void
191 set_entity_type (entity *ent, type *type) {
192   ent->type = type;
193 }
194
195
196 inline ent_allocation
197 get_entity_allocation (entity *ent) {
198   return ent->allocation;
199 }
200
201 inline void
202 set_entity_allocation (entity *ent, ent_allocation al) {
203   ent->allocation = al;
204 }
205
206
207 inline ent_visibility
208 get_entity_visibility (entity *ent) {
209   return ent->visibility;
210 }
211
212 inline void
213 set_entity_visibility (entity *ent, ent_visibility vis) {
214   if (vis != local) assert(ent->allocation == static_allocated);
215   ent->visibility = vis;
216 }
217
218 inline ent_variability
219 get_entity_variability (entity *ent) {
220   return ent->variability;
221 }
222
223 inline void
224 set_entity_variability (entity *ent, ent_variability var){
225   if (var == part_constant)
226     assert(is_class_type(ent->type) || is_struct_type(ent->type));
227   if ((is_compound_type(ent->type)) &&
228       (ent->variability == uninitialized) && (var != uninitialized)) {
229     /* Allocate datastructures for constant values */
230     ent->values = NEW_ARR_F(ir_node *, 1);
231     ent->val_ents = NEW_ARR_F(entity *, 1);
232   }
233   if ((is_compound_type(ent->type)) &&
234       (var == uninitialized) && (ent->variability != uninitialized)) {
235     /* Free datastructures for constant values */
236     DEL_ARR_F(ent->values);
237     DEL_ARR_F(ent->val_ents);
238   }
239   ent->variability = var;
240 }
241
242
243 inline ent_volatility
244 get_entity_volatility (entity *ent) {
245   return ent->volatility;
246 }
247
248 inline void
249 set_entity_volatility (entity *ent, ent_volatility vol) {
250   ent->volatility = vol;
251 }
252
253 /* Set has no effect for entities of type method. */
254 inline ir_node *
255 get_atomic_ent_value(entity *ent) {
256   assert(ent); assert(is_atomic_entity(ent)); assert((ent->variability != uninitialized));
257   return ent->value;
258 }
259
260 inline void
261 set_atomic_ent_value(entity *ent, ir_node *val) {
262   assert(ent && is_atomic_entity(ent) && (ent->variability != uninitialized));
263   if (is_method_type(ent->type)) return;
264   ent->value = val;
265 }
266
267
268 /* A value of a compound entity is a pair of value and the corresponding member of
269    the compound. */
270 inline void
271 add_compound_ent_value(entity *ent, ir_node *val, entity *member) {
272   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
273   ARR_APP1 (ir_node *, ent->values, val);
274   ARR_APP1 (entity *, ent->val_ents, member);
275 }
276
277 inline int
278 get_compound_ent_n_values(entity *ent) {
279   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
280   return (ARR_LEN (ent->values))-1;
281 }
282
283 inline ir_node  *
284 get_compound_ent_value(entity *ent, int pos) {
285   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
286   return ent->values[pos+1];
287 }
288
289 inline entity   *
290 get_compound_ent_value_member(entity *ent, int pos) {
291   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
292   return ent->val_ents[pos+1];
293 }
294
295 inline void
296 set_compound_ent_value(entity *ent, ir_node *val, entity *member, int pos) {
297   assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
298   ent->values[pos+1] = val;
299   ent->val_ents[pos+1] = member;
300 }
301
302 inline int
303 get_entity_offset (entity *ent) {
304   return ent->offset;
305 }
306
307 inline void
308 set_entity_offset (entity *ent, int offset) {
309   ent->offset = offset;
310 }
311
312 inline void
313 add_entity_overwrites   (entity *ent, entity *overwritten) {
314   assert(ent);
315   ARR_APP1 (entity *, ent->overwrites, overwritten);
316 }
317
318 inline int
319 get_entity_n_overwrites (entity *ent){
320   assert(ent);
321   return (ARR_LEN (ent->overwrites))-1;
322 }
323
324 inline entity *
325 get_entity_overwrites   (entity *ent, int pos){
326   assert(ent);
327   return ent->overwrites[pos+1];
328 }
329
330 inline void
331 set_entity_overwrites   (entity *ent, int pos, entity *overwritten) {
332   assert(ent);
333   ent->overwrites[pos+1] = overwritten;
334 }
335
336 /* A link to store intermediate information */
337 void *
338 get_entity_link(entity *ent) {
339   assert(ent);
340   return ent->link;
341 }
342
343 void
344 set_entity_link(entity *ent, void *l) {
345   assert(ent);
346   ent->link = l;
347 }
348
349 inline ir_graph *
350 get_entity_irg(entity *ent) {
351   assert (ent);
352   assert (is_method_type(ent->type));
353   return ent->irg;
354 }
355
356 inline void
357 set_entity_irg(entity *ent, ir_graph *irg) {
358   assert (ent && ent->type);
359   assert (irg);
360   assert (is_method_type(ent->type));
361   ent->irg = irg;
362 }
363
364 int is_atomic_entity(entity *ent) {
365   type* t = ent->type;
366   return (is_primitive_type(t) || is_pointer_type(t) ||
367           is_enumeration_type(t) || is_method_type(t));
368 }
369
370 int is_compound_entity(entity *ent) {
371   type* t = ent->type;
372   return (is_class_type(t) || is_struct_type(t) ||
373           is_array_type(t) || is_union_type(t));
374 }