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"
21 /*******************************************************************/
23 /*******************************************************************/
30 /*******************************************************************/
32 /*******************************************************************/
34 inline void insert_entity_in_owner (entity *ent) {
35 type *owner = ent->owner;
36 switch (get_type_tpop_code(owner)) {
38 add_class_member (owner, ent);
41 add_struct_member (owner, ent);
44 add_union_member (owner, ent);
47 set_array_element_entity(owner, ent);
54 new_entity (type *owner, ident *name, type *type)
58 res = (entity *) malloc (sizeof (entity));
60 assert_legal_owner_of_ent(owner);
64 res->allocation = dynamic_allocated;
65 res->visibility = local;
67 res->overwrites = NEW_ARR_F(entity *, 1);
71 /* Remember entity in it's owner. */
72 insert_entity_in_owner (res);
75 inline void free_entity_attrs(entity *ent) {
77 DEL_ARR_F(ent->overwrites);
81 copy_entity_own (entity *old, type *new_owner) {
84 assert_legal_owner_of_ent(new_owner);
85 if (old->owner == new_owner) return old;
86 new = (entity *) malloc (sizeof (entity));
87 memcpy (new, old, sizeof (entity));
88 new->owner = new_owner;
89 new->overwrites = DUP_ARR_F(entity *, old->overwrites);
91 insert_entity_in_owner (new);
97 copy_entity_name (entity *old, ident *new_name) {
100 if (old->name == new_name) return old;
101 new = (entity *) malloc (sizeof (entity));
102 memcpy (new, old, sizeof (entity));
103 new->name = new_name;
105 new->overwrites = DUP_ARR_F(entity *, old->overwrites);
107 insert_entity_in_owner (new);
113 get_entity_name (entity *ent) {
115 return id_to_str(get_entity_ident(ent));
119 get_entity_ident (entity *ent) {
125 void set_entity_ld_name (entity *, char *ld_name);
126 void set_entity_ld_ident (entity *, ident *ld_ident);
130 get_entity_owner (entity *ent) {
131 return ent->owner = skip_tid(ent->owner);
135 set_entity_owner (entity *ent, type *owner) {
136 assert_legal_owner_of_ent(owner);
140 inline void /* should this go into type.c? */
141 assert_legal_owner_of_ent(type *owner) {
142 assert (get_type_tpop_code(owner) == tpo_class ||
143 get_type_tpop_code(owner) == tpo_union ||
144 get_type_tpop_code(owner) == tpo_struct ||
145 get_type_tpop_code(owner) == tpo_array); /* Yes, array has an entity
146 -- to select fields! */
150 get_entity_ld_ident (entity *ent)
152 if (ent->ld_name == NULL)
153 ent->ld_name = mangle_entity (ent);
158 set_entity_ld_ident (entity *ent, ident *ld_ident) {
159 ent->ld_name = ld_ident;
163 char *get_entity_ld_name (entity *);
164 void set_entity_ld_name (entity *, char *ld_name);
168 get_entity_type (entity *ent) {
169 return ent->type = skip_tid(ent->type);
173 set_entity_type (entity *ent, type *type) {
178 inline ent_allocation
179 get_entity_allocation (entity *ent) {
180 return ent->allocation;
184 set_entity_allocation (entity *ent, ent_allocation al) {
185 ent->allocation = al;
189 inline ent_visibility
190 get_entity_visibility (entity *ent) {
191 return ent->visibility;
195 set_entity_visibility (entity *ent, ent_visibility vis) {
196 if (vis != local) assert(ent->allocation == static_allocated);
197 ent->visibility = vis;
201 get_entity_offset (entity *ent) {
206 set_entity_offset (entity *ent, int offset) {
207 ent->offset = offset;
211 add_entity_overwrites (entity *ent, entity *overwritten) {
213 ARR_APP1 (entity *, ent->overwrites, overwritten);
217 get_entity_n_overwrites (entity *ent){
219 return (ARR_LEN (ent->overwrites))-1;
223 get_entity_overwrites (entity *ent, int pos){
225 return ent->overwrites[pos+1];
229 set_entity_overwrites (entity *ent, int pos, entity *overwritten) {
231 ent->overwrites[pos+1] = overwritten;
235 get_entity_irg(entity *ent) {
237 assert (is_method_type(ent->type));
242 set_entity_irg(entity *ent, ir_graph *irg) {
243 assert (ent && ent->type);
245 assert (is_method_type(ent->type));