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 *class, char *name);
46 void set_class_ident (type_class *class, 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, or is the name in entity sufficient?
83 int arity; /* number of parameters, better n_params */
84 type **param_type; /* code generation needs this information.
85 Should it be generated by the frontend,
86 or does this impose unnecessary work for
87 optimizatinos that change the parameters of
89 int n_res; /* number of results */
91 /** needs pointer to it's ir_graph ??
93 unsigned long visit; /* visited counter for walks of the type information */
96 /* create a new type_method */
97 type_method *new_type_method (ident *name, int arity, int n_res);
99 /* manipulate fields of type_method */
101 char *get_method_name (type_method *method);
102 ident *get_method_ident (type_method *method);
103 /* GL 9.2.2000: who commened these in?
104 I think it's not safe to have these methods.
105 Please add changes to Changes file.
106 void set_method_name (type_method *method, char *name);
107 void set_method_ident (type_method *method, ident* ident); */
109 inline int get_method_arity (type_method *method);
110 inline void set_method_arity (type_method *method, int arity);
111 inline type *get_method_param_type(type_method *method, int pos);
112 inline void set_method_param_type(type_method *method, int pos, type* type);
114 inline int get_method_n_res (type_method *method);
115 inline void set_method_n_res (type_method *method, int n_res);
116 inline type *get_method_res_type(type_method *method, int pos);
117 inline void set_method_res_type(type_method *method, int pos, type* type);
120 ir_graph *get_method_graph(type_method *method);
121 void *get_method_graph(type_method *method, ir_graph* graph);
124 /*******************************************************************/
126 /*******************************************************************/
130 ident *name; // do I need a name?
132 /* type **unioned_type; ... or something like that? */
133 unsigned long visit; /* visited counter for walks of the type information */
136 /* create a new type_union -- set unioned types by hand. */
137 type_union *new_type_union (ident *name, int n_types);
139 /* manipulate fields of type_union */
140 char *get_union_name (type_union *uni);
141 ident *get_union_ident (type_union *uni);
143 void set_union_name (type_union *union, char *name);
144 void set_union_ident (type_union *union, ident* ident);
147 int get_union_n_types (type_union *union);
148 void set_union_n_types (type_union *union, int n);
149 type *get_union_unioned_type (type_union *union, int pos);
150 void set_union_unioned_type (type_union *union, int pos, type *type);
153 /*******************************************************************/
155 /*******************************************************************/
157 /* multidimensional, polyhedric arrays */
161 int n_dimensions; /* Extend Sel to select from multidimensional arrays. This */
162 int *lower_bound; /* will allow to generate explicit array index computations */
163 int *upper_bound; /* by replacing a single FIRM node. As long as this is not
164 done create arrays with arrays as elements. */
165 /* Should I use tarval? */
167 unsigned long visit; /* visited counter for walks of the type information */
170 /* create a new type array -- set dimension sizes independently */
171 type_array *new_type_array (ident *name, int n_dimensions);
173 /* manipulate fields of type_array */
174 char *get_array_name (type_array *array);
175 ident *get_array_ident (type_array *array);
177 void set_array_name (type_array *array, char *name);
178 void set_array_ident (type_array *array, ident* ident);
180 void set_array_n_dimensions (type_array *array, int n);
181 int get_array_n_dimensions (type_array *array);
183 void set_array_bounds (type_array *array, int dimension, int lower_bound,
185 void set_array_lower_bound (type_array *array, int dimension, int lower_bound);
186 void set_array_upper_bound (type_array *array, int dimension, int upper_bound);
187 int get_array_lower_bound (type_array *array, int dimension);
188 int get_array_upper_bound (type_array *array, int dimension);
190 void set_array_element_type (type_array *array, type *type);
191 type *get_array_element_type (type_array *array);
193 /*******************************************************************/
194 /** TYPE_ENUMERATION **/
195 /*******************************************************************/
196 /** Enums are needed to keep debugging information. They can as well
197 be lowered to integers. **/
203 ir_node **enum * Contains all constant nodes that represent a member
204 of the enum -- enumerators. */
205 // is ir_node the propper array member?
206 unsigned long visit; /* visited counter for walks of the type information */
209 /* create a new type enumeration -- set the enumerators independently */
210 type_enumeration *new_type_enumeration (ident *name /* , int n_enums */);
212 /* manipulate fields of type_enumeration */
213 char *get_enumeration_name (type_enumeration *enumeration);
214 ident *get_enumeration_ident (type_enumeration *enumeration);
216 void set_enumeration_name (type_enumeration *enumeration, char *name);
217 void set_enumeration_ident (type_enumeration *enumeration, ident* ident);
220 void set_enumeration_n_enums (type_enumeration *enumeration, int n);
221 int *get_enumeration_n_enums (type_enumeration *enumeration);
222 void set_enumeration_enum (type_enumeration *enumeration, int pos,
224 ir_node *get_enumeration_enum (type_enumeration *enumeration, int pos);
227 /*******************************************************************/
229 /*******************************************************************/
234 /* ir_mode *mode; * The mode to be used for this type.
235 Not here as there might be several pointer types?
236 A method get_pointer_mode should read a unique,
239 unsigned long visit; /* visited counter for walks of the type information */
242 /* create a new type pointer */
243 type_pointer *new_type_pointer (ident *name, type *points_to);
245 /* manipulate fields of type_pointer */
246 char *get_pointer_name (type_pointer *pointer);
247 ident *get_pointer_ident (type_pointer *pointer);
249 void set_pointer_name (type_pointer *pointer, char *name);
250 void set_pointer_ident (type_pointer *pointer, ident* ident);
252 void set_pointer_points_to_type (type_pointer *pointer, type *type);
253 type *get_pointer_points_to_type (type_pointer *pointer);
255 /*******************************************************************/
256 /** TYPE_PRIMITIVE **/
257 /*******************************************************************/
259 /* primitive, language-defined types */
260 /* What is the type of an entity if it is atomic? Are alle basic data
261 types classses in Sather? Else this is needed. */
265 ir_mode *mode; /* The mode to be used for this type */
266 unsigned long visit; /* visited counter for walks of the type information */
269 /* create a new type primitive */
270 type_primitive *new_type_primitive (ident *name, ir_mode *mode);
272 /* manipulate fields of type_primitive */
273 char *get_primitive_name (type_primitive *primitive);
274 ident *get_primitive_ident (type_primitive *primitive);
276 void set_primitive_name (type_primitive *primitive, char *name);
277 void set_primitive_ident (type_primitive *primitive, ident* ident);
279 ir_mode *get_primitive_mode (type_primitive *primitive);
280 void set_primitive_mode (type_primitive *primitive, ir_mode *mode);
285 /*******************************************************************/
286 /** To manage all different types the same **/
287 /*******************************************************************/
295 type_union uni; /* union is keyword */
296 type_enumeration enumeration;
297 type_pointer pointer;
298 type_primitive primitive;
301 int is_type(void *thing);
306 # endif /* _TYPE_H_ */