1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Martin Trapp, Christian Schaefer
14 # include "entity_t.h"
16 # include "typegmod_t.h"
19 /*******************************************************************/
21 /*******************************************************************/
28 /*******************************************************************/
30 /*******************************************************************/
32 inline void insert_entity_in_owner (entity *ent) {
33 type *owner = ent->owner;
34 switch (get_type_tpop_code(owner)) {
36 add_class_member (owner, ent);
39 add_struct_member (owner, ent);
42 add_union_member (owner, ent);
45 set_array_element_entity(owner, ent);
52 new_entity (type *owner, ident *name, type *type)
56 res = (entity *) malloc (sizeof (entity));
58 assert_legal_owner_of_ent(owner);
62 res->allocation = dynamic_allocated;
63 res->visibility = local;
65 res->overwrites = NEW_ARR_F(entity *, 1);
69 /* Remember entity in it's owner. */
70 insert_entity_in_owner (res);
73 inline void free_entity_attrs(entity *ent) {
75 DEL_ARR_F(ent->overwrites);
79 copy_entity_own (entity *old, type *new_owner) {
82 assert_legal_owner_of_ent(new_owner);
83 if (old->owner == new_owner) return old;
84 new = (entity *) malloc (sizeof (entity));
85 memcpy (new, old, sizeof (entity));
86 new->owner = new_owner;
87 new->overwrites = DUP_ARR_F(entity *, old->overwrites);
89 insert_entity_in_owner (new);
95 copy_entity_name (entity *old, ident *new_name) {
98 if (old->name == new_name) return old;
99 new = (entity *) malloc (sizeof (entity));
100 memcpy (new, old, sizeof (entity));
101 new->name = new_name;
103 new->overwrites = DUP_ARR_F(entity *, old->overwrites);
105 insert_entity_in_owner (new);
111 get_entity_name (entity *ent) {
113 return id_to_str(get_entity_ident(ent));
117 get_entity_ident (entity *ent) {
123 void set_entity_ld_name (entity *, char *ld_name);
124 void set_entity_ld_ident (entity *, ident *ld_ident);
128 get_entity_owner (entity *ent) {
129 return ent->owner = skip_tid(ent->owner);
133 set_entity_owner (entity *ent, type *owner) {
134 assert_legal_owner_of_ent(owner);
138 inline void /* should this go into type.c? */
139 assert_legal_owner_of_ent(type *owner) {
140 assert (get_type_tpop_code(owner) == tpo_class ||
141 get_type_tpop_code(owner) == tpo_union ||
142 get_type_tpop_code(owner) == tpo_struct ||
143 get_type_tpop_code(owner) == tpo_array); /* Yes, array has an entity
144 -- to select fields! */
148 get_entity_ld_ident (entity *ent)
150 if (ent->ld_name == NULL)
151 ent->ld_name = mangle_entity (ent);
156 set_entity_ld_ident (entity *ent, ident *ld_ident) {
157 ent->ld_name = ld_ident;
161 char *get_entity_ld_name (entity *);
162 void set_entity_ld_name (entity *, char *ld_name);
166 get_entity_type (entity *ent) {
167 return ent->type = skip_tid(ent->type);
171 set_entity_type (entity *ent, type *type) {
176 inline ent_allocation
177 get_entity_allocation (entity *ent) {
178 return ent->allocation;
182 set_entity_allocation (entity *ent, ent_allocation al) {
183 ent->allocation = al;
187 inline ent_visibility
188 get_entity_visibility (entity *ent) {
189 return ent->visibility;
193 set_entity_visibility (entity *ent, ent_visibility vis) {
194 if (vis != local) assert(ent->allocation == static_allocated);
195 ent->visibility = vis;
199 get_entity_offset (entity *ent) {
204 set_entity_offset (entity *ent, int offset) {
205 ent->offset = offset;
209 add_entity_overwrites (entity *ent, entity *overwritten) {
211 ARR_APP1 (entity *, ent->overwrites, overwritten);
215 get_entity_n_overwrites (entity *ent){
217 return (ARR_LEN (ent->overwrites))-1;
221 get_entity_overwrites (entity *ent, int pos){
223 return ent->overwrites[pos+1];
227 set_entity_overwrites (entity *ent, int pos, entity *overwritten) {
229 ent->overwrites[pos+1] = overwritten;
233 get_entity_irg(entity *ent) {
235 assert (is_method_type(ent->type));
240 set_entity_irg(entity *ent, ir_graph *irg) {
241 assert (ent && ent->type);
243 assert (is_method_type(ent->type));