a const parameter is enough for get_method_XXX()
[libfirm] / ir / tr / type.c
1 /*
2  * Copyright (C) 1995-2011 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file    type.c
22  * @brief   Representation of types.
23  * @author  Goetz Lindenmaier, Michael Beck
24  * @version $Id$
25  * @brief
26  *
27  *  Implementation of the datastructure to hold
28  *  type information.
29  *
30  *  This module supplies a datastructure to represent all types
31  *  known in the compiled program.  This includes types specified
32  *  in the program as well as types defined by the language.  In the
33  *  view of the intermediate representation there is no difference
34  *  between these types.
35  *
36  *  There exist several kinds of types, arranged by the structure of
37  *  the type.  A type is described by a set of attributes.  Some of
38  *  these attributes are common to all types, others depend on the
39  *  kind of the type.
40  *
41  *  Types are different from the modes defined in irmode:  Types are
42  *  on the level of the programming language, modes at the level of
43  *  the target processor.
44  */
45 #include "config.h"
46
47 #include <string.h>
48 #include <stdlib.h>
49 #include <stddef.h>
50
51 #include "type_t.h"
52
53 #include "xmalloc.h"
54 #include "irprog_t.h"
55 #include "ircons.h"
56 #include "tpop_t.h"
57 #include "tv_t.h"
58 #include "irhooks.h"
59 #include "irtools.h"
60 #include "entity_t.h"
61 #include "error.h"
62 #include "dbginfo.h"
63
64 #include "array.h"
65
66 ir_type *firm_none_type;
67 ir_type *get_none_type(void)
68 {
69         return firm_none_type;
70 }
71
72 ir_type *firm_code_type;
73 ir_type *get_code_type(void)
74 {
75         return firm_code_type;
76 }
77
78 ir_type *firm_unknown_type;
79 ir_type *get_unknown_type(void)
80 {
81         return firm_unknown_type;
82 }
83
84 void ir_init_type(void)
85 {
86         /* construct none and unknown type. */
87         firm_none_type = new_type(tpop_none, mode_BAD, NULL);
88         set_type_size_bytes(firm_none_type, 0);
89         set_type_state (firm_none_type, layout_fixed);
90         remove_irp_type(firm_none_type);
91
92         firm_code_type = new_type(tpop_code, mode_ANY, NULL);
93         set_type_state(firm_code_type, layout_fixed);
94         remove_irp_type(firm_code_type);
95
96         firm_unknown_type = new_type(tpop_unknown, mode_ANY, NULL);
97         set_type_size_bytes(firm_unknown_type, 0);
98         set_type_state (firm_unknown_type, layout_fixed);
99         remove_irp_type(firm_unknown_type);
100 }
101
102 void ir_finish_type(void)
103 {
104         if (firm_none_type != NULL) {
105                 free_type(firm_none_type);
106                 firm_none_type = NULL;
107         }
108         if (firm_code_type != NULL) {
109                 free_type(firm_code_type);
110                 firm_code_type = NULL;
111         }
112         if (firm_unknown_type != NULL) {
113                 free_type(firm_unknown_type);
114                 firm_unknown_type = NULL;
115         }
116 }
117
118 /** the global type visited flag */
119 ir_visited_t firm_type_visited;
120
121 void (set_master_type_visited)(ir_visited_t val)
122 {
123         _set_master_type_visited(val);
124 }
125
126 ir_visited_t (get_master_type_visited)(void)
127 {
128         return _get_master_type_visited();
129 }
130
131 void (inc_master_type_visited)(void)
132 {
133         _inc_master_type_visited();
134 }
135
136 ir_type *new_type(const tp_op *type_op, ir_mode *mode, type_dbg_info *db)
137 {
138         ir_type *res;
139         size_t node_size;
140
141         node_size = offsetof(ir_type, attr) +  type_op->attr_size;
142         res = (ir_type*)xmalloc(node_size);
143         memset(res, 0, node_size);
144
145         res->kind       = k_type;
146         res->type_op    = type_op;
147         res->mode       = mode;
148         res->visibility = ir_visibility_external;
149         res->flags      = tf_none;
150         res->size       = 0;
151         res->align      = 0;
152         res->visit      = 0;
153         res->link       = NULL;
154         res->dbi        = db;
155         res->assoc_type = NULL;
156 #ifdef DEBUG_libfirm
157         res->nr         = get_irp_new_node_nr();
158 #endif /* defined DEBUG_libfirm */
159
160         add_irp_type(res);   /* Remember the new type global. */
161
162         return res;
163 }
164
165 void free_type(ir_type *tp)
166 {
167         const tp_op *op = get_type_tpop(tp);
168
169         if ((get_type_tpop(tp) == tpop_none) || (get_type_tpop(tp) == tpop_unknown)
170                         || (get_type_tpop(tp) == tpop_code))
171                 return;
172         /* Remove from list of all types */
173         remove_irp_type(tp);
174         /* Free the attributes of the type. */
175         free_type_attrs(tp);
176         /* Free entities automatically allocated with the ir_type */
177         if (op->ops.free_auto_entities)
178                 op->ops.free_auto_entities(tp);
179         /* And now the type itself... */
180         tp->kind = k_BAD;
181         free(tp);
182 }
183
184 void free_type_entities(ir_type *tp)
185 {
186         const tp_op *tpop = get_type_tpop(tp);
187
188         if (tpop->ops.free_entities)
189                 tpop->ops.free_entities(tp);
190 }
191
192 void free_type_attrs(ir_type *tp)
193 {
194         const tp_op *tpop = get_type_tpop(tp);
195
196         if (tpop->ops.free_attrs)
197                 tpop->ops.free_attrs(tp);
198 }
199
200 void *(get_type_link)(const ir_type *tp)
201 {
202         return _get_type_link(tp);
203 }
204
205 void (set_type_link)(ir_type *tp, void *l)
206 {
207         _set_type_link(tp, l);
208 }
209
210 const tp_op *(get_type_tpop)(const ir_type *tp)
211 {
212         return _get_type_tpop(tp);
213 }
214
215 ident *(get_type_tpop_nameid)(const ir_type *tp)
216 {
217         return _get_type_tpop_nameid(tp);
218 }
219
220 const char* get_type_tpop_name(const ir_type *tp)
221 {
222         assert(tp && tp->kind == k_type);
223         return get_id_str(tp->type_op->name);
224 }
225
226 tp_opcode (get_type_tpop_code)(const ir_type *tp)
227 {
228         return _get_type_tpop_code(tp);
229 }
230
231 ir_mode *(get_type_mode)(const ir_type *tp)
232 {
233         return _get_type_mode(tp);
234 }
235
236 void set_type_mode(ir_type *tp, ir_mode *mode)
237 {
238         const tp_op *tpop = get_type_tpop(tp);
239
240         if (tpop->ops.set_type_mode)
241                 tpop->ops.set_type_mode(tp, mode);
242         else
243                 assert(0 && "setting a mode is NOT allowed for this type");
244 }
245
246 /* Outputs a unique number for this node */
247 long get_type_nr(const ir_type *tp)
248 {
249         assert(tp);
250 #ifdef DEBUG_libfirm
251         return tp->nr;
252 #else
253         return (long)PTR_TO_INT(tp);
254 #endif
255 }
256
257 unsigned (get_type_size_bytes)(const ir_type *tp)
258 {
259         return _get_type_size_bytes(tp);
260 }
261
262 ir_visibility get_type_visibility(const ir_type *tp)
263 {
264         assert(is_type(tp));
265         return tp->visibility;
266 }
267
268 void set_type_visibility(ir_type *tp, ir_visibility v)
269 {
270         assert(is_type(tp));
271         tp->visibility = v;
272 }
273
274 void set_type_size_bytes(ir_type *tp, unsigned size)
275 {
276         const tp_op *tpop = get_type_tpop(tp);
277
278         if (tpop->ops.set_type_size)
279                 tpop->ops.set_type_size(tp, size);
280         else
281                 assert(0 && "Cannot set size for this type");
282 }
283
284 unsigned get_type_alignment_bytes(ir_type *tp)
285 {
286         unsigned align = 1;
287
288         if (tp->align > 0)
289                 return tp->align;
290
291         /* alignment NOT set calculate it "on demand" */
292         if (tp->mode)
293                 align = (get_mode_size_bits(tp->mode) + 7) >> 3;
294         else if (is_Array_type(tp))
295                 align = get_type_alignment_bytes(get_array_element_type(tp));
296         else if (is_compound_type(tp)) {
297                 size_t i, n = get_compound_n_members(tp);
298
299                 align = 0;
300                 for (i = 0; i < n; ++i) {
301                         ir_type  *t = get_entity_type(get_compound_member(tp, i));
302                         unsigned a  = get_type_alignment_bytes(t);
303
304                         if (a > align)
305                                 align = a;
306                 }
307         } else if (is_Method_type(tp)) {
308                 align = 0;
309         }
310
311         /* write back */
312         tp->align = align;
313
314         return align;
315 }
316
317 void set_type_alignment_bytes(ir_type *tp, unsigned align)
318 {
319         assert(tp && tp->kind == k_type);
320         /* Methods don't have an alignment. */
321         if (tp->type_op != type_method) {
322                 tp->align = align;
323         }
324 }
325
326 const char *get_type_state_name(ir_type_state s)
327 {
328 #define X(a)    case a: return #a
329         switch (s) {
330                 X(layout_undefined);
331                 X(layout_fixed);
332         }
333         return "<unknown>";
334 #undef X
335 }
336
337 ir_type_state (get_type_state)(const ir_type *tp)
338 {
339         return _get_type_state(tp);
340 }
341
342 void set_type_state(ir_type *tp, ir_type_state state)
343 {
344         assert(tp && tp->kind == k_type);
345
346         if ((tp->type_op == type_pointer) || (tp->type_op == type_primitive) ||
347                 (tp->type_op == type_method))
348                 return;
349
350         /* Just a correctness check: */
351         if (state == layout_fixed) {
352                 size_t i;
353                 switch (get_type_tpop_code(tp)) {
354                 case tpo_class:
355                         if (tp != get_glob_type()) {
356                                 size_t n_mem = get_class_n_members(tp);
357                                 for (i = 0; i < n_mem; i++) {
358                                         ir_entity *entity = get_class_member(tp, i);
359                                         if (is_Method_type(get_entity_type(entity)))
360                                                 continue;
361                                         assert(get_entity_offset(entity) > -1);
362                                 }
363                         }
364                         break;
365                 case tpo_struct:
366                         for (i = 0; i < get_struct_n_members(tp); i++) {
367                                 assert(get_entity_offset(get_struct_member(tp, i)) > -1);
368                         }
369                         break;
370                 case tpo_union:
371                         break;
372                 case tpo_array:
373                         break;
374                 case tpo_enumeration: {
375 #ifndef NDEBUG
376                         size_t n_enums = get_enumeration_n_enums(tp);
377                         assert(get_type_mode(tp) != NULL);
378                         for (i = 0; i < n_enums; ++i) {
379                                 ir_enum_const *ec = get_enumeration_const(tp, i);
380                                 ir_tarval     *tv = get_enumeration_value(ec);
381                                 assert(tv != NULL && tv != tarval_bad);
382                         }
383 #endif
384                         break;
385                 }
386                 default: break;
387                 }
388         }
389         if (state == layout_fixed)
390                 tp->flags |= tf_layout_fixed;
391         else
392                 tp->flags &= ~tf_layout_fixed;
393 }
394
395 ir_visited_t (get_type_visited)(const ir_type *tp)
396 {
397         return _get_type_visited(tp);
398 }
399
400 void (set_type_visited)(ir_type *tp, ir_visited_t num)
401 {
402         _set_type_visited(tp, num);
403 }
404
405 void (mark_type_visited)(ir_type *tp)
406 {
407         _mark_type_visited(tp);
408 }
409
410 int (type_visited)(const ir_type *tp)
411 {
412         return _type_visited(tp);
413 }
414
415 int (type_not_visited)(const ir_type *tp)
416 {
417         return _type_not_visited(tp);
418 }
419
420 type_dbg_info *(get_type_dbg_info)(const ir_type *tp)
421 {
422         return _get_type_dbg_info(tp);
423 }
424
425 void (set_type_dbg_info)(ir_type *tp, type_dbg_info *db)
426 {
427         _set_type_dbg_info(tp, db);
428 }
429
430 int (is_type)(const void *thing)
431 {
432         return _is_type(thing);
433 }
434
435 /* Checks whether two types are structural equal.*/
436 int equal_type(ir_type *typ1, ir_type *typ2)
437 {
438         ir_entity **m;
439         ir_type **t;
440         size_t i;
441         size_t j;
442
443         if (typ1 == typ2) return 1;
444
445         if ((get_type_tpop_code(typ1) != get_type_tpop_code(typ2)) ||
446             typ1->name != typ2->name ||
447             (get_type_mode(typ1) != get_type_mode(typ2)) ||
448             (get_type_state(typ1) != get_type_state(typ2)))
449                 return 0;
450         if ((get_type_state(typ1) == layout_fixed) &&
451                 (get_type_size_bytes(typ1) != get_type_size_bytes(typ2)))
452                 return 0;
453
454         switch (get_type_tpop_code(typ1)) {
455         case tpo_class:
456                 if (get_class_n_members(typ1) != get_class_n_members(typ2)) return 0;
457                 if (get_class_n_subtypes(typ1) != get_class_n_subtypes(typ2)) return 0;
458                 if (get_class_n_supertypes(typ1) != get_class_n_supertypes(typ2)) return 0;
459                 if (get_class_peculiarity(typ1) != get_class_peculiarity(typ2)) return 0;
460                 /** Compare the members **/
461                 m = ALLOCANZ(ir_entity*, get_class_n_members(typ1));
462                 /* First sort the members of typ2 */
463                 for (i = 0; i < get_class_n_members(typ1); i++) {
464                         ir_entity *e1 = get_class_member(typ1, i);
465                         for (j = 0; j < get_class_n_members(typ2); j++) {
466                                 ir_entity *e2 = get_class_member(typ2, j);
467                                 if (get_entity_name(e1) == get_entity_name(e2))
468                                         m[i] = e2;
469                         }
470                 }
471                 for (i = 0; i < get_class_n_members(typ1); i++) {
472                         if (!m[i] || get_class_member(typ1, i) != m[i])
473                                 return 0;
474                 }
475                 /** Compare the supertypes **/
476                 t = ALLOCANZ(ir_type*, get_class_n_supertypes(typ1));
477                 /* First sort the supertypes of typ2 */
478                 for (i = 0; i < get_class_n_supertypes(typ1); i++) {
479                         ir_type *t1 = get_class_supertype(typ1, i);
480                         for (j = 0; j < get_class_n_supertypes(typ2); j++) {
481                                 ir_type *t2 = get_class_supertype(typ2, j);
482                                 if (t2->name == t1->name)
483                                         t[i] = t2;
484                         }
485                 }
486                 for (i = 0; i < get_class_n_supertypes(typ1); i++) {
487                         if (!t[i]  ||  /* Found no counterpart */
488                                 get_class_supertype(typ1, i) != t[i])
489                                 return 0;
490                 }
491                 break;
492
493         case tpo_struct:
494                 if (get_struct_n_members(typ1) != get_struct_n_members(typ2)) return 0;
495                 m = ALLOCANZ(ir_entity*, get_struct_n_members(typ1));
496                 /* First sort the members of lt */
497                 for (i = 0; i < get_struct_n_members(typ1); i++) {
498                         ir_entity *e1 = get_struct_member(typ1, i);
499                         for (j = 0; j < get_struct_n_members(typ2); j++) {
500                                 ir_entity *e2 = get_struct_member(typ2, j);
501                                 if (get_entity_name(e1) == get_entity_name(e2))
502                                         m[i] = e2;
503                         }
504                 }
505                 for (i = 0; i < get_struct_n_members(typ1); i++) {
506                         if (!m[i] || get_struct_member(typ1, i) != m[i])
507                                 return 0;
508                 }
509                 break;
510
511         case tpo_method: {
512                 size_t n_param1;
513                 size_t n_param2;
514
515                 if (get_method_variadicity(typ1) != get_method_variadicity(typ2)) return 0;
516                 if (get_method_n_ress(typ1)      != get_method_n_ress(typ2)) return 0;
517                 if (get_method_calling_convention(typ1) !=
518                     get_method_calling_convention(typ2)) return 0;
519
520                 n_param1 = get_method_n_params(typ1);
521                 n_param2 = get_method_n_params(typ2);
522
523                 if (n_param1 != n_param2) return 0;
524
525                 for (i = 0; i < n_param1; i++) {
526                         if (!equal_type(get_method_param_type(typ1, i), get_method_param_type(typ2, i)))
527                                 return 0;
528                 }
529                 for (i = 0; i < get_method_n_ress(typ1); i++) {
530                         if (!equal_type(get_method_res_type(typ1, i), get_method_res_type(typ2, i)))
531                                 return 0;
532                 }
533         } break;
534
535         case tpo_union:
536                 if (get_union_n_members(typ1) != get_union_n_members(typ2)) return 0;
537                 m = ALLOCANZ(ir_entity*, get_union_n_members(typ1));
538                 /* First sort the members of lt */
539                 for (i = 0; i < get_union_n_members(typ1); i++) {
540                         ir_entity *e1 = get_union_member(typ1, i);
541                         for (j = 0; j < get_union_n_members(typ2); j++) {
542                                 ir_entity *e2 = get_union_member(typ2, j);
543                                 if (get_entity_name(e1) == get_entity_name(e2))
544                                         m[i] = e2;
545                         }
546                 }
547                 for (i = 0; i < get_union_n_members(typ1); i++) {
548                         if (!m[i] || get_union_member(typ1, i) != m[i])
549                                 return 0;
550                 }
551                 break;
552
553         case tpo_array:
554                 if (get_array_n_dimensions(typ1) != get_array_n_dimensions(typ2))
555                         return 0;
556                 if (!equal_type(get_array_element_type(typ1), get_array_element_type(typ2)))
557                         return 0;
558                 for (i = 0; i < get_array_n_dimensions(typ1); i++) {
559                         if (get_array_lower_bound(typ1, i) != get_array_lower_bound(typ2, i) ||
560                                 get_array_upper_bound(typ1, i) != get_array_upper_bound(typ2, i))
561                                 return 0;
562                         if (get_array_order(typ1, i) != get_array_order(typ2, i))
563                                 assert(0 && "type compare with different dimension orders not implemented");
564                 }
565                 break;
566
567         case tpo_enumeration:
568                 assert(0 && "enumerations not implemented");
569                 break;
570
571         case tpo_pointer:
572                 if (get_pointer_points_to_type(typ1) != get_pointer_points_to_type(typ2))
573                         return 0;
574                 break;
575
576         case tpo_primitive:
577                 break;
578
579         default: break;
580         }
581         return 1;
582 }
583
584 int smaller_type(ir_type *st, ir_type *lt)
585 {
586         ir_entity **m;
587         size_t i;
588         size_t j;
589         size_t n_st_members;
590
591         if (st == lt) return 1;
592
593         if (get_type_tpop_code(st) != get_type_tpop_code(lt))
594                 return 0;
595
596         switch (get_type_tpop_code(st)) {
597         case tpo_class:
598                 return is_SubClass_of(st, lt);
599
600         case tpo_struct:
601                 n_st_members = get_struct_n_members(st);
602                 if (n_st_members != get_struct_n_members(lt))
603                         return 0;
604
605                 m = ALLOCANZ(ir_entity*, n_st_members);
606                 /* First sort the members of lt */
607                 for (i = 0; i < n_st_members; ++i) {
608                         ir_entity *se = get_struct_member(st, i);
609                         size_t n = get_struct_n_members(lt);
610                         for (j = 0; j < n; ++j) {
611                                 ir_entity *le = get_struct_member(lt, j);
612                                 if (get_entity_name(le) == get_entity_name(se))
613                                         m[i] = le;
614                         }
615                 }
616                 for (i = 0; i < n_st_members; i++) {
617                         if (!m[i]  ||  /* Found no counterpart */
618                             !smaller_type(get_entity_type(get_struct_member(st, i)), get_entity_type(m[i])))
619                                 return 0;
620                 }
621                 break;
622
623         case tpo_method: {
624                 size_t n_param1, n_param2;
625
626                 /** FIXME: is this still 1? */
627                 if (get_method_variadicity(st) != get_method_variadicity(lt)) return 0;
628                 if (get_method_n_ress(st) != get_method_n_ress(lt)) return 0;
629                 if (get_method_calling_convention(st) !=
630                     get_method_calling_convention(lt)) return 0;
631
632                 n_param1 = get_method_n_params(st);
633                 n_param2 = get_method_n_params(lt);
634
635                 if (n_param1 != n_param2) return 0;
636
637                 for (i = 0; i < get_method_n_params(st); i++) {
638                         if (!smaller_type(get_method_param_type(st, i), get_method_param_type(lt, i)))
639                                 return 0;
640                 }
641                 for (i = 0; i < get_method_n_ress(st); i++) {
642                         if (!smaller_type(get_method_res_type(st, i), get_method_res_type(lt, i)))
643                                 return 0;
644                 }
645         } break;
646
647         case tpo_union:
648                 n_st_members = get_union_n_members(st);
649                 if (n_st_members != get_union_n_members(lt)) return 0;
650                 m = ALLOCANZ(ir_entity*, n_st_members);
651                 /* First sort the members of lt */
652                 for (i = 0; i < n_st_members; ++i) {
653                         ir_entity *se = get_union_member(st, i);
654                         size_t n = get_union_n_members(lt);
655                         for (j = 0; j < n; ++j) {
656                                 ir_entity *le = get_union_member(lt, j);
657                                 if (get_entity_name(le) == get_entity_name(se))
658                                         m[i] = le;
659                         }
660                 }
661                 for (i = 0; i < n_st_members; ++i) {
662                         if (!m[i]  ||  /* Found no counterpart */
663                                 !smaller_type(get_entity_type(get_union_member(st, i)), get_entity_type(m[i])))
664                                 return 0;
665                 }
666                 break;
667
668         case tpo_array: {
669                 ir_type *set, *let;  /* small/large elt. ir_type */
670                 if (get_array_n_dimensions(st) != get_array_n_dimensions(lt))
671                         return 0;
672                 set = get_array_element_type(st);
673                 let = get_array_element_type(lt);
674                 if (set != let) {
675                         /* If the element types are different, set must be convertible
676                            to let, and they must have the same size so that address
677                            computations work out.  To have a size the layout must
678                            be fixed. */
679                         if ((get_type_state(set) != layout_fixed) ||
680                             (get_type_state(let) != layout_fixed))
681                                 return 0;
682                         if (!smaller_type(set, let) ||
683                             get_type_size_bytes(set) != get_type_size_bytes(let))
684                                 return 0;
685                 }
686                 for (i = 0; i < get_array_n_dimensions(st); i++) {
687                         if (get_array_lower_bound(lt, i))
688                                 if (get_array_lower_bound(st, i) != get_array_lower_bound(lt, i))
689                                         return 0;
690                                 if (get_array_upper_bound(lt, i))
691                                         if (get_array_upper_bound(st, i) != get_array_upper_bound(lt, i))
692                                                 return 0;
693                 }
694         } break;
695
696         case tpo_enumeration:
697                 assert(0 && "enumerations not implemented");
698                 break;
699
700         case tpo_pointer:
701                 if (!smaller_type(get_pointer_points_to_type(st), get_pointer_points_to_type(lt)))
702                         return 0;
703                 break;
704
705         case tpo_primitive:
706                 if (!smaller_mode(get_type_mode(st), get_type_mode(lt)))
707                         return 0;
708                 break;
709
710         default: break;
711         }
712         return 1;
713 }
714
715
716 ir_type *new_d_type_class(ident *name, type_dbg_info *db)
717 {
718         ir_type *res;
719
720         res = new_type(type_class, NULL, db);
721         res->name = name;
722
723         res->attr.ca.members     = NEW_ARR_F (ir_entity *, 0);
724         res->attr.ca.subtypes    = NEW_ARR_F (ir_type *, 0);
725         res->attr.ca.supertypes  = NEW_ARR_F (ir_type *, 0);
726         res->attr.ca.peculiarity = peculiarity_existent;
727         res->attr.ca.type_info   = NULL;
728         res->attr.ca.vtable_size = 0;
729         res->attr.ca.clss_flags  = cf_none;
730         res->attr.ca.dfn         = 0;
731         hook_new_type(res);
732         return res;
733 }
734
735 ir_type *new_type_class(ident *name)
736 {
737         return new_d_type_class(name, NULL);
738 }
739
740 void free_class_entities(ir_type *clss)
741 {
742         size_t i;
743         assert(clss && (clss->type_op == type_class));
744         /* we must iterate backward here */
745         for (i = get_class_n_members(clss); i > 0;)
746                 free_entity(get_class_member(clss, --i));
747         /* do NOT free the type info here. It belongs to another class */
748 }
749
750 void free_class_attrs(ir_type *clss)
751 {
752         assert(clss && (clss->type_op == type_class));
753         DEL_ARR_F(clss->attr.ca.members);
754         DEL_ARR_F(clss->attr.ca.subtypes);
755         DEL_ARR_F(clss->attr.ca.supertypes);
756 }
757
758 ident *get_class_ident(const ir_type *clss)
759 {
760         assert(clss->type_op == type_class);
761         return clss->name;
762 }
763
764 const char *get_class_name(const ir_type *clss)
765 {
766         if (get_class_ident(clss) == NULL)
767                 return NULL;
768         return get_id_str(get_class_ident(clss));
769 }
770
771 static void add_class_member(ir_type *clss, ir_entity *member)
772 {
773         assert(clss && (clss->type_op == type_class));
774         assert(clss != get_entity_type(member) && "recursive type");
775         ARR_APP1 (ir_entity *, clss->attr.ca.members, member);
776 }
777
778 size_t (get_class_n_members)(const ir_type *clss)
779 {
780         return _get_class_n_members(clss);
781 }
782
783 size_t get_class_member_index(const ir_type *clss, ir_entity *mem)
784 {
785         size_t i, n;
786         assert(clss && (clss->type_op == type_class));
787         for (i = 0, n = get_class_n_members(clss); i < n; ++i) {
788                 if (get_class_member(clss, i) == mem)
789                         return i;
790         }
791         return INVALID_MEMBER_INDEX;
792 }
793
794 ir_entity *(get_class_member)(const ir_type *clss, size_t pos)
795 {
796         return _get_class_member(clss, pos);
797 }
798
799 ir_entity *get_class_member_by_name(ir_type *clss, ident *name)
800 {
801         size_t i, n_mem;
802         assert(clss && (clss->type_op == type_class));
803         n_mem = get_class_n_members(clss);
804         for (i = 0; i < n_mem; ++i) {
805                 ir_entity *mem = get_class_member(clss, i);
806                 if (get_entity_ident(mem) == name)
807                         return mem;
808         }
809         return NULL;
810 }
811
812 static void remove_class_member(ir_type *clss, ir_entity *member)
813 {
814         size_t i;
815         assert(clss && (clss->type_op == type_class));
816         for (i = 0; i < ARR_LEN(clss->attr.ca.members); ++i) {
817                 if (clss->attr.ca.members[i] == member) {
818                         for (; i < ARR_LEN(clss->attr.ca.members) - 1; ++i)
819                                 clss->attr.ca.members[i] = clss->attr.ca.members[i + 1];
820                         ARR_SETLEN(ir_entity*, clss->attr.ca.members, ARR_LEN(clss->attr.ca.members) - 1);
821                         break;
822                 }
823         }
824 }
825
826 void add_class_subtype(ir_type *clss, ir_type *subtype)
827 {
828         size_t i;
829         assert(clss->type_op == type_class);
830         ARR_APP1 (ir_type *, clss->attr.ca.subtypes, subtype);
831         for (i = 0; i < get_class_n_supertypes(subtype); i++) {
832                 if (get_class_supertype(subtype, i) == clss)
833                         /* Class already registered */
834                         return;
835         }
836         ARR_APP1(ir_type *, subtype->attr.ca.supertypes, clss);
837 }
838
839 size_t get_class_n_subtypes(const ir_type *clss)
840 {
841         assert(clss->type_op == type_class);
842         return ARR_LEN (clss->attr.ca.subtypes);
843 }
844
845 ir_type *get_class_subtype(ir_type *clss, size_t pos)
846 {
847         assert(clss->type_op == type_class);
848         assert(pos < get_class_n_subtypes(clss));
849         return clss->attr.ca.subtypes[pos];
850 }
851
852 size_t get_class_subtype_index(ir_type *clss, const ir_type *subclass)
853 {
854         size_t i, n_subtypes = get_class_n_subtypes(clss);
855         assert(is_Class_type(subclass));
856         for (i = 0; i < n_subtypes; ++i) {
857                 if (get_class_subtype(clss, i) == subclass)
858                         return i;
859         }
860         return (size_t)-1;
861 }
862
863 void set_class_subtype(ir_type *clss, ir_type *subtype, size_t pos)
864 {
865         assert(clss->type_op == type_class);
866         assert(pos < get_class_n_subtypes(clss));
867         clss->attr.ca.subtypes[pos] = subtype;
868 }
869
870 void remove_class_subtype(ir_type *clss, ir_type *subtype)
871 {
872         size_t i;
873         assert(clss && (clss->type_op == type_class));
874         for (i = 0; i < ARR_LEN(clss->attr.ca.subtypes); ++i) {
875                 if (clss->attr.ca.subtypes[i] == subtype) {
876                         for (; i < ARR_LEN(clss->attr.ca.subtypes) - 1; ++i)
877                                 clss->attr.ca.subtypes[i] = clss->attr.ca.subtypes[i+1];
878                         ARR_SETLEN(ir_type*, clss->attr.ca.subtypes, ARR_LEN(clss->attr.ca.subtypes) - 1);
879                         break;
880                 }
881         }
882 }
883
884 void add_class_supertype(ir_type *clss, ir_type *supertype)
885 {
886         size_t i;
887         size_t n;
888         assert(clss && (clss->type_op == type_class));
889         assert(supertype && (supertype -> type_op == type_class));
890         ARR_APP1 (ir_type *, clss->attr.ca.supertypes, supertype);
891         for (i = 0, n = get_class_n_subtypes(supertype); i < n; ++i) {
892                 if (get_class_subtype(supertype, i) == clss)
893                         /* Class already registered */
894                         return;
895         }
896         ARR_APP1(ir_type *, supertype->attr.ca.subtypes, clss);
897 }
898
899 size_t get_class_n_supertypes(const ir_type *clss)
900 {
901         assert(clss->type_op == type_class);
902         return ARR_LEN(clss->attr.ca.supertypes);
903 }
904
905 size_t get_class_supertype_index(ir_type *clss, ir_type *super_clss)
906 {
907         size_t i, n_supertypes = get_class_n_supertypes(clss);
908         assert(super_clss && (super_clss->type_op == type_class));
909         for (i = 0; i < n_supertypes; i++) {
910                 if (get_class_supertype(clss, i) == super_clss)
911                         return i;
912         }
913         return (size_t)-1;
914 }
915
916 ir_type *get_class_supertype(ir_type *clss, size_t pos)
917 {
918         assert(clss->type_op == type_class);
919         assert(pos < get_class_n_supertypes(clss));
920         return clss->attr.ca.supertypes[pos];
921 }
922
923 void set_class_supertype(ir_type *clss, ir_type *supertype, size_t pos)
924 {
925         assert(clss->type_op == type_class);
926         assert(pos < get_class_n_supertypes(clss));
927         clss->attr.ca.supertypes[pos] = supertype;
928 }
929
930 void remove_class_supertype(ir_type *clss, ir_type *supertype)
931 {
932         size_t i;
933         assert(clss && (clss->type_op == type_class));
934         for (i = 0; i < ARR_LEN(clss->attr.ca.supertypes); ++i) {
935                 if (clss->attr.ca.supertypes[i] == supertype) {
936                         for (; i < ARR_LEN(clss->attr.ca.supertypes) - 1; ++i)
937                                 clss->attr.ca.supertypes[i] = clss->attr.ca.supertypes[i+1];
938                         ARR_SETLEN(ir_type*, clss->attr.ca.supertypes, ARR_LEN(clss->attr.ca.supertypes) - 1);
939                         break;
940                 }
941         }
942 }
943
944 ir_entity *get_class_type_info(const ir_type *clss)
945 {
946         return clss->attr.ca.type_info;
947 }
948
949 void set_class_type_info(ir_type *clss, ir_entity *ent)
950 {
951         clss->attr.ca.type_info = ent;
952         if (ent)
953                 ent->repr_class = clss;
954 }
955
956 ir_peculiarity get_class_peculiarity(const ir_type *clss)
957 {
958         assert(clss && (clss->type_op == type_class));
959         return clss->attr.ca.peculiarity;
960 }
961
962 void set_class_peculiarity(ir_type *clss, ir_peculiarity pec)
963 {
964         assert(clss && (clss->type_op == type_class));
965         assert(pec != peculiarity_inherited);  /* There is no inheritance of types in libFirm. */
966         clss->attr.ca.peculiarity = pec;
967 }
968
969 unsigned (get_class_vtable_size)(const ir_type *clss)
970 {
971         return _get_class_vtable_size(clss);
972 }
973
974 void (set_class_vtable_size)(ir_type *clss, unsigned size)
975 {
976         _set_class_vtable_size(clss, size);
977 }
978
979 int (is_class_final)(const ir_type *clss)
980 {
981         return _is_class_final(clss);
982 }
983
984 void (set_class_final)(ir_type *clss, int flag)
985 {
986         _set_class_final(clss, flag);
987 }
988
989 int (is_class_interface)(const ir_type *clss)
990 {
991         return _is_class_interface(clss);
992 }
993
994 void (set_class_interface)(ir_type *clss, int flag)
995 {
996         _set_class_interface(clss, flag);
997 }
998
999 int (is_class_abstract)(const ir_type *clss)
1000 {
1001          return _is_class_abstract(clss);
1002 }
1003
1004 void (set_class_abstract)(ir_type *clss, int final)
1005 {
1006         _set_class_abstract(clss, final);
1007 }
1008
1009 void set_class_dfn(ir_type *clss, int dfn)
1010 {
1011         clss->attr.ca.dfn = dfn;
1012 }
1013
1014 int get_class_dfn(const ir_type *clss)
1015 {
1016         return (clss->attr.ca.dfn);
1017 }
1018
1019 int (is_Class_type)(const ir_type *clss)
1020 {
1021         return _is_class_type(clss);
1022 }
1023
1024 void set_class_mode(ir_type *tp, ir_mode *mode)
1025 {
1026         /* for classes and structs we allow to set a mode if the layout is fixed AND the size matches */
1027         assert(get_type_state(tp) == layout_fixed &&
1028                tp->size == get_mode_size_bytes(mode) && "mode don't match class layout");
1029         tp->mode = mode;
1030 }
1031
1032 void set_class_size(ir_type *tp, unsigned size)
1033 {
1034         tp->size = size;
1035 }
1036
1037
1038 ir_type *new_d_type_struct(ident *name, type_dbg_info *db)
1039 {
1040         ir_type *res = new_type(type_struct, NULL, db);
1041         res->name = name;
1042
1043         res->attr.sa.members = NEW_ARR_F(ir_entity *, 0);
1044         hook_new_type(res);
1045         return res;
1046 }
1047
1048 ir_type *new_type_struct(ident *name)
1049 {
1050         return new_d_type_struct (name, NULL);
1051 }
1052
1053 void free_struct_entities(ir_type *strct)
1054 {
1055         size_t i;
1056         assert(strct && (strct->type_op == type_struct));
1057         /* we must iterate backward here */
1058         for (i = get_struct_n_members(strct); i > 0;)
1059                 free_entity(get_struct_member(strct, --i));
1060 }
1061
1062 void free_struct_attrs(ir_type *strct)
1063 {
1064         assert(strct && (strct->type_op == type_struct));
1065         DEL_ARR_F(strct->attr.sa.members);
1066 }
1067
1068 ident *get_struct_ident(const ir_type *strct)
1069 {
1070         assert(strct->type_op == type_struct);
1071         return strct->name;
1072 }
1073
1074 const char *get_struct_name(const ir_type *strct)
1075 {
1076         if (get_struct_ident(strct) == NULL)
1077                 return NULL;
1078         return get_id_str(get_struct_ident(strct));
1079 }
1080
1081 size_t get_struct_n_members(const ir_type *strct)
1082 {
1083         assert(strct->type_op == type_struct);
1084         return ARR_LEN(strct->attr.sa.members);
1085 }
1086
1087 static void add_struct_member(ir_type *strct, ir_entity *member)
1088 {
1089         assert(strct && (strct->type_op == type_struct));
1090         assert(get_type_tpop(get_entity_type(member)) != type_method);
1091         assert(strct != get_entity_type(member) && "recursive type");
1092         ARR_APP1 (ir_entity *, strct->attr.sa.members, member);
1093 }
1094
1095 ir_entity *get_struct_member(const ir_type *strct, size_t pos)
1096 {
1097         assert(strct && (strct->type_op == type_struct));
1098         assert(pos < get_struct_n_members(strct));
1099         return strct->attr.sa.members[pos];
1100 }
1101
1102 size_t get_struct_member_index(const ir_type *strct, ir_entity *mem)
1103 {
1104         size_t i, n;
1105         assert(strct && (strct->type_op == type_struct));
1106         for (i = 0, n = get_struct_n_members(strct); i < n; ++i) {
1107                 if (get_struct_member(strct, i) == mem)
1108                         return i;
1109         }
1110         return (size_t)-1;
1111 }
1112
1113 static void remove_struct_member(ir_type *strct, ir_entity *member)
1114 {
1115         size_t i;
1116         assert(strct && (strct->type_op == type_struct));
1117         for (i = 0; i < ARR_LEN(strct->attr.sa.members); ++i) {
1118                 if (strct->attr.sa.members[i] == member) {
1119                         for (; i < ARR_LEN(strct->attr.sa.members) - 1; ++i)
1120                                 strct->attr.sa.members[i] = strct->attr.sa.members[i+1];
1121                         ARR_SETLEN(ir_entity*, strct->attr.sa.members, ARR_LEN(strct->attr.sa.members) - 1);
1122                         break;
1123                 }
1124         }
1125 }
1126
1127 int (is_Struct_type)(const ir_type *strct)
1128 {
1129         return _is_struct_type(strct);
1130 }
1131
1132 void set_struct_mode(ir_type *tp, ir_mode *mode)
1133 {
1134         /* for classes and structs we allow to set a mode if the layout is fixed AND the size matches */
1135         assert(get_type_state(tp) == layout_fixed &&
1136                tp->size == get_mode_size_bytes(mode) && "mode don't match struct layout");
1137         tp->mode = mode;
1138 }
1139
1140 void set_struct_size(ir_type *tp, unsigned size)
1141 {
1142         tp->size = size;
1143 }
1144
1145 ir_type *new_d_type_method(size_t n_param, size_t n_res, type_dbg_info *db)
1146 {
1147         ir_type *res;
1148
1149         assert((get_mode_size_bits(mode_P_code) % 8 == 0) && "unorthodox modes not implemented");
1150         res = new_type(type_method, mode_P_code, db);
1151         res->flags                       |= tf_layout_fixed;
1152         res->size                         = get_mode_size_bytes(mode_P_code);
1153         res->attr.ma.n_params             = n_param;
1154         res->attr.ma.params               = XMALLOCNZ(tp_ent_pair, n_param);
1155         res->attr.ma.n_res                = n_res;
1156         res->attr.ma.res_type             = XMALLOCNZ(tp_ent_pair, n_res);
1157         res->attr.ma.variadicity          = variadicity_non_variadic;
1158         res->attr.ma.additional_properties = mtp_no_property;
1159         hook_new_type(res);
1160         return res;
1161 }
1162
1163 ir_type *new_type_method(size_t n_param, size_t n_res)
1164 {
1165         return new_d_type_method(n_param, n_res, NULL);
1166 }
1167
1168 ir_type *clone_type_method(ir_type *tp)
1169 {
1170         ir_type  *res;
1171         ir_mode  *mode;
1172         size_t    n_params;
1173         size_t    n_res;
1174         type_dbg_info *db;
1175
1176         assert(is_Method_type(tp));
1177
1178         mode     = tp->mode;
1179         n_params = tp->attr.ma.n_params;
1180         n_res    = tp->attr.ma.n_res;
1181         db       = tp->dbi;
1182
1183         res = new_type(type_method, mode, db);
1184
1185         res->flags                         = tp->flags;
1186         res->assoc_type                    = tp->assoc_type;
1187         res->size                          = tp->size;
1188         res->attr.ma.n_params              = n_params;
1189         res->attr.ma.params                = XMALLOCN(tp_ent_pair, n_params);
1190         memcpy(res->attr.ma.params, tp->attr.ma.params, n_params * sizeof(res->attr.ma.params[0]));
1191         res->attr.ma.n_res                 = n_res;
1192         res->attr.ma.res_type              = XMALLOCN(tp_ent_pair, n_res);
1193         memcpy(res->attr.ma.res_type, tp->attr.ma.res_type, n_res * sizeof(res->attr.ma.res_type[0]));
1194         res->attr.ma.variadicity           = tp->attr.ma.variadicity;
1195         res->attr.ma.additional_properties = tp->attr.ma.additional_properties;
1196         res->attr.ma.irg_calling_conv      = tp->attr.ma.irg_calling_conv;
1197         hook_new_type(res);
1198         return res;
1199 }
1200
1201 void free_method_entities(ir_type *method)
1202 {
1203         (void) method;
1204         assert(method && (method->type_op == type_method));
1205 }
1206
1207 void free_method_attrs(ir_type *method)
1208 {
1209         assert(method && (method->type_op == type_method));
1210         free(method->attr.ma.params);
1211         free(method->attr.ma.res_type);
1212 }
1213
1214 size_t (get_method_n_params)(const ir_type *method)
1215 {
1216         return _get_method_n_params(method);
1217 }
1218
1219 ir_type *get_method_param_type(const ir_type *method, size_t pos)
1220 {
1221         ir_type *res;
1222         assert(method->type_op == type_method);
1223         assert(pos < get_method_n_params(method));
1224         res = method->attr.ma.params[pos].tp;
1225         assert(res != NULL && "empty method param type");
1226         return res;
1227 }
1228
1229 void set_method_param_type(ir_type *method, size_t pos, ir_type *tp)
1230 {
1231         assert(method->type_op == type_method);
1232         assert(pos < get_method_n_params(method));
1233         method->attr.ma.params[pos].tp = tp;
1234 }
1235
1236 size_t (get_method_n_ress)(const ir_type *method)
1237 {
1238         return _get_method_n_ress(method);
1239 }
1240
1241 ir_type *get_method_res_type(const ir_type *method, size_t pos)
1242 {
1243         ir_type *res;
1244         assert(method->type_op == type_method);
1245         assert(pos < get_method_n_ress(method));
1246         res = method->attr.ma.res_type[pos].tp;
1247         assert(res != NULL && "empty method return type");
1248         return res;
1249 }
1250
1251 void set_method_res_type(ir_type *method, size_t pos, ir_type *tp)
1252 {
1253         assert(method->type_op == type_method);
1254         assert(pos < get_method_n_ress(method));
1255         /* set the result ir_type */
1256         method->attr.ma.res_type[pos].tp = tp;
1257         /* If information constructed set pass-by-value representation. */
1258 }
1259
1260 const char *get_variadicity_name(ir_variadicity vari)
1261 {
1262 #define X(a)    case a: return #a
1263         switch (vari) {
1264         X(variadicity_non_variadic);
1265         X(variadicity_variadic);
1266         default:
1267                 return "BAD VALUE";
1268         }
1269 #undef X
1270 }
1271
1272 ir_variadicity get_method_variadicity(const ir_type *method)
1273 {
1274         assert(method && (method->type_op == type_method));
1275         return method->attr.ma.variadicity;
1276 }
1277
1278 void set_method_variadicity(ir_type *method, ir_variadicity vari)
1279 {
1280         assert(method && (method->type_op == type_method));
1281         method->attr.ma.variadicity = vari;
1282 }
1283
1284 mtp_additional_properties (get_method_additional_properties)(const ir_type *method)
1285 {
1286         return _get_method_additional_properties(method);
1287 }
1288
1289 void (set_method_additional_properties)(ir_type *method, mtp_additional_properties mask)
1290 {
1291         _set_method_additional_properties(method, mask);
1292 }
1293
1294 void (add_method_additional_properties)(ir_type *method,
1295                                         mtp_additional_properties flag)
1296 {
1297         _add_method_additional_properties(method, flag);
1298 }
1299
1300 unsigned (get_method_calling_convention)(const ir_type *method)
1301 {
1302         return _get_method_calling_convention(method);
1303 }
1304
1305 void (set_method_calling_convention)(ir_type *method, unsigned cc_mask)
1306 {
1307         _set_method_calling_convention(method, cc_mask);
1308 }
1309
1310 unsigned get_method_n_regparams(ir_type *method)
1311 {
1312         unsigned cc = get_method_calling_convention(method);
1313         assert(IS_FASTCALL(cc));
1314
1315         return cc & ~cc_bits;
1316 }
1317
1318 void set_method_n_regparams(ir_type *method, unsigned n_regs)
1319 {
1320         unsigned cc = get_method_calling_convention(method);
1321         assert(IS_FASTCALL(cc));
1322
1323         set_method_calling_convention(method, (cc & cc_bits) | (n_regs & ~cc_bits));
1324 }
1325
1326 int (is_Method_type)(const ir_type *method)
1327 {
1328         return _is_method_type(method);
1329 }
1330
1331
1332 ir_type *new_d_type_union(ident *name, type_dbg_info *db)
1333 {
1334         ir_type *res = new_type(type_union, NULL, db);
1335         res->name = name;
1336
1337         res->attr.ua.members = NEW_ARR_F(ir_entity *, 0);
1338         hook_new_type(res);
1339         return res;
1340 }
1341
1342 ir_type *new_type_union(ident *name)
1343 {
1344         return new_d_type_union(name, NULL);
1345 }
1346
1347 void free_union_entities(ir_type *uni)
1348 {
1349         size_t i;
1350         assert(uni && (uni->type_op == type_union));
1351         /* we must iterate backward here */
1352         for (i = get_union_n_members(uni); i > 0;)
1353                 free_entity(get_union_member(uni, --i));
1354 }
1355
1356 void free_union_attrs(ir_type *uni)
1357 {
1358         assert(uni && (uni->type_op == type_union));
1359         DEL_ARR_F(uni->attr.ua.members);
1360 }
1361
1362 ident *get_union_ident(const ir_type *uni)
1363 {
1364         assert(uni->type_op == type_union);
1365         return uni->name;
1366 }
1367
1368 const char *get_union_name(const ir_type *uni)
1369 {
1370         if (get_union_ident(uni) == NULL)
1371                 return NULL;
1372         return get_id_str(get_union_ident(uni));
1373 }
1374
1375 size_t get_union_n_members(const ir_type *uni)
1376 {
1377         assert(uni->type_op == type_union);
1378         return ARR_LEN(uni->attr.ua.members);
1379 }
1380
1381 static void add_union_member(ir_type *uni, ir_entity *member)
1382 {
1383         assert(uni->type_op == type_union);
1384         assert(uni != get_entity_type(member) && "recursive type");
1385         ARR_APP1(ir_entity *, uni->attr.ua.members, member);
1386 }
1387
1388 ir_entity *get_union_member(const ir_type *uni, size_t pos)
1389 {
1390         assert(uni->type_op == type_union);
1391         assert(pos < get_union_n_members(uni));
1392         return uni->attr.ua.members[pos];
1393 }
1394
1395 size_t get_union_member_index(const ir_type *uni, ir_entity *mem)
1396 {
1397         size_t i, n;
1398         assert(uni && (uni->type_op == type_union));
1399         for (i = 0, n = get_union_n_members(uni); i < n; ++i) {
1400                 if (get_union_member(uni, i) == mem)
1401                         return i;
1402         }
1403         return (size_t)-1;
1404 }
1405
1406 static void remove_union_member(ir_type *uni, ir_entity *member)
1407 {
1408         size_t i;
1409         assert(uni && (uni->type_op == type_union));
1410         for (i = 0; i < ARR_LEN(uni->attr.ua.members); ++i) {
1411                 if (uni->attr.ua.members[i] == member) {
1412                         for (; i < ARR_LEN(uni->attr.ua.members) - 1; i++)
1413                                 uni->attr.ua.members[i] = uni->attr.ua.members[i+1];
1414                         ARR_SETLEN(ir_entity*, uni->attr.ua.members, ARR_LEN(uni->attr.ua.members) - 1);
1415                         break;
1416                 }
1417         }
1418 }
1419
1420 int (is_Union_type)(const ir_type *uni)
1421 {
1422         return _is_union_type(uni);
1423 }
1424
1425 void set_union_size(ir_type *tp, unsigned size)
1426 {
1427         tp->size = size;
1428 }
1429
1430
1431
1432 ir_type *new_d_type_array(size_t n_dimensions, ir_type *element_type,
1433                           type_dbg_info *db)
1434 {
1435         ir_type *res;
1436         size_t i;
1437         ir_node *unk;
1438         ir_graph *irg = get_const_code_irg();
1439
1440         assert(!is_Method_type(element_type));
1441
1442         res = new_type(type_array, NULL, db);
1443         res->attr.aa.n_dimensions = n_dimensions;
1444         res->attr.aa.lower_bound  = XMALLOCNZ(ir_node*, n_dimensions);
1445         res->attr.aa.upper_bound  = XMALLOCNZ(ir_node*, n_dimensions);
1446         res->attr.aa.order        = XMALLOCNZ(size_t,   n_dimensions);
1447
1448         unk = new_r_Unknown(irg, mode_Iu);
1449         for (i = 0; i < n_dimensions; i++) {
1450                 res->attr.aa.lower_bound[i] =
1451                 res->attr.aa.upper_bound[i] = unk;
1452                 res->attr.aa.order[i]       = i;
1453         }
1454
1455         res->attr.aa.element_type = element_type;
1456         res->attr.aa.element_ent
1457                 = new_entity(NULL, new_id_from_chars("elem_ent", 8), element_type);
1458         res->attr.aa.element_ent->owner = res;
1459
1460         hook_new_type(res);
1461         return res;
1462 }
1463
1464 ir_type *new_type_array(size_t n_dimensions, ir_type *element_type)
1465 {
1466         return new_d_type_array(n_dimensions, element_type, NULL);
1467 }
1468
1469 void free_array_automatic_entities(ir_type *array)
1470 {
1471         assert(array && (array->type_op == type_array));
1472         free_entity(get_array_element_entity(array));
1473 }
1474
1475 void free_array_entities(ir_type *array)
1476 {
1477         (void) array;
1478         assert(array->type_op == type_array);
1479 }
1480
1481 void free_array_attrs(ir_type *array)
1482 {
1483         assert(array->type_op == type_array);
1484         free(array->attr.aa.lower_bound);
1485         free(array->attr.aa.upper_bound);
1486         free(array->attr.aa.order);
1487 }
1488
1489 /* manipulate private fields of array ir_type */
1490 size_t get_array_n_dimensions(const ir_type *array)
1491 {
1492         assert(array->type_op == type_array);
1493         return array->attr.aa.n_dimensions;
1494 }
1495
1496 void set_array_bounds(ir_type *array, size_t dimension, ir_node *lower_bound,
1497                       ir_node *upper_bound)
1498 {
1499         assert(array && (array->type_op == type_array));
1500         assert(lower_bound && "lower_bound node may not be NULL.");
1501         assert(upper_bound && "upper_bound node may not be NULL.");
1502         assert(dimension < array->attr.aa.n_dimensions);
1503         array->attr.aa.lower_bound[dimension] = lower_bound;
1504         array->attr.aa.upper_bound[dimension] = upper_bound;
1505 }
1506
1507 void set_array_bounds_int(ir_type *array, size_t dimension, int lower_bound,
1508                           int upper_bound)
1509 {
1510         ir_graph *irg = get_const_code_irg();
1511         set_array_bounds(array, dimension,
1512                   new_r_Const_long(irg, mode_Iu, lower_bound),
1513                   new_r_Const_long(irg, mode_Iu, upper_bound));
1514 }
1515
1516 void set_array_lower_bound(ir_type *array, size_t dimension,
1517                            ir_node *lower_bound)
1518 {
1519         assert(array && (array->type_op == type_array));
1520         assert(lower_bound && "lower_bound node may not be NULL.");
1521         array->attr.aa.lower_bound[dimension] = lower_bound;
1522 }
1523
1524 void set_array_lower_bound_int(ir_type *array, size_t dimension, int lower_bound)
1525 {
1526         ir_graph *irg = get_const_code_irg();
1527         set_array_lower_bound(array, dimension,
1528              new_r_Const_long(irg, mode_Iu, lower_bound));
1529 }
1530
1531 void set_array_upper_bound(ir_type *array, size_t dimension, ir_node *upper_bound)
1532 {
1533   assert(array && (array->type_op == type_array));
1534   assert(upper_bound && "upper_bound node may not be NULL.");
1535   array->attr.aa.upper_bound[dimension] = upper_bound;
1536 }
1537
1538 void set_array_upper_bound_int(ir_type *array, size_t dimension, int upper_bound)
1539 {
1540         ir_graph *irg = get_const_code_irg();
1541         set_array_upper_bound(array, dimension,
1542                               new_r_Const_long(irg, mode_Iu, upper_bound));
1543 }
1544
1545 int has_array_lower_bound(const ir_type *array, size_t dimension)
1546 {
1547         assert(array && (array->type_op == type_array));
1548         return !is_Unknown(array->attr.aa.lower_bound[dimension]);
1549 }
1550
1551 ir_node *get_array_lower_bound(const ir_type *array, size_t dimension)
1552 {
1553         assert(array && (array->type_op == type_array));
1554         return array->attr.aa.lower_bound[dimension];
1555 }
1556
1557 long get_array_lower_bound_int(const ir_type *array, size_t dimension)
1558 {
1559         ir_node *node;
1560         assert(array && (array->type_op == type_array));
1561         node = array->attr.aa.lower_bound[dimension];
1562         assert(is_Const(node));
1563         return get_tarval_long(get_Const_tarval(node));
1564 }
1565
1566 int has_array_upper_bound(const ir_type *array, size_t dimension)
1567 {
1568         assert(array && (array->type_op == type_array));
1569         return !is_Unknown(array->attr.aa.upper_bound[dimension]);
1570 }
1571
1572 ir_node *get_array_upper_bound(const ir_type *array, size_t dimension)
1573 {
1574         assert(array && (array->type_op == type_array));
1575         return array->attr.aa.upper_bound[dimension];
1576 }
1577
1578 long get_array_upper_bound_int(const ir_type *array, size_t dimension)
1579 {
1580         ir_node *node;
1581         assert(array && (array->type_op == type_array));
1582         node = array->attr.aa.upper_bound[dimension];
1583         assert(is_Const(node));
1584         return get_tarval_long(get_Const_tarval(node));
1585 }
1586
1587 void set_array_order(ir_type *array, size_t dimension, size_t order)
1588 {
1589         assert(array && (array->type_op == type_array));
1590         array->attr.aa.order[dimension] = order;
1591 }
1592
1593 size_t get_array_order(const ir_type *array, size_t dimension)
1594 {
1595         assert(array && (array->type_op == type_array));
1596         return array->attr.aa.order[dimension];
1597 }
1598
1599 size_t find_array_dimension(const ir_type *array, size_t order)
1600 {
1601         size_t dim;
1602
1603         assert(array->type_op == type_array);
1604
1605         for (dim = 0; dim < array->attr.aa.n_dimensions; ++dim) {
1606                 if (array->attr.aa.order[dim] == order)
1607                         return dim;
1608         }
1609         return (size_t)-1;
1610 }
1611
1612 void set_array_element_type(ir_type *array, ir_type *tp)
1613 {
1614         assert(array && (array->type_op == type_array));
1615         assert(!is_Method_type(tp));
1616         array->attr.aa.element_type = tp;
1617 }
1618
1619 ir_type *get_array_element_type(const ir_type *array)
1620 {
1621         assert(array && (array->type_op == type_array));
1622         return array->attr.aa.element_type;
1623 }
1624
1625 void set_array_element_entity(ir_type *array, ir_entity *ent)
1626 {
1627         assert(array && (array->type_op == type_array));
1628         assert((get_entity_type(ent)->type_op != type_method));
1629         array->attr.aa.element_ent = ent;
1630         array->attr.aa.element_type = get_entity_type(ent);
1631 }
1632
1633 ir_entity *get_array_element_entity(const ir_type *array)
1634 {
1635         assert(array && (array->type_op == type_array));
1636         return array->attr.aa.element_ent;
1637 }
1638
1639 int (is_Array_type)(const ir_type *array)
1640 {
1641         return _is_array_type(array);
1642 }
1643
1644 void set_array_size(ir_type *tp, unsigned size)
1645 {
1646         /* FIXME: Here we should make some checks with the element type size */
1647         tp->size = size;
1648 }
1649
1650
1651 ir_type *new_d_type_enumeration(ident *name, size_t n_enums, type_dbg_info *db)
1652 {
1653         ir_type *res;
1654
1655         res = new_type(type_enumeration, NULL, db);
1656         res->name = name;
1657         res->attr.ea.enumer = NEW_ARR_F(ir_enum_const, n_enums);
1658         hook_new_type(res);
1659         return res;
1660 }
1661
1662 ir_type *new_type_enumeration(ident *name, size_t n_enums)
1663 {
1664         return new_d_type_enumeration(name, n_enums, NULL);
1665 }
1666
1667 void free_enumeration_entities(ir_type *enumeration)
1668 {
1669         (void) enumeration;
1670         assert(enumeration->type_op == type_enumeration);
1671 }
1672
1673 void free_enumeration_attrs(ir_type *enumeration)
1674 {
1675         assert(enumeration->type_op == type_enumeration);
1676         DEL_ARR_F(enumeration->attr.ea.enumer);
1677 }
1678
1679 ident *get_enumeration_ident(const ir_type *enumeration)
1680 {
1681         assert(enumeration->type_op == type_enumeration);
1682         return enumeration->name;
1683 }
1684
1685 const char *get_enumeration_name(const ir_type *enumeration)
1686 {
1687         if (get_enumeration_ident(enumeration) == NULL)
1688                 return NULL;
1689         return get_id_str(get_enumeration_ident(enumeration));
1690 }
1691
1692 size_t get_enumeration_n_enums(const ir_type *enumeration)
1693 {
1694         assert(enumeration->type_op == type_enumeration);
1695         return ARR_LEN(enumeration->attr.ea.enumer);
1696 }
1697
1698 void set_enumeration_const(ir_type *enumeration, size_t pos, ident *nameid,
1699                            ir_tarval *con)
1700 {
1701         assert(pos < ARR_LEN(enumeration->attr.ea.enumer));
1702         enumeration->attr.ea.enumer[pos].nameid = nameid;
1703         enumeration->attr.ea.enumer[pos].value  = con;
1704         enumeration->attr.ea.enumer[pos].owner  = enumeration;
1705 }
1706
1707 ir_enum_const *get_enumeration_const(const ir_type *enumeration, size_t pos)
1708 {
1709         assert(enumeration->type_op == type_enumeration);
1710         assert(pos < get_enumeration_n_enums(enumeration));
1711         return &enumeration->attr.ea.enumer[pos];
1712 }
1713
1714 ir_type *get_enumeration_owner(const ir_enum_const *enum_cnst)
1715 {
1716         return enum_cnst->owner;
1717 }
1718
1719 void set_enumeration_value(ir_enum_const *enum_cnst, ir_tarval *con)
1720 {
1721         enum_cnst->value = con;
1722 }
1723
1724 ir_tarval *get_enumeration_value(const ir_enum_const *enum_cnst)
1725 {
1726         return enum_cnst->value;
1727 }
1728
1729 void set_enumeration_nameid(ir_enum_const *enum_cnst, ident *id)
1730 {
1731         enum_cnst->nameid = id;
1732 }
1733
1734 ident *get_enumeration_const_nameid(const ir_enum_const *enum_cnst)
1735 {
1736         return enum_cnst->nameid;
1737 }
1738
1739 const char *get_enumeration_const_name(const ir_enum_const *enum_cnst)
1740 {
1741         return get_id_str(enum_cnst->nameid);
1742 }
1743
1744 int (is_Enumeration_type)(const ir_type *enumeration)
1745 {
1746         return _is_enumeration_type(enumeration);
1747 }
1748
1749 void set_enumeration_mode(ir_type *tp, ir_mode *mode)
1750 {
1751         assert(mode_is_int(mode) && "Modes of enumerations must be integers");
1752         /* For pointer and enumeration size depends on the mode, but only byte size allowed. */
1753         assert((get_mode_size_bits(mode) % 8) == 0 && "unorthodox modes not implemented");
1754
1755         tp->size = get_mode_size_bytes(mode);
1756         tp->mode = mode;
1757 }
1758
1759
1760
1761 ir_type *new_d_type_pointer(ir_type *points_to, type_dbg_info *db)
1762 {
1763         ir_type *res;
1764         ir_mode *mode;
1765
1766         if (is_Method_type(points_to) || is_code_type(points_to)) {
1767                 mode = mode_P_code;
1768         } else {
1769                 mode = mode_P_data;
1770         }
1771
1772         res = new_type(type_pointer, mode, db);
1773         res->attr.pa.points_to = points_to;
1774         assert((get_mode_size_bits(res->mode) % 8 == 0) && "unorthodox modes not implemented");
1775         res->size = get_mode_size_bytes(res->mode);
1776         res->flags |= tf_layout_fixed;
1777         hook_new_type(res);
1778         return res;
1779 }
1780
1781 ir_type *new_type_pointer(ir_type *points_to)
1782 {
1783         return new_d_type_pointer(points_to, NULL);
1784 }
1785
1786 void free_pointer_entities(ir_type *pointer)
1787 {
1788         (void) pointer;
1789         assert(pointer && (pointer->type_op == type_pointer));
1790 }
1791
1792 void free_pointer_attrs(ir_type *pointer)
1793 {
1794         (void) pointer;
1795         assert(pointer && (pointer->type_op == type_pointer));
1796 }
1797
1798 void set_pointer_points_to_type(ir_type *pointer, ir_type *tp)
1799 {
1800         assert(pointer && (pointer->type_op == type_pointer));
1801         pointer->attr.pa.points_to = tp;
1802 }
1803
1804 ir_type *get_pointer_points_to_type(const ir_type *pointer)
1805 {
1806         assert(pointer && (pointer->type_op == type_pointer));
1807         return pointer->attr.pa.points_to;
1808 }
1809
1810 int (is_Pointer_type)(const ir_type *pointer)
1811 {
1812         return _is_pointer_type(pointer);
1813 }
1814
1815 void set_pointer_mode(ir_type *tp, ir_mode *mode)
1816 {
1817         assert(mode_is_reference(mode) && "Modes of pointers must be references");
1818         /* For pointer and enumeration size depends on the mode, but only byte size allowed. */
1819         assert((get_mode_size_bits(mode) & 7) == 0 && "unorthodox modes not implemented");
1820
1821         tp->size = get_mode_size_bytes(mode);
1822         tp->mode = mode;
1823 }
1824
1825 ir_type *find_pointer_type_to_type(ir_type *tp)
1826 {
1827         size_t i, n = get_irp_n_types();
1828         for (i = 0; i < n; ++i) {
1829                 ir_type *found = get_irp_type(i);
1830                 if (is_Pointer_type(found) && get_pointer_points_to_type(found) == tp)
1831                         return (found);
1832         }
1833         return firm_unknown_type;
1834 }
1835
1836
1837
1838 ir_type *new_d_type_primitive(ir_mode *mode, type_dbg_info *db)
1839 {
1840         ir_type *res = new_type(type_primitive, mode, db);
1841         res->size  = get_mode_size_bytes(mode);
1842         res->flags |= tf_layout_fixed;
1843         res->attr.ba.base_type = NULL;
1844         hook_new_type(res);
1845         return res;
1846 }
1847
1848 ir_type *new_type_primitive(ir_mode *mode)
1849 {
1850         return new_d_type_primitive(mode, NULL);
1851 }
1852
1853 int (is_Primitive_type)(const ir_type *primitive)
1854 {
1855         return _is_primitive_type(primitive);
1856 }
1857
1858 void set_primitive_mode(ir_type *tp, ir_mode *mode)
1859 {
1860         /* Modes of primitives must be data */
1861         assert(mode_is_data(mode));
1862
1863         /* For primitive size depends on the mode. */
1864         tp->size = get_mode_size_bytes(mode);
1865         tp->mode = mode;
1866 }
1867
1868 ir_type *get_primitive_base_type(const ir_type *tp)
1869 {
1870         assert(is_Primitive_type(tp));
1871         return tp->attr.ba.base_type;
1872 }
1873
1874 void set_primitive_base_type(ir_type *tp, ir_type *base_tp)
1875 {
1876         assert(is_Primitive_type(tp));
1877         tp->attr.ba.base_type = base_tp;
1878 }
1879
1880
1881
1882 int (is_atomic_type)(const ir_type *tp)
1883 {
1884         return _is_atomic_type(tp);
1885 }
1886
1887 size_t get_compound_n_members(const ir_type *tp)
1888 {
1889         const tp_op *op  = get_type_tpop(tp);
1890         return op->ops.get_n_members(tp);
1891 }
1892
1893 ir_entity *get_compound_member(const ir_type *tp, size_t pos)
1894 {
1895         const tp_op *op = get_type_tpop(tp);
1896         return op->ops.get_member(tp, pos);
1897 }
1898
1899 size_t get_compound_member_index(const ir_type *tp, ir_entity *member)
1900 {
1901         const tp_op *op = get_type_tpop(tp);
1902         return op->ops.get_member_index(tp, member);
1903 }
1904
1905 int is_compound_type(const ir_type *tp)
1906 {
1907         assert(tp->kind == k_type);
1908         return tp->type_op->flags & TP_OP_FLAG_COMPOUND;
1909 }
1910
1911 ident *get_compound_ident(const ir_type *tp)
1912 {
1913         assert(is_compound_type(tp));
1914         return tp->name;
1915 }
1916
1917 const char *get_compound_name(const ir_type *tp)
1918 {
1919         if (get_compound_ident(tp) == NULL)
1920                 return NULL;
1921         return get_id_str(get_compound_ident(tp));
1922 }
1923
1924 void remove_compound_member(ir_type *compound, ir_entity *entity)
1925 {
1926         switch (get_type_tpop_code(compound)) {
1927         case tpo_class:  remove_class_member(compound, entity);  break;
1928         case tpo_struct: remove_struct_member(compound, entity); break;
1929         case tpo_union:  remove_union_member(compound, entity);  break;
1930         default:
1931                 panic("argument for remove_compound_member not a compound type");
1932         }
1933 }
1934
1935 void add_compound_member(ir_type *compound, ir_entity *entity)
1936 {
1937         switch (get_type_tpop_code(compound)) {
1938         case tpo_class:  add_class_member(compound, entity);  break;
1939         case tpo_struct: add_struct_member(compound, entity); break;
1940         case tpo_union:  add_union_member(compound, entity);  break;
1941         default:
1942                 panic("argument for add_compound_member not a compound type");
1943         }
1944 }
1945
1946
1947
1948 int is_code_type(const ir_type *tp)
1949 {
1950         assert(tp && tp->kind == k_type);
1951         return tp->type_op == tpop_code;
1952 }
1953
1954 int is_frame_type(const ir_type *tp)
1955 {
1956         return tp->flags & tf_frame_type;
1957 }
1958
1959 ir_type *new_type_frame(void)
1960 {
1961         ir_type *res = new_type_class(new_id_from_str("<frame_type>"));
1962
1963         res->flags |= tf_frame_type;
1964
1965         /* Remove type from type list.  Must be treated differently than other types. */
1966         remove_irp_type(res);
1967
1968         /* It is not possible to derive from the frame type. Set the final flag. */
1969         set_class_final(res, 1);
1970
1971         return res;
1972 }
1973
1974 ir_type *clone_frame_type(ir_type *type)
1975 {
1976         ir_type *res;
1977         size_t  i, n;
1978
1979         assert(is_frame_type(type));
1980         /* the entity link resource should be allocated if this function is called */
1981         assert(irp_resources_reserved(irp) & IRP_RESOURCE_ENTITY_LINK);
1982
1983         res = new_type_frame();
1984         for (i = 0, n = get_class_n_members(type); i < n; ++i) {
1985                 ir_entity *ent  = get_class_member(type, i);
1986                 ir_entity *nent = copy_entity_own(ent, res);
1987                 set_entity_link(ent, nent);
1988                 set_entity_link(nent, ent);
1989         }
1990         return res;
1991 }
1992
1993 void set_default_size(ir_type *tp, unsigned size)
1994 {
1995         tp->size = size;
1996 }
1997
1998 void default_layout_compound_type(ir_type *type)
1999 {
2000         size_t i;
2001         size_t n = get_compound_n_members(type);
2002         int size = 0;
2003         unsigned align_all = 1;
2004
2005         for (i = 0; i < n; ++i) {
2006                 ir_entity *entity      = get_compound_member(type, i);
2007                 ir_type   *entity_type = get_entity_type(entity);
2008                 unsigned   align;
2009                 unsigned   misalign;
2010
2011                 if (is_Method_type(entity_type))
2012                         continue;
2013
2014                 assert(get_type_state(entity_type) == layout_fixed);
2015                 align     = get_type_alignment_bytes(entity_type);
2016                 align_all = align > align_all ? align : align_all;
2017                 misalign  = (align ? size % align : 0);
2018                 size     += (misalign ? align - misalign : 0);
2019
2020                 set_entity_offset(entity, size);
2021                 if (!is_Union_type(type)) {
2022                         size += get_type_size_bytes(entity_type);
2023                 }
2024         }
2025         if (align_all > 0 && size % align_all) {
2026                 size += align_all - (size % align_all);
2027         }
2028         if (align_all > get_type_alignment_bytes(type)) {
2029                 set_type_alignment_bytes(type, align_all);
2030         }
2031         set_type_size_bytes(type, size);
2032         set_type_state(type, layout_fixed);
2033 }
2034
2035 ir_entity *frame_alloc_area(ir_type *frame_type, int size, unsigned alignment,
2036                             int at_start)
2037 {
2038         ir_entity *area;
2039         ir_type *tp;
2040         ident *name;
2041         char buf[32];
2042         unsigned frame_align;
2043         int offset, frame_size;
2044         static unsigned area_cnt = 0;
2045         static ir_type *a_byte = NULL;
2046
2047         assert(is_frame_type(frame_type));
2048         assert(get_type_state(frame_type) == layout_fixed);
2049         assert(get_type_alignment_bytes(frame_type) > 0);
2050         set_type_state(frame_type, layout_undefined);
2051
2052         if (! a_byte)
2053                 a_byte = new_type_primitive(mode_Bu);
2054
2055         snprintf(buf, sizeof(buf), "area%u", area_cnt++);
2056         name = new_id_from_str(buf);
2057
2058         /* align the size */
2059         frame_align = get_type_alignment_bytes(frame_type);
2060         size = (size + frame_align - 1) & ~(frame_align - 1);
2061
2062         tp = new_type_array(1, a_byte);
2063         set_array_bounds_int(tp, 0, 0, size);
2064         set_type_alignment_bytes(tp, alignment);
2065
2066         frame_size = get_type_size_bytes(frame_type);
2067         if (at_start) {
2068                 size_t i, n;
2069                 /* fix all offsets so far */
2070                 for (i = 0, n = get_class_n_members(frame_type); i < n; ++i) {
2071                         ir_entity *ent = get_class_member(frame_type, i);
2072
2073                         set_entity_offset(ent, get_entity_offset(ent) + size);
2074                 }
2075                 /* calculate offset and new type size */
2076                 offset = 0;
2077                 frame_size += size;
2078
2079                 /* increase size to match alignment... */
2080                 if (alignment > frame_align) {
2081                         frame_align = alignment;
2082                         set_type_alignment_bytes(frame_type, frame_align);
2083                         frame_size  = (frame_size + frame_align - 1) & ~(frame_align - 1);
2084                 }
2085         } else {
2086                 /* calculate offset and new type size */
2087                 offset = (frame_size + alignment - 1) & ~(alignment - 1);
2088                 frame_size = offset + size;
2089         }
2090
2091         area = new_entity(frame_type, name, tp);
2092         set_entity_offset(area, offset);
2093         set_type_size_bytes(frame_type, frame_size);
2094
2095         /* mark this entity as compiler generated */
2096         set_entity_compiler_generated(area, 1);
2097
2098         set_type_state(frame_type, layout_fixed);
2099         return area;
2100 }
2101
2102 void ir_print_type(char *buffer, size_t buffer_size, const ir_type *type)
2103 {
2104         ident *id;
2105         int p;
2106         type_dbg_info *tdbgi = get_type_dbg_info(type);
2107         if (tdbgi != NULL) {
2108                 ir_retrieve_type_dbg_info(buffer, buffer_size, tdbgi);
2109                 return;
2110         }
2111
2112         /* we have to construct some name... */
2113         switch (get_type_tpop_code(type)) {
2114         case tpo_uninitialized:
2115                 break;
2116         case tpo_code:
2117                 snprintf(buffer, buffer_size, "code");
2118                 return;
2119
2120         case tpo_class:
2121                 id = get_class_ident(type);
2122                 snprintf(buffer, buffer_size, "class '%s'", get_id_str(id));
2123                 return;
2124
2125         case tpo_struct:
2126                 id = get_struct_ident(type);
2127                 snprintf(buffer, buffer_size, "struct '%s'", get_id_str(id));
2128                 return;
2129
2130         case tpo_union:
2131                 id = get_union_ident(type);
2132                 snprintf(buffer, buffer_size, "union '%s'", get_id_str(id));
2133                 return;
2134
2135         case tpo_enumeration:
2136                 id = get_enumeration_ident(type);
2137                 snprintf(buffer, buffer_size, "enumeration '%s'", get_id_str(id));
2138                 return;
2139
2140         case tpo_unknown:
2141                 snprintf(buffer, buffer_size, "unknown type");
2142                 return;
2143
2144         case tpo_pointer:
2145                 p = snprintf(buffer, buffer_size, "pointer to ");
2146                 buffer      += p;
2147                 buffer_size -= p;
2148                 ir_print_type(buffer, buffer_size, get_pointer_points_to_type(type));
2149                 return;
2150
2151         case tpo_array:
2152                 p = snprintf(buffer, buffer_size, "array of ");
2153                 buffer      += p;
2154                 buffer_size -= p;
2155                 ir_print_type(buffer, buffer_size, get_array_element_type(type));
2156                 return;
2157
2158         case tpo_primitive:
2159                 id = get_mode_ident(get_type_mode(type));
2160                 snprintf(buffer, buffer_size, "%s", get_id_str(id));
2161                 return;
2162
2163         case tpo_none:
2164                 snprintf(buffer, buffer_size, "none");
2165                 return;
2166         case tpo_method:
2167                 /* TODO: we should print argument and return types here... */
2168                 snprintf(buffer, buffer_size, "method type");
2169                 return;
2170         }
2171         snprintf(buffer, buffer_size, "invalid type");
2172 }