From: Christian Schäfer Date: Wed, 19 Jul 2000 14:12:05 +0000 (+0000) Subject: added access routines for new flag in type_class struct X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=fb1ecf296897fed644337520cf750e0e32af0003;p=libfirm added access routines for new flag in type_class struct [r51] --- diff --git a/ir/tr/entity.h b/ir/tr/entity.h index 821176e49..70dbf9b9a 100644 --- a/ir/tr/entity.h +++ b/ir/tr/entity.h @@ -30,7 +30,6 @@ # define _ENTITY_H_ # include "ident.h" -# include "type.h" /*******************************************************************/ /** general **/ @@ -49,6 +48,12 @@ void init_entity (void); typedef struct ir_graph ir_graph; #endif +#ifndef _TYPE_TYPEDEF_ +#define _TYPE_TYPEDEF_ +/* to resolve recursion between entity.h and irgraph.h */ +typedef union type type; +#endif + typedef struct entity entity; /* create a new entity */ @@ -59,10 +64,12 @@ char *get_entity_name (entity *ent); ident *get_entity_ident (entity *ent); ident *get_entity_ld_name (entity *ent); + /* char *get_entity_ld_name (entity *ent); -ident *get_entity_ld_ident (entity *ent); void set_entity_ld_name (entity *ent, char *ld_name); + +ident *get_entity_ld_ident (entity *ent); void set_entity_ld_ident (entity *ent, ident *ld_ident); */ diff --git a/ir/tr/type.c b/ir/tr/type.c index bfee56401..d13ba61f4 100644 --- a/ir/tr/type.c +++ b/ir/tr/type.c @@ -10,6 +10,7 @@ # include "type.h" # include "irprog.h" /* So that constructors can add the type to global data structure. */ +# include "array.h" unsigned long type_visited = 0; @@ -32,6 +33,9 @@ new_type_class (ident *name)//, int members) res->kind = k_type_class; res->name = name; + res->members = NEW_ARR_F (entity *, 1); + res->subtypes = NEW_ARR_F (type_class *, 1); + res->supertypes = NEW_ARR_F (type_class *, 1); // res->n_members = 0; // res->max_members = members; // res->member = (entity **) xmalloc (sizeof (entity*) * members); @@ -42,14 +46,13 @@ new_type_class (ident *name)//, int members) } /* manipulate fields of type_class */ -/* -char * +char * get_class_name (type_class *class) { assert(class); return ID_TO_STR(class->name); } -*/ +/* field: ident */ ident * get_class_ident (type_class *class) { assert(class); @@ -61,6 +64,65 @@ void set_class_name (type_class *class, char *name); void set_class_ident (type_class *class, ident* ident); */ +/* field: member */ +void +add_class_member (type_class *class, entity *member) +{ + ARR_APP1 (entity *, class->members, member); +} + +entity * +get_class_member (type_class *class, int pos) +{ + assert (class); + return class->members[pos+1]; +} + +void +set_class_member (type_class *class, entity *member, int pos) +{ + class->members[pos+1] = member; +} + +/* field: subtype */ +void +add_class_subtype (type_class *class, type_class *subtype) +{ + ARR_APP1 (type_class *, class->subtypes, subtype); +} + +type_class * +get_class_subtype (type_class *class, int pos) +{ + assert (class); + return class->subtypes[pos+1]; +} + +void +set_class_subtype (type_class *class, type_class *subtype, int pos) +{ + class->subtypes[pos+1] = subtype; +} + +/* field: supertype */ +void +add_class_supertype (type_class *class, type_class *supertype) +{ + ARR_APP1 (type_class *, class->supertypes, supertype); +} + +type_class * +get_class_supertype (type_class *class, int pos) +{ + assert (class); + return class->supertypes[pos+1]; +} + +void +set_class_supertype (type_class *class, type_class *supertype, int pos) +{ + class->supertypes[pos+1] = supertype; +} /*******************************************************************/ /** TYPE_STRCT **/ diff --git a/ir/tr/type.h b/ir/tr/type.h index bee2ee1a8..f6851a38b 100644 --- a/ir/tr/type.h +++ b/ir/tr/type.h @@ -183,9 +183,14 @@ or lowering phases. # include "common.h" # include "ident.h" # include "irmode.h" +# include "entity.h" /* for recursive type definiton */ +#ifndef _TYPE_TYPEDEF_ +#define _TYPE_TYPEDEF_ +/* to resolve recursion between entity.h and irgraph.h */ typedef union type type; +#endif /* visited flag to traverse the type information */ extern unsigned long type_visited; @@ -194,31 +199,47 @@ extern unsigned long type_visited; /** TYPE_CLASS **/ /*******************************************************************/ -typedef struct { +typedef struct type_class type_class; + +struct type_class { firm_kind kind; - ident *name; - /** needs list with it's entities -- does it really?? - Entities can be added during their creation. - entities **member; **/ - /** to represent inheritance - type_class **subtypes; * direct subtypes * - type_class **supertypes; * direct supertypes * - **/ - unsigned long visit; /* visited counter for walks of the type information */ -} type_class; + ident *name; /* needs list with it's entities + does it really?? + Entities can be added during their creation. */ + struct entity **members; /* to represent inheritance */ + type_class **subtypes; /* direct subtypes */ + type_class **supertypes; /* direct supertypes */ + unsigned long visit; /* visited counter for walks of + the type information */ +}; /* create a new type_class */ type_class *new_type_class (ident *name); /* manipulate fields of type_class */ -char *get_class_name (type_class *clss); -ident *get_class_ident (type_class *clss); -/* -void set_class_name (type_class *clss, char *name); -void set_class_ident (type_class *clss, ident* ident); + +char *get_class_name (type_class *class); +ident *get_class_ident (type_class *class); + +/* Not necessary now! +void set_class_name (type_class *class, char *name); +void set_class_ident (type_class *class, ident* ident); */ +void add_class_member (type_class *class, entity *member); +entity *get_class_member (type_class *class, int pos); +void set_class_member (type_class *class, entity *member, int pos); + +void add_class_subtype (type_class *class, type_class *subtype); +type_class *get_class_subtype (type_class *class, int pos); +void set_class_subtype (type_class *class, type_class *subtype, int pos); + +void add_class_supertype (type_class *class, type_class *supertype); +type_class *get_class_supertype (type_class *class, int pos); +void set_class_supertype (type_class *class, type_class *supertype, int pos); + + /* get_class_entity_arr get_class_n_entities get_class_entity(class, pos) @@ -473,6 +494,7 @@ union type { type_primitive primitive; }; + int is_type(void *thing);