/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
-** All rights reserved.
-**
-** Authors: Martin Trapp, Christian Schaefer
-**
+* All rights reserved.
+*
+* Authors: Martin Trapp, Christian Schaefer
+*
*/
/* $Id$ */
# include "typegmod_t.h"
# include "array.h"
/* All this is needed to build the constant node for methods: */
-# include "irprog.h"
+# include "irprog_t.h"
# include "ircons.h"
/*******************************************************************/
entity *res;
ir_graph *rem;
+ assert(!id_contains_char(name, ' ') && "entity name should not contain spaces");
+
res = (entity *) malloc (sizeof (entity));
res->kind = k_entity;
assert_legal_owner_of_ent(owner);
res->variability = constant;
rem = current_ir_graph;
current_ir_graph = get_const_code_irg();
- res->value = new_Const(mode_p, tarval_p_from_entity(res));
+ res->value = new_Const(mode_P, tarval_P_from_entity(res));
current_ir_graph = rem;
} else {
res->variability = uninitialized;
res->irg = NULL;
+#ifdef DEBUG_libfirm
+ res->nr = get_irp_new_node_nr();
+#endif
+
res->visit = 0;
/* Remember entity in it's owner. */
new = (entity *) malloc (sizeof (entity));
memcpy (new, old, sizeof (entity));
new->owner = new_owner;
+ /*
if ((get_type_tpop(get_entity_owner(old)) == type_class) &&
(get_type_tpop(new_owner) == type_class)) {
new->overwrites = DUP_ARR_F(entity *, old->overwrites);
new->overwrites = NEW_ARR_F(entity *, 1);
new->overwrittenby = NEW_ARR_F(entity *, 1);
}
+ */
+ if (is_class_type(new_owner)) {
+ new->overwrites = NEW_ARR_F(entity *, 1);
+ new->overwrittenby = NEW_ARR_F(entity *, 1);
+ }
insert_entity_in_owner (new);
free(ent);
}
+/* Outputs a unique number for this node */
+INLINE long
+get_entity_nr(entity *ent) {
+ assert(ent);
+#ifdef DEBUG_libfirm
+ return ent->nr;
+#else
+ return 0;
+#endif
+}
+
INLINE const char *
get_entity_name (entity *ent) {
assert (ent);
INLINE void
set_entity_visibility (entity *ent, ent_visibility vis) {
- if (vis != local) assert(ent->allocation == static_allocated);
+ if (vis != local)
+ assert((ent->allocation == static_allocated) ||
+ (ent->allocation == automatic_allocated));
+ // @@@ Test that the owner type is not local, but how??
+ // && get_class_visibility(get_entity_owner(ent)) != local));
ent->visibility = vis;
}
return (ARR_LEN (ent->overwrites))-1;
}
+int
+get_entity_overwrites_index(entity *ent, entity *overwritten) {
+ int i;
+ assert(ent && is_class_type(get_entity_owner(ent)));
+ for (i = 0; i < get_entity_n_overwrites(ent); i++)
+ if (get_entity_overwrites(ent, i) == overwritten)
+ return i;
+ return -1;
+}
+
INLINE entity *
get_entity_overwrites (entity *ent, int pos) {
assert(ent);
ent->overwrites[pos+1] = overwritten;
}
+void
+remove_entity_overwrites(entity *ent, entity *overwritten) {
+ int i;
+ assert(ent && is_class_type(get_entity_owner(ent)));
+ for (i = 1; i < (ARR_LEN (ent->overwrites)); i++)
+ if (ent->overwrites[i] == overwritten) {
+ for(; i < (ARR_LEN (ent->overwrites))-1; i++)
+ ent->overwrites[i] = ent->overwrites[i+1];
+ ARR_SETLEN(entity*, ent->overwrites, ARR_LEN(ent->overwrites) - 1);
+ break;
+ }
+}
+
INLINE void
add_entity_overwrittenby (entity *ent, entity *overwrites) {
assert(ent);
return (ARR_LEN (ent->overwrittenby))-1;
}
+int
+get_entity_overwrittenby_index(entity *ent, entity *overwrites) {
+ int i;
+ assert(ent && is_class_type(get_entity_owner(ent)));
+ for (i = 0; i < get_entity_n_overwrittenby(ent); i++)
+ if (get_entity_overwrittenby(ent, i) == overwrites)
+ return i;
+ return -1;
+}
+
INLINE entity *
get_entity_overwrittenby (entity *ent, int pos) {
assert(ent);
ent->overwrittenby[pos+1] = overwrites;
}
+void remove_entity_overwrittenby(entity *ent, entity *overwrites) {
+ int i;
+ assert(ent && is_class_type(get_entity_owner(ent)));
+ for (i = 1; i < (ARR_LEN (ent->overwrittenby)); i++)
+ if (ent->overwrittenby[i] == overwrites) {
+ for(; i < (ARR_LEN (ent->overwrittenby))-1; i++)
+ ent->overwrittenby[i] = ent->overwrittenby[i+1];
+ ARR_SETLEN(entity*, ent->overwrittenby, ARR_LEN(ent->overwrittenby) - 1);
+ break;
+ }
+}
+
/* A link to store intermediate information */
void *
get_entity_link(entity *ent) {
ent->irg = irg;
}
+int is_entity (void *thing) {
+ assert(thing);
+ if (get_kind(thing) == k_entity)
+ return 1;
+ else
+ return 0;
+}
+
int is_atomic_entity(entity *ent) {
type* t = get_entity_type(ent);
return (is_primitive_type(t) || is_pointer_type(t) ||
is_array_type(t) || is_union_type(t));
}
+/* @@@ not implemnted!!! */
bool equal_entity(entity *ent1, entity *ent2) {
+ printf(" calling unimplemented equal entity!!! \n");
return true;
}
-unsigned long get_entity_visited(entity *entity) {
- assert (entity);
- return entity->visit;
+unsigned long get_entity_visited(entity *ent) {
+ assert (ent);
+ return ent->visit;
}
-void set_entity_visited(entity *entity, unsigned long num) {
- assert (entity);
- entity->visit = num;
+void set_entity_visited(entity *ent, unsigned long num) {
+ assert (ent);
+ ent->visit = num;
}
/* Sets visited field in entity to entity_visited. */
-void mark_entity_visited(entity *entity) {
- assert (entity);
- entity->visit = type_visited;
+void mark_entity_visited(entity *ent) {
+ assert (ent);
+ ent->visit = type_visited;
+}
+
+
+INLINE bool entity_visited(entity *ent) {
+ return get_entity_visited(ent) >= type_visited;
+}
+INLINE bool entity_not_visited(entity *ent) {
+ return get_entity_visited(ent) < type_visited;
}