1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Martin Trapp, Christian Schaefer &
7 ** type.h: datastructures to hold type information.
17 /* for recursive type definiton */
18 typedef union type type;
20 /* visited flag to traverse the type information */
21 extern unsigned long type_visited;
23 /*******************************************************************/
25 /*******************************************************************/
30 /** needs list with it's entities -- does it really??
31 Entities can be added during their creation.
34 unsigned long visit; /* visited counter for walks of the type information */
38 /* create a new type_class */
39 type_class *new_type_class (ident *name);
41 /* manipulate fields of type_class */
42 char *get_class_name (type_class *clss);
43 ident *get_class_ident (type_class *clss);
45 void set_class_name (type_class *clss, char *name);
46 void set_class_ident (type_class *clss, ident* ident);
49 /*******************************************************************/
51 /*******************************************************************/
56 /** needs list with it's entities -- does it really??
57 Entities can be added during their creation.
60 unsigned long visit; /* visited counter for walks of the type information */
64 /* create a new type_strct */
65 type_strct *new_type_strct (ident *name);
67 /* manipulate fields of type_strct */
68 char *get_strct_name (type_strct *strct);
69 ident *get_strct_ident (type_strct *strct);
71 void set_strct_name (type_strct *strct, char *name);
72 void set_strct_ident (type_strct *strct, ident* ident);
76 /*******************************************************************/
78 /*******************************************************************/
82 ident *name; /* do I need the name,
83 or is the name in entity sufficient?
84 No, there is no name for the type. Types have
85 only names if typedef's give them one. */
86 int arity; /* number of parameters, better n_params */
87 type **param_type; /* code generation needs this information.
88 Should it be generated by the frontend,
89 or does this impose unnecessary work for
90 optimizations that change the parameters of
92 int n_res; /* number of results */
94 /** needs pointer to it's ir_graph ??
96 unsigned long visit; /* visited counter for walks of the type information */
99 /* create a new type_method */
100 type_method *new_type_method (ident *name, int arity, int n_res);
102 /* manipulate fields of type_method */
104 char *get_method_name (type_method *method);
105 ident *get_method_ident (type_method *method);
106 /* GL 9.2.2000: who commened these in?
107 I think it's not safe to have these methods.
108 Please add changes to Changes file.
109 void set_method_name (type_method *method, char *name);
110 void set_method_ident (type_method *method, ident* ident); */
112 inline int get_method_arity (type_method *method);
113 inline void set_method_arity (type_method *method, int arity);
114 inline type *get_method_param_type(type_method *method, int pos);
115 inline void set_method_param_type(type_method *method, int pos, type* type);
117 inline int get_method_n_res (type_method *method);
118 inline void set_method_n_res (type_method *method, int n_res);
119 inline type *get_method_res_type(type_method *method, int pos);
120 inline void set_method_res_type(type_method *method, int pos, type* type);
123 ir_graph *get_method_graph(type_method *method);
124 void *get_method_graph(type_method *method, ir_graph* graph);
127 /*******************************************************************/
129 /*******************************************************************/
133 ident *name; /* do I need a name? */
135 /* type **unioned_type; ... or something like that? */
136 unsigned long visit; /* visited counter for walks of the type information */
139 /* create a new type_union -- set unioned types by hand. */
140 type_union *new_type_union (ident *name, int n_types);
142 /* manipulate fields of type_union */
143 char *get_union_name (type_union *uni);
144 ident *get_union_ident (type_union *uni);
146 void set_union_name (type_union *union, char *name);
147 void set_union_ident (type_union *union, ident* ident);
150 int get_union_n_types (type_union *union);
151 void set_union_n_types (type_union *union, int n);
152 type *get_union_unioned_type (type_union *union, int pos);
153 void set_union_unioned_type (type_union *union, int pos, type *type);
156 /*******************************************************************/
158 /*******************************************************************/
160 /* multidimensional, polyhedric arrays */
164 int n_dimensions; /* Extend Sel to select from multidimensional arrays. This */
165 int *lower_bound; /* will allow to generate explicit array index computations */
166 int *upper_bound; /* by replacing a single FIRM node. As long as this is not
167 done create arrays with arrays as elements. */
168 /* Should I use tarval? */
170 unsigned long visit; /* visited counter for walks of the type information */
173 /* create a new type array -- set dimension sizes independently */
174 type_array *new_type_array (ident *name, int n_dimensions);
176 /* manipulate fields of type_array */
177 char *get_array_name (type_array *array);
178 ident *get_array_ident (type_array *array);
180 void set_array_name (type_array *array, char *name);
181 void set_array_ident (type_array *array, ident* ident);
183 void set_array_n_dimensions (type_array *array, int n);
184 int get_array_n_dimensions (type_array *array);
186 void set_array_bounds (type_array *array, int dimension, int lower_bound,
188 void set_array_lower_bound (type_array *array, int dimension, int lower_bound);
189 void set_array_upper_bound (type_array *array, int dimension, int upper_bound);
190 int get_array_lower_bound (type_array *array, int dimension);
191 int get_array_upper_bound (type_array *array, int dimension);
193 void set_array_element_type (type_array *array, type *type);
194 type *get_array_element_type (type_array *array);
196 /*******************************************************************/
197 /** TYPE_ENUMERATION **/
198 /*******************************************************************/
199 /** Enums are needed to keep debugging information. They can as well
200 be lowered to integers. **/
206 ir_node **enum * Contains all constant nodes that represent a member
207 of the enum -- enumerators. */
208 /* is ir_node the propper array member? */
209 unsigned long visit; /* visited counter for walks of the type information */
212 /* create a new type enumeration -- set the enumerators independently */
213 type_enumeration *new_type_enumeration (ident *name /* , int n_enums */);
215 /* manipulate fields of type_enumeration */
216 char *get_enumeration_name (type_enumeration *enumeration);
217 ident *get_enumeration_ident (type_enumeration *enumeration);
219 void set_enumeration_name (type_enumeration *enumeration, char *name);
220 void set_enumeration_ident (type_enumeration *enumeration, ident* ident);
223 void set_enumeration_n_enums (type_enumeration *enumeration, int n);
224 int *get_enumeration_n_enums (type_enumeration *enumeration);
225 void set_enumeration_enum (type_enumeration *enumeration, int pos,
227 ir_node *get_enumeration_enum (type_enumeration *enumeration, int pos);
230 /*******************************************************************/
232 /*******************************************************************/
237 /* ir_mode *mode; * The mode to be used for this type.
238 Not here as there might be several pointer types?
239 A method get_pointer_mode should read a unique,
242 unsigned long visit; /* visited counter for walks of the type information */
245 /* create a new type pointer */
246 type_pointer *new_type_pointer (ident *name, type *points_to);
248 /* manipulate fields of type_pointer */
249 char *get_pointer_name (type_pointer *pointer);
250 ident *get_pointer_ident (type_pointer *pointer);
252 void set_pointer_name (type_pointer *pointer, char *name);
253 void set_pointer_ident (type_pointer *pointer, ident* ident);
255 void set_pointer_points_to_type (type_pointer *pointer, type *type);
256 type *get_pointer_points_to_type (type_pointer *pointer);
258 /*******************************************************************/
259 /** TYPE_PRIMITIVE **/
260 /*******************************************************************/
262 /* primitive, language-defined types */
263 /* What is the type of an entity if it is atomic? Are alle basic data
264 types classses in Sather? Else this is needed. */
268 ir_mode *mode; /* The mode to be used for this type */
269 unsigned long visit; /* visited counter for walks of the type information */
272 /* create a new type primitive */
273 type_primitive *new_type_primitive (ident *name, ir_mode *mode);
275 /* manipulate fields of type_primitive */
276 char *get_primitive_name (type_primitive *primitive);
277 ident *get_primitive_ident (type_primitive *primitive);
279 void set_primitive_name (type_primitive *primitive, char *name);
280 void set_primitive_ident (type_primitive *primitive, ident* ident);
282 ir_mode *get_primitive_mode (type_primitive *primitive);
283 void set_primitive_mode (type_primitive *primitive, ir_mode *mode);
288 /*******************************************************************/
289 /** To manage all different types the same **/
290 /*******************************************************************/
298 type_union uni; /* union is keyword */
299 type_enumeration enumeration;
300 type_pointer pointer;
301 type_primitive primitive;
304 int is_type(void *thing);
309 # endif /* _TYPE_H_ */