2 * This file is part of cparser.
3 * Copyright (C) 2007-2008 Matthias Braun <matze@braunis.de>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <libfirm/firm_types.h>
34 extern struct obstack *type_obst;
36 typedef enum type_kind_t {
55 typedef enum type_modifier_t {
56 TYPE_MODIFIER_NONE = 0,
57 TYPE_MODIFIER_TRANSPARENT_UNION = 1 << 0,
59 typedef unsigned short type_modifiers_t;
63 il_size_t size; /**< The size of this type. */
64 type_qualifiers_t qualifiers;
65 type_modifiers_t modifiers;
66 il_alignment_t alignment; /**< The extra alignment of the type, 0 for default. */
71 struct atomic_type_t {
73 atomic_type_kind_t akind;
76 struct complex_type_t {
78 atomic_type_kind_t akind;
81 struct imaginary_type_t {
83 atomic_type_kind_t akind;
86 struct builtin_type_t {
92 struct pointer_type_t {
95 variable_t *base_variable; /**< Microsoft __based() extension */
98 struct reference_type_t {
103 struct array_type_t {
105 type_t *element_type;
106 expression_t *size_expression;
109 ir_node *size_node; /**< used by ast2firm phase */
111 bool is_static : 1; /**< a [static] type */
112 bool is_variable : 1; /**< a [*] type */
113 bool has_implicit_size : 1;
114 bool size_constant : 1; /**< size expression is constant */
115 bool is_vla : 1; /**< it's a variable length array */
119 * An entry in the parameter list of a function type.
121 struct function_parameter_t {
122 type_t *type; /**< The parameter type. */
123 function_parameter_t *next; /**< Points to the next type in the parameter list.*/
126 /** Linkage specifications. */
127 typedef enum linkage_kind_t {
129 LINKAGE_C, /**< C linkage. */
130 LINKAGE_CXX /**< C++ linkage. */
133 /** Calling conventions. */
134 typedef enum cc_kind_t {
135 CC_DEFAULT, /**< default calling convention. */
136 CC_CDECL, /**< cdecl calling convention. */
137 CC_STDCALL, /**< stdcall calling convention. */
138 CC_FASTCALL, /**< fastcall calling convention. */
139 CC_THISCALL /**< thiscall calling convention. */
145 struct function_type_t {
147 type_t *return_type; /**< The return type. */
148 function_parameter_t *parameters; /**< A list of the parameter types. */
149 linkage_kind_t linkage;
150 cc_kind_t calling_convention; /**< The specified calling convention. */
152 bool unspecified_parameters : 1;
153 bool kr_style_parameters : 1;
156 struct compound_type_t {
158 bool packed : 1; /**< Set if packed was specified. */
159 /** the declaration of the compound type, the scope of the declaration
160 * contains the compound entries. */
161 compound_t *compound;
166 /** the enum entity. You can find the enum entries by walking the
167 * enum->base.next list until you don't find ENTITY_ENUM_VALUE entities
172 struct typedef_type_t {
175 type_t *resolved_type;
178 struct typeof_type_t {
180 expression_t *expression;
182 type_t *resolved_type;
185 struct bitfield_type_t {
188 expression_t *size_expression; /**< The expression for the bit size. */
189 il_size_t bit_size; /**< Size of this bitfield in bits. */
195 atomic_type_t atomic;
196 complex_type_t complex;
197 imaginary_type_t imaginary;
198 builtin_type_t builtin;
199 pointer_type_t pointer;
200 reference_type_t reference;
202 function_type_t function;
203 compound_type_t compound;
205 typedef_type_t typedeft;
206 bitfield_type_t bitfield;
207 typeof_type_t typeoft;
210 type_t *make_atomic_type(atomic_type_kind_t type, type_qualifiers_t qualifiers);
211 type_t *make_complex_type(atomic_type_kind_t type, type_qualifiers_t qualifiers);
212 type_t *make_imaginary_type(atomic_type_kind_t type, type_qualifiers_t qualifiers);
213 type_t *make_pointer_type(type_t *points_to, type_qualifiers_t qualifiers);
214 type_t *make_reference_type(type_t *refers_to);
215 type_t *make_based_pointer_type(type_t *points_to,
216 type_qualifiers_t qualifiers, variable_t *variable);
217 type_t *make_array_type(type_t *element_type, size_t size,
218 type_qualifiers_t qualifiers);
220 type_t *duplicate_type(const type_t *type);
222 static inline bool is_typeref(const type_t *type)
224 return type->kind == TYPE_TYPEDEF || type->kind == TYPE_TYPEOF;
227 static inline bool is_type_atomic(const type_t *type, atomic_type_kind_t atype)
229 assert(!is_typeref(type));
231 if(type->kind != TYPE_ATOMIC)
233 const atomic_type_t *atomic_type = &type->atomic;
235 return atomic_type->akind == atype;
238 static inline bool is_type_pointer(const type_t *type)
240 assert(!is_typeref(type));
241 return type->kind == TYPE_POINTER;
244 static inline bool is_type_reference(const type_t *type)
246 assert(!is_typeref(type));
247 return type->kind == TYPE_REFERENCE;
250 static inline bool is_type_array(const type_t *type)
252 assert(!is_typeref(type));
253 return type->kind == TYPE_ARRAY;
256 static inline bool is_type_function(const type_t *type)
258 assert(!is_typeref(type));
259 return type->kind == TYPE_FUNCTION;
262 static inline bool is_type_union(const type_t *type)
264 assert(!is_typeref(type));
265 return type->kind == TYPE_COMPOUND_UNION;
268 static inline bool is_type_struct(const type_t *type)
270 assert(!is_typeref(type));
271 return type->kind == TYPE_COMPOUND_STRUCT;
274 static inline bool is_type_builtin(const type_t *type)
276 assert(!is_typeref(type));
277 return type->kind == TYPE_BUILTIN;
280 static inline bool is_type_compound(const type_t *type)
282 assert(!is_typeref(type));
283 return type->kind == TYPE_COMPOUND_STRUCT
284 || type->kind == TYPE_COMPOUND_UNION;
287 static inline bool is_type_valid(const type_t *type)
289 assert(!is_typeref(type));
290 return type->kind != TYPE_ERROR;