1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Martin Trapp, Christian Schaefer
16 # include "entity_t.h"
18 # include "typegmod_t.h"
20 /* All this is needed to build the constant node for methods: */
24 /*******************************************************************/
26 /*******************************************************************/
33 /*******************************************************************/
35 /*******************************************************************/
37 inline void insert_entity_in_owner (entity *ent) {
38 type *owner = ent->owner;
39 switch (get_type_tpop_code(owner)) {
41 add_class_member (owner, ent);
44 add_struct_member (owner, ent);
47 add_union_member (owner, ent);
50 set_array_element_entity(owner, ent);
57 new_entity (type *owner, ident *name, type *type)
62 res = (entity *) malloc (sizeof (entity));
64 assert_legal_owner_of_ent(owner);
68 res->allocation = dynamic_allocated;
69 res->visibility = local;
70 if (is_method_type(type)) {
71 res->variability = constant;
72 rem = current_ir_graph;
73 current_ir_graph = get_const_code_irg();
74 res->value = new_Const(mode_p, tarval_p_from_entity(res));
75 current_ir_graph = rem;
77 res->variability = uninitialized;
80 res->overwrites = NEW_ARR_F(entity *, 1);
84 /* Remember entity in it's owner. */
85 insert_entity_in_owner (res);
88 inline void free_entity_attrs(entity *ent) {
90 DEL_ARR_F(ent->overwrites);
94 copy_entity_own (entity *old, type *new_owner) {
97 assert_legal_owner_of_ent(new_owner);
98 if (old->owner == new_owner) return old;
99 new = (entity *) malloc (sizeof (entity));
100 memcpy (new, old, sizeof (entity));
101 new->owner = new_owner;
102 new->overwrites = DUP_ARR_F(entity *, old->overwrites);
104 insert_entity_in_owner (new);
110 copy_entity_name (entity *old, ident *new_name) {
113 if (old->name == new_name) return old;
114 new = (entity *) malloc (sizeof (entity));
115 memcpy (new, old, sizeof (entity));
116 new->name = new_name;
118 new->overwrites = DUP_ARR_F(entity *, old->overwrites);
120 insert_entity_in_owner (new);
126 get_entity_name (entity *ent) {
128 return id_to_str(get_entity_ident(ent));
132 get_entity_ident (entity *ent) {
138 void set_entity_ld_name (entity *, char *ld_name);
139 void set_entity_ld_ident (entity *, ident *ld_ident);
143 get_entity_owner (entity *ent) {
144 return ent->owner = skip_tid(ent->owner);
148 set_entity_owner (entity *ent, type *owner) {
149 assert_legal_owner_of_ent(owner);
153 inline void /* should this go into type.c? */
154 assert_legal_owner_of_ent(type *owner) {
155 assert (get_type_tpop_code(owner) == tpo_class ||
156 get_type_tpop_code(owner) == tpo_union ||
157 get_type_tpop_code(owner) == tpo_struct ||
158 get_type_tpop_code(owner) == tpo_array); /* Yes, array has an entity
159 -- to select fields! */
163 get_entity_ld_ident (entity *ent)
165 if (ent->ld_name == NULL)
166 ent->ld_name = mangle_entity (ent);
171 set_entity_ld_ident (entity *ent, ident *ld_ident) {
172 ent->ld_name = ld_ident;
176 char *get_entity_ld_name (entity *);
177 void set_entity_ld_name (entity *, char *ld_name);
181 get_entity_type (entity *ent) {
182 return ent->type = skip_tid(ent->type);
186 set_entity_type (entity *ent, type *type) {
191 inline ent_allocation
192 get_entity_allocation (entity *ent) {
193 return ent->allocation;
197 set_entity_allocation (entity *ent, ent_allocation al) {
198 ent->allocation = al;
202 inline ent_visibility
203 get_entity_visibility (entity *ent) {
204 return ent->visibility;
208 set_entity_visibility (entity *ent, ent_visibility vis) {
209 if (vis != local) assert(ent->allocation == static_allocated);
210 ent->visibility = vis;
213 inline ent_variability
214 get_entity_variability (entity *ent) {
215 return ent->variability;
219 set_entity_variability (entity *ent, ent_variability var){
220 if (var == part_constant)
221 assert(is_class_type(ent->type) || is_struct_type(ent->type));
222 if ((is_compound_type(ent->type)) &&
223 (ent->variability == uninitialized) && (var != uninitialized)) {
224 /* Allocate datastructures for constant values */
225 ent->values = NEW_ARR_F(ir_node *, 1);
226 ent->val_ents = NEW_ARR_F(entity *, 1);
228 if ((is_compound_type(ent->type)) &&
229 (var == uninitialized) && (ent->variability != uninitialized)) {
230 /* Free datastructures for constant values */
231 DEL_ARR_F(ent->values);
232 DEL_ARR_F(ent->val_ents);
234 ent->variability = var;
237 /* Set has no effect for entities of type method. */
239 get_atomic_ent_value(entity *ent) {
240 assert(ent); assert(is_atomic_entity(ent)); assert((ent->variability != uninitialized));
245 set_atomic_ent_value(entity *ent, ir_node *val) {
246 assert(ent && is_atomic_entity(ent) && (ent->variability != uninitialized));
247 if (is_method_type(ent->type)) return;
252 /* A value of a compound entity is a pair of value and the corresponding member of
255 add_compound_ent_value(entity *ent, ir_node *val, entity *member) {
256 assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
257 ARR_APP1 (ir_node *, ent->values, val);
258 ARR_APP1 (entity *, ent->val_ents, member);
262 get_compound_ent_n_values(entity *ent) {
263 assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
264 return (ARR_LEN (ent->values))-1;
268 get_compound_ent_value(entity *ent, int pos) {
269 assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
270 return ent->values[pos+1];
274 get_compound_ent_value_member(entity *ent, int pos) {
275 assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
276 return ent->val_ents[pos+1];
280 set_compound_ent_value(entity *ent, ir_node *val, entity *member, int pos) {
281 assert(ent && is_compound_entity(ent) && (ent->variability != uninitialized));
282 ent->values[pos+1] = val;
283 ent->val_ents[pos+1] = member;
287 get_entity_offset (entity *ent) {
292 set_entity_offset (entity *ent, int offset) {
293 ent->offset = offset;
297 add_entity_overwrites (entity *ent, entity *overwritten) {
299 ARR_APP1 (entity *, ent->overwrites, overwritten);
303 get_entity_n_overwrites (entity *ent){
305 return (ARR_LEN (ent->overwrites))-1;
309 get_entity_overwrites (entity *ent, int pos){
311 return ent->overwrites[pos+1];
315 set_entity_overwrites (entity *ent, int pos, entity *overwritten) {
317 ent->overwrites[pos+1] = overwritten;
320 /* A link to store intermediate information */
322 get_entity_link(entity *ent) {
328 set_entity_link(entity *ent, void *l) {
334 get_entity_irg(entity *ent) {
336 assert (is_method_type(ent->type));
341 set_entity_irg(entity *ent, ir_graph *irg) {
342 assert (ent && ent->type);
344 assert (is_method_type(ent->type));
348 int is_atomic_entity(entity *ent) {
350 return (is_primitive_type(t) || is_pointer_type(t) ||
351 is_enumeration_type(t) || is_method_type(t));
354 int is_compound_entity(entity *ent) {
356 return (is_class_type(t) || is_struct_type(t) ||
357 is_array_type(t) || is_union_type(t));