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
22  * @brief   Representation of types -- private header.
23  * @author  Goetz Lindenmaier, Michael Beck
24  * @see     type.h tpop_t.h tpop.h
25  */
26 #ifndef FIRM_TR_TYPE_T_H
27 #define FIRM_TR_TYPE_T_H
28 
29 #include <stdbool.h>
30 #include "typerep.h"
31 #include "tpop_t.h"
32 #include "irgraph.h"
33 #include "firm_common.h"
34 
35 #include "array.h"
36 
37 /** Class flags. */
38 enum class_flags {
39 	cf_none            = 0,  /**< No flags. */
40 	cf_final_class     = 1,  /**< Set if a class is an final class */
41 	cf_interface_class = 2,  /**< Set if a class is an "interface" */
42 	cf_absctract_class = 4,  /**< Set if a class is "abstract" */
43 };
44 
45 /** Class type attributes. */
46 typedef struct {
47 	ir_entity  **members;           /**< Array containing the fields and methods of this class. */
48 	ir_type **subtypes;          /**< Array containing the direct subtypes. */
49 	ir_type **supertypes;        /**< Array containing the direct supertypes */
50 	ir_peculiarity peculiarity;  /**< The peculiarity of this class. */
51 	ir_entity *type_info;        /**< An ir_entity representing this class, used for type info. */
52 	int      dfn;                /**< A number that can be used for 'instanceof' operator. */
53 	unsigned vtable_size;        /**< The size of the vtable for this class. */
54 	unsigned clss_flags;         /**< Additional class flags. */
55 } cls_attr;
56 
57 /** Struct type attributes. */
58 typedef struct {
59 	ir_entity **members; /**< Fields of this struct. No method entities allowed. */
60 } stc_attr;
61 
62 /** A (type, ir_entity) pair. */
63 typedef struct {
64 	ir_type   *tp;      /**< A type. */
65 	ir_entity *ent;     /**< An ir_entity. */
66 } tp_ent_pair;
67 
68 /** Method type attributes. */
69 typedef struct {
70 	size_t       n_params;          /**< Number of parameters. */
71 	tp_ent_pair *params;            /**< Array of parameter type/value entities pairs. */
72 	size_t       n_res;             /**< Number of results. */
73 	tp_ent_pair *res_type;          /**< Array of result type/value ir_entity pairs. */
74 	ir_variadicity variadicity;     /**< The variadicity of the method. */
75 	mtp_additional_properties properties; /**< Set of additional method properties. */
76 	unsigned irg_calling_conv;      /**< A set of calling convention flags. */
77 } mtd_attr;
78 
79 /** Union type attributes. */
80 typedef struct {
81 	ir_entity **members;    /**< Fields of this union. No method entities allowed. */
82 } uni_attr;
83 
84 /** Array type attributes. */
85 typedef struct {
86 	size_t  n_dimensions;   /**< Number of array dimensions.  */
87 	ir_node **lower_bound;  /**< Lower bounds of dimensions.  Usually all 0. */
88 	ir_node **upper_bound;  /**< Upper bounds or dimensions. */
89 	size_t  *order;         /**< Ordering of dimensions. */
90 	ir_type *element_type;  /**< The type of the array elements. */
91 	ir_entity *element_ent; /**< entity for the array elements, to be used for
92 	                             element selection with a Sel node. */
93 } arr_attr;
94 
95 /** An enumerator constant. */
96 struct ir_enum_const {
97 	ir_tarval  *value;  /**< The constants that represents this enumerator identifier. */
98 	ident   *nameid;    /**< The name of the enumerator identifier. */
99 	ir_type *owner;     /**< owner type of this enumerator constant. */
100 };
101 
102 /** Enum type attributes. */
103 typedef struct {
104 	ir_enum_const *enumer;   /**< Contains all enumerator constants that represent a member
105 	                              of the enum -- enumerators. */
106 } enm_attr;
107 
108 /** Pointer type attributes. */
109 typedef struct {
110 	ir_type *points_to;  /**< The type of the ir_entity the pointer points to. */
111 } ptr_attr;
112 
113 /** Primitive type attributes. */
114 typedef struct {
115 	ir_type *base_type;  /**< For bitfield types: The base primitive type, NULL else. */
116 } pri_attr;
117 
118 /** General type attributes. */
119 typedef union {
120 	cls_attr ca;      /**< Attributes of a class type */
121 	stc_attr sa;      /**< Attributes of a struct type */
122 	mtd_attr ma;      /**< Attributes of a method type */
123 	uni_attr ua;      /**< Attributes of an union type */
124 	arr_attr aa;      /**< Attributes of an array type */
125 	enm_attr ea;      /**< Attributes of an enumeration type */
126 	ptr_attr pa;      /**< Attributes of a pointer type */
127 	pri_attr ba;      /**< Attributes of a primitive bitfield type */
128 } tp_attr;
129 
130 /** Additional type flags. */
131 enum type_flags {
132 	tf_none             = 0, /**< No flags. */
133 	tf_lowered_type     = 1U << 0, /**< Set if this is a lowered type. */
134 	tf_layout_fixed     = 1U << 1, /**< Set if the layout of a type is fixed */
135 
136 	tf_frame_type       = 1U << 2, /**< Set if this is a frame type. */
137 	tf_segment          = 1U << 3, /**< type represents a linker segment */
138 	tf_global_type      = 1U << 4, /**< Set only for the global type */
139 	tf_tls_type         = 1U << 5, /**< Set only for the tls type */
140 	tf_constructors     = 1U << 6, /**< Set only for the constructors segment type */
141 	tf_destructors      = 1U << 7, /**< Set only for the destructors segment type */
142 	tf_variable_size    = 1U << 8, /**< compound or array type may have variable size last element */
143 };
144 ENUM_BITSET(type_flags)
145 
146 /**
147  *  An abstract data type to represent types.
148  *
149  *  This is the abstract data type with which any type known in the
150  *  compiled program can be represented.  This includes types specified
151  *  in the program as well as types defined by the language.  In the
152  *  view of the intermediate representation there is no difference
153  *  between these types.
154  *
155  *  There exist several kinds of types, arranged by the structure of
156  *  the type.  These are distinguished by a type opcode.
157  *  A type is described by a set of attributes.  Some of these attributes
158  *  are common to all types, others depend on the kind of the type.
159  */
160 struct ir_type {
161 	firm_kind kind;          /**< the firm kind, must be k_type */
162 	const tp_op *type_op;    /**< the type operation of the type */
163 	ident *name;             /**< The name of the type */
164 	ir_visibility visibility;/**< Visibility of entities of this type. */
165 	unsigned flags;          /**< Type flags, a bitmask of enum type_flags. */
166 	unsigned size;           /**< Size of an ir_entity of this type. This is
167 	                              determined when fixing the layout of this
168 	                              class.  Size must be given in bytes. */
169 	unsigned align;          /**< Alignment of an ir_entity of this type. This
170 	                              should be set according to the source
171 	                              language needs. If not set, it's calculated
172 	                              automatically by get_type_alignment().
173 	                              Alignment must be given in bytes. */
174 	ir_mode *mode;           /**< The mode for atomic types */
175 	ir_visited_t visit;      /**< visited counter for walks of the type information */
176 	void *link;              /**< holds temporary data - like in irnode_t.h */
177 	type_dbg_info *dbi;      /**< A pointer to information for debug support. */
178 	ir_type *higher_type;    /**< link to highlevel type in case of lowered
179 	                              types */
180 
181 #ifdef DEBUG_libfirm
182 	long nr;                 /**< An unique node number for each node to make
183 	                              output readable. */
184 #endif
185 	tp_attr attr;            /**< Type kind specific fields. This must be the
186 	                              last entry in this struct!  Varying size! */
187 };
188 
189 void free_type_entities(ir_type *tp);
190 
191 void free_class_entities      (ir_type *clss);
192 void free_struct_entities     (ir_type *strct);
193 void free_method_entities     (ir_type *method);
194 void free_union_entities      (ir_type *uni);
195 void free_array_entities      (ir_type *array);
196 void free_enumeration_entities(ir_type *enumeration);
197 void free_pointer_entities    (ir_type *pointer);
198 
199 void free_array_automatic_entities(ir_type *array);
200 
201 void free_class_attrs      (ir_type *clss);
202 void free_struct_attrs     (ir_type *strct);
203 void free_method_attrs     (ir_type *method);
204 void free_union_attrs      (ir_type *uni);
205 void free_array_attrs      (ir_type *array);
206 void free_enumeration_attrs(ir_type *enumeration);
207 void free_pointer_attrs    (ir_type *pointer);
208 
209 void set_class_mode(ir_type *tp, ir_mode *mode);
210 void set_struct_mode(ir_type *tp, ir_mode *mode);
211 void set_pointer_mode(ir_type *tp, ir_mode *mode);
212 void set_primitive_mode(ir_type *tp, ir_mode *mode);
213 void set_enumeration_mode(ir_type *tp, ir_mode *mode);
214 
215 void set_class_size(ir_type *tp, unsigned bytes);
216 void set_struct_size(ir_type *tp, unsigned bytes);
217 void set_union_size(ir_type *tp, unsigned bytes);
218 void set_array_size(ir_type *tp, unsigned bytes);
219 void set_default_size(ir_type *tp, unsigned bytes);
220 
221 /** Set and get a class' dfn --
222  * This is an undocumented field, subject to change! */
223 void set_class_dfn(ir_type *clss, int dfn);
224 int  get_class_dfn(const ir_type *clss);
225 
226 void add_compound_member(ir_type *compound, ir_entity *entity);
227 
228 /** Initialize the type module. */
229 void ir_init_type(ir_prog *irp);
230 
231 /** free internal datastructures of type module */
232 void ir_finish_type(ir_prog *irp);
233 
234 /** Clone an existing method type.
235  *
236  * @param tp      the method type to clone.
237  * @param prefix  if non-null, will be the prefix for the name of
238  *                the cloned type
239  *
240  * @return the cloned method type.
241  */
242 ir_type *clone_type_method(ir_type *tp);
243 
244 extern ir_visited_t firm_type_visited;
245 
_set_master_type_visited(ir_visited_t val)246 static inline void _set_master_type_visited(ir_visited_t val)
247 {
248 	firm_type_visited = val;
249 }
250 
_get_master_type_visited(void)251 static inline ir_visited_t _get_master_type_visited(void)
252 {
253 	return firm_type_visited;
254 }
255 
_inc_master_type_visited(void)256 static inline void _inc_master_type_visited(void)
257 {
258 	++firm_type_visited;
259 }
260 
is_lowered_type(const ir_type * tp)261 static inline int is_lowered_type(const ir_type *tp)
262 {
263 	return tp->flags & tf_lowered_type;
264 }
265 
get_higher_type(const ir_type * tp)266 static inline ir_type *get_higher_type(const ir_type *tp)
267 {
268 	return tp->higher_type;
269 }
270 
set_higher_type(ir_type * tp,ir_type * higher_type)271 static inline void set_higher_type(ir_type *tp, ir_type *higher_type)
272 {
273 	tp->flags |= tf_lowered_type;
274 	tp->higher_type = higher_type;
275 }
276 
_get_type_link(const ir_type * tp)277 static inline void *_get_type_link(const ir_type *tp)
278 {
279 	assert(tp && tp->kind == k_type);
280 	return(tp -> link);
281 }
282 
_set_type_link(ir_type * tp,void * l)283 static inline void _set_type_link(ir_type *tp, void *l)
284 {
285 	assert(tp && tp->kind == k_type);
286 	tp -> link = l;
287 }
288 
_get_type_tpop(const ir_type * tp)289 static inline const tp_op *_get_type_tpop(const ir_type *tp)
290 {
291 	assert(tp && tp->kind == k_type);
292 	return tp->type_op;
293 }
294 
_get_type_tpop_nameid(const ir_type * tp)295 static inline ident *_get_type_tpop_nameid(const ir_type *tp)
296 {
297 	assert(tp && tp->kind == k_type);
298 	return get_tpop_ident(tp->type_op);
299 }
300 
_get_type_tpop_code(const ir_type * tp)301 static inline tp_opcode _get_type_tpop_code(const ir_type *tp)
302 {
303 	assert(tp && tp->kind == k_type);
304 	return get_tpop_code(tp->type_op);
305 }
306 
_get_type_mode(const ir_type * tp)307 static inline ir_mode *_get_type_mode(const ir_type *tp)
308 {
309 	assert(tp && tp->kind == k_type);
310 	return tp->mode;
311 }
312 
_get_type_size_bytes(const ir_type * tp)313 static inline unsigned _get_type_size_bytes(const ir_type *tp)
314 {
315 	assert(tp && tp->kind == k_type);
316 	return tp->size;
317 }
318 
_get_type_state(const ir_type * tp)319 static inline ir_type_state _get_type_state(const ir_type *tp)
320 {
321 	assert(tp && tp->kind == k_type);
322 	return tp->flags & tf_layout_fixed ? layout_fixed : layout_undefined;
323 }
324 
_get_type_visited(const ir_type * tp)325 static inline ir_visited_t _get_type_visited(const ir_type *tp)
326 {
327 	assert(tp && tp->kind == k_type);
328 	return tp->visit;
329 }
330 
_set_type_visited(ir_type * tp,ir_visited_t num)331 static inline void _set_type_visited(ir_type *tp, ir_visited_t num)
332 {
333 	assert(tp && tp->kind == k_type);
334 	tp->visit = num;
335 }
336 
_mark_type_visited(ir_type * tp)337 static inline void _mark_type_visited(ir_type *tp)
338 {
339 	assert(tp && tp->kind == k_type);
340 	assert(tp->visit < firm_type_visited);
341 	tp->visit = firm_type_visited;
342 }
343 
_type_visited(const ir_type * tp)344 static inline int _type_visited(const ir_type *tp)
345 {
346 	assert(tp && tp->kind == k_type);
347 	return tp->visit >= firm_type_visited;
348 }
349 
_type_not_visited(const ir_type * tp)350 static inline int _type_not_visited(const ir_type *tp)
351 {
352 	assert(tp && tp->kind == k_type);
353 	return tp->visit  < firm_type_visited;
354 }
355 
_get_type_dbg_info(const ir_type * tp)356 static inline type_dbg_info *_get_type_dbg_info(const ir_type *tp)
357 {
358 	return tp->dbi;
359 }
360 
_set_type_dbg_info(ir_type * tp,type_dbg_info * db)361 static inline void _set_type_dbg_info(ir_type *tp, type_dbg_info *db)
362 {
363 	tp->dbi = db;
364 }
365 
_is_type(const void * thing)366 static inline int _is_type(const void *thing)
367 {
368 	return get_kind(thing) == k_type;
369 }
370 
_is_class_type(const ir_type * clss)371 static inline int _is_class_type(const ir_type *clss)
372 {
373 	return clss->type_op == type_class;
374 }
375 
_get_class_n_members(const ir_type * clss)376 static inline size_t _get_class_n_members(const ir_type *clss)
377 {
378 	assert(clss->type_op == type_class);
379 	return ARR_LEN(clss->attr.ca.members);
380 }
381 
_get_class_member(const ir_type * clss,size_t pos)382 static inline ir_entity *_get_class_member(const ir_type *clss, size_t pos)
383 {
384 	assert(clss->type_op == type_class);
385 	assert(pos < _get_class_n_members(clss));
386 	return clss->attr.ca.members[pos];
387 }
388 
_get_class_vtable_size(const ir_type * clss)389 static inline unsigned _get_class_vtable_size(const ir_type *clss)
390 {
391 	assert(clss->type_op == type_class);
392 	return clss->attr.ca.vtable_size;
393 }
394 
_set_class_vtable_size(ir_type * clss,unsigned vtable_size)395 static inline void _set_class_vtable_size(ir_type *clss, unsigned vtable_size)
396 {
397 	assert(clss->type_op == type_class);
398 	clss->attr.ca.vtable_size = vtable_size;
399 }
400 
_is_class_final(const ir_type * clss)401 static inline int _is_class_final(const ir_type *clss)
402 {
403 	assert(clss->type_op == type_class);
404 	return clss->attr.ca.clss_flags & cf_final_class;
405 }
406 
_set_class_final(ir_type * clss,int final)407 static inline void _set_class_final(ir_type *clss, int final)
408 {
409 	assert(clss->type_op == type_class);
410 	if (final)
411 		clss->attr.ca.clss_flags |= cf_final_class;
412 	else
413 		clss->attr.ca.clss_flags &= ~cf_final_class;
414 }
415 
_is_class_interface(const ir_type * clss)416 static inline int _is_class_interface(const ir_type *clss)
417 {
418 	assert(clss->type_op == type_class);
419 	return clss->attr.ca.clss_flags & cf_interface_class;
420 }
421 
_set_class_interface(ir_type * clss,int final)422 static inline void _set_class_interface(ir_type *clss, int final)
423 {
424 	assert(clss->type_op == type_class);
425 	if (final)
426 		clss->attr.ca.clss_flags |= cf_interface_class;
427 	else
428 		clss->attr.ca.clss_flags &= ~cf_interface_class;
429 }
430 
_is_class_abstract(const ir_type * clss)431 static inline int _is_class_abstract(const ir_type *clss)
432 {
433 	assert(clss->type_op == type_class);
434 	return clss->attr.ca.clss_flags & cf_absctract_class;
435 }
436 
_set_class_abstract(ir_type * clss,int final)437 static inline void _set_class_abstract(ir_type *clss, int final)
438 {
439 	assert(clss->type_op == type_class);
440 	if (final)
441 		clss->attr.ca.clss_flags |= cf_absctract_class;
442 	else
443 		clss->attr.ca.clss_flags &= ~cf_absctract_class;
444 }
445 
_is_struct_type(const ir_type * strct)446 static inline int _is_struct_type(const ir_type *strct)
447 {
448 	return (strct->type_op == type_struct);
449 }
450 
_is_method_type(const ir_type * method)451 static inline int _is_method_type(const ir_type *method)
452 {
453 	return (method->type_op == type_method);
454 }
455 
_is_union_type(const ir_type * uni)456 static inline int _is_union_type(const ir_type *uni)
457 {
458 	return (uni->type_op == type_union);
459 }
460 
_is_array_type(const ir_type * array)461 static inline int _is_array_type(const ir_type *array)
462 {
463 	return (array->type_op == type_array);
464 }
465 
_is_enumeration_type(const ir_type * enumeration)466 static inline int _is_enumeration_type(const ir_type *enumeration)
467 {
468 	return (enumeration->type_op == type_enumeration);
469 }
470 
_is_pointer_type(const ir_type * pointer)471 static inline int _is_pointer_type(const ir_type *pointer)
472 {
473 	return (pointer->type_op == type_pointer);
474 }
475 
476 /** Returns true if a type is a primitive type. */
_is_primitive_type(const ir_type * primitive)477 static inline int _is_primitive_type(const ir_type *primitive)
478 {
479 	assert(primitive->kind == k_type);
480 	return (primitive->type_op == type_primitive);
481 }
482 
_is_atomic_type(const ir_type * tp)483 static inline int _is_atomic_type(const ir_type *tp)
484 {
485 	assert(tp->kind == k_type);
486 	return (_is_primitive_type(tp) || _is_pointer_type(tp) ||
487 	        _is_enumeration_type(tp));
488 }
489 
_get_method_n_params(const ir_type * method)490 static inline size_t _get_method_n_params(const ir_type *method)
491 {
492 	assert(method->type_op == type_method);
493 	return method->attr.ma.n_params;
494 }
495 
_get_method_n_ress(const ir_type * method)496 static inline size_t _get_method_n_ress(const ir_type *method)
497 {
498 	assert(method->type_op == type_method);
499 	return method->attr.ma.n_res;
500 }
501 
_get_method_additional_properties(const ir_type * method)502 static inline mtp_additional_properties _get_method_additional_properties(const ir_type *method)
503 {
504 	assert(method->type_op == type_method);
505 	return method->attr.ma.properties;
506 }
507 
_set_method_additional_properties(ir_type * method,mtp_additional_properties properties)508 static inline void _set_method_additional_properties(ir_type *method, mtp_additional_properties properties)
509 {
510 	assert(method->type_op == type_method);
511 	method->attr.ma.properties = properties;
512 }
513 
_add_method_additional_properties(ir_type * method,mtp_additional_properties properties)514 static inline void _add_method_additional_properties(ir_type *method, mtp_additional_properties properties)
515 {
516 	assert(method->type_op == type_method);
517 	method->attr.ma.properties |= properties;
518 }
519 
_get_method_calling_convention(const ir_type * method)520 static inline unsigned _get_method_calling_convention(const ir_type *method)
521 {
522 	assert(method->type_op == type_method);
523 	return method->attr.ma.irg_calling_conv;
524 }
525 
_set_method_calling_convention(ir_type * method,unsigned cc_mask)526 static inline void _set_method_calling_convention(ir_type *method, unsigned cc_mask)
527 {
528 	assert(method->type_op == type_method);
529 	method->attr.ma.irg_calling_conv = cc_mask;
530 }
531 
532 
533 #define set_master_type_visited(val)      _set_master_type_visited(val)
534 #define get_master_type_visited()         _get_master_type_visited()
535 #define inc_master_type_visited()         _inc_master_type_visited()
536 #define get_type_link(tp)                 _get_type_link(tp)
537 #define set_type_link(tp, l)              _set_type_link(tp, l)
538 #define get_type_tpop(tp)                 _get_type_tpop(tp)
539 #define get_type_tpop_nameid(tp)          _get_type_tpop_nameid(tp)
540 #define get_type_tpop_code(tp)            _get_type_tpop_code(tp)
541 #define get_type_mode(tp)                 _get_type_mode(tp)
542 #define get_type_size_bytes(tp)           _get_type_size_bytes(tp)
543 #define get_type_state(tp)                _get_type_state(tp)
544 #define get_type_visited(tp)              _get_type_visited(tp)
545 #define set_type_visited(tp, num)         _set_type_visited(tp, num)
546 #define mark_type_visited(tp)             _mark_type_visited(tp)
547 #define type_visited(tp)                  _type_visited(tp)
548 #define type_not_visited(tp)              _type_not_visited(tp)
549 #define get_type_dbg_info(tp)             _get_type_dbg_info(tp)
550 #define set_type_dbg_info(tp, db)         _set_type_dbg_info(tp, db)
551 #define is_type(thing)                    _is_type(thing)
552 #define is_Class_type(clss)               _is_class_type(clss)
553 #define get_class_n_members(clss)         _get_class_n_members(clss)
554 #define get_class_member(clss, pos)       _get_class_member(clss, pos)
555 #define get_class_vtable_size(clss)       _get_class_vtable_size(clss)
556 #define set_class_vtable_size(clss, size) _set_class_vtable_size(clss, size)
557 #define is_class_final(clss)              _is_class_final(clss)
558 #define set_class_final(clss, flag)       _set_class_final(clss, flag)
559 #define is_class_interface(clss)          _is_class_interface(clss)
560 #define set_class_interface(clss, flag)   _set_class_interface(clss, flag)
561 #define is_class_abstract(clss)           _is_class_abstract(clss)
562 #define set_class_abstract(clss, flag)    _set_class_abstract(clss, flag)
563 #define is_Struct_type(strct)             _is_struct_type(strct)
564 #define is_Method_type(method)            _is_method_type(method)
565 #define is_Union_type(uni)                _is_union_type(uni)
566 #define is_Array_type(array)              _is_array_type(array)
567 #define is_Enumeration_type(enumeration)  _is_enumeration_type(enumeration)
568 #define is_Pointer_type(pointer)          _is_pointer_type(pointer)
569 #define is_Primitive_type(primitive)      _is_primitive_type(primitive)
570 #define is_atomic_type(tp)                _is_atomic_type(tp)
571 #define get_method_n_params(method)       _get_method_n_params(method)
572 #define get_method_n_ress(method)         _get_method_n_ress(method)
573 #define get_method_additional_properties(method)        _get_method_additional_properties(method)
574 #define set_method_additional_properties(method, mask)  _set_method_additional_properties(method, mask)
575 #define add_method_additional_properties(method, flag)  _add_method_additional_properties(method, flag)
576 #define get_method_calling_convention(method)           _get_method_calling_convention(method)
577 #define set_method_calling_convention(method, cc_mask)  _set_method_calling_convention(method, cc_mask)
578 
579 #endif /* FIRM_TR_TYPE_T_H */
580