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;
55 TYPE_MODIFIER_NONE = 0,
56 TYPE_MODIFIER_TRANSPARENT_UNION = 1 << 0,
58 typedef unsigned short type_modifiers_t;
62 type_qualifiers_t qualifiers;
63 type_modifiers_t modifiers;
64 unsigned char alignment; /**< The extra alignment of the type, 0 for default. */
65 source_position_t source_position;
70 struct atomic_type_t {
72 atomic_type_kind_t akind;
75 struct complex_type_t {
77 atomic_type_kind_t akind;
80 struct imaginary_type_t {
82 atomic_type_kind_t akind;
85 struct builtin_type_t {
91 struct pointer_type_t {
99 expression_t *size_expression;
102 ir_node *size_node; /**< used by ast2firm phase */
104 unsigned is_static : 1; /**< a [static] type */
105 unsigned is_variable : 1; /**< a [*] type */
106 unsigned has_implicit_size : 1;
107 unsigned size_constant : 1; /**< size expression is constant */
108 unsigned is_vla : 1; /**< it's a variable length array */
112 * An entry in the parameter list of a function type.
114 struct function_parameter_t {
115 type_t *type; /**< The parameter type. */
116 function_parameter_t *next; /**< Points to the next type inthe parameter list.*/
119 /** Calling conventions. */
121 CC_DEFAULT, /**< defualt calling convention. */
122 CC_CDECL, /**< cdecl calling convention. */
123 CC_STDCALL, /**< stdcall calling convention. */
124 CC_FASTCALL, /**< fastcall calling convention. */
125 CC_THISCALL /**< thiscall calling convention. */
131 struct function_type_t {
133 type_t *return_type; /**< The return type. */
134 function_parameter_t *parameters; /**< A linst of the parameter types. */
135 cc_kind_t calling_convention; /**< The specified calling convention. */
136 unsigned variadic : 1;
137 unsigned unspecified_parameters : 1;
138 unsigned kr_style_parameters : 1;
141 struct compound_type_t {
143 /** the declaration of the compound type, the scope of the declaration
144 * contains the compound entries. */
145 declaration_t *declaration;
150 /** the declaration of the enum type. You can find the enum entries by
151 * walking the declaration->next list until you don't find
152 * STORAGE_CLASS_ENUM_ENTRY declarations anymore */
153 declaration_t *declaration;
156 struct typedef_type_t {
158 declaration_t *declaration;
159 type_t *resolved_type;
162 struct typeof_type_t {
164 expression_t *expression;
166 type_t *resolved_type;
169 struct bitfield_type_t {
178 atomic_type_t atomic;
179 complex_type_t complex;
180 imaginary_type_t imaginary;
181 builtin_type_t builtin;
182 pointer_type_t pointer;
184 function_type_t function;
185 compound_type_t compound;
187 typedef_type_t typedeft;
188 bitfield_type_t bitfield;
189 typeof_type_t typeoft;
192 type_t *make_atomic_type(atomic_type_kind_t type, type_qualifiers_t qualifiers);
193 type_t *make_complex_type(atomic_type_kind_t type, type_qualifiers_t qualifiers);
194 type_t *make_imaginary_type(atomic_type_kind_t type, type_qualifiers_t qualifiers);
195 type_t *make_pointer_type(type_t *points_to, type_qualifiers_t qualifiers);
196 type_t *make_array_type(type_t *element_type, size_t size,
197 type_qualifiers_t qualifiers);
199 type_t *duplicate_type(const type_t *type);
201 static inline bool is_typeref(const type_t *type)
203 return type->kind == TYPE_TYPEDEF || type->kind == TYPE_TYPEOF;
206 static inline bool is_type_atomic(const type_t *type, atomic_type_kind_t atype)
208 assert(!is_typeref(type));
210 if(type->kind != TYPE_ATOMIC)
212 const atomic_type_t *atomic_type = &type->atomic;
214 return atomic_type->akind == atype;
217 static inline bool is_type_pointer(const type_t *type)
219 assert(!is_typeref(type));
220 return type->kind == TYPE_POINTER;
223 static inline bool is_type_array(const type_t *type)
225 assert(!is_typeref(type));
226 return type->kind == TYPE_ARRAY;
229 static inline bool is_type_function(const type_t *type)
231 assert(!is_typeref(type));
232 return type->kind == TYPE_FUNCTION;
235 static inline bool is_type_union(const type_t *type)
237 assert(!is_typeref(type));
238 return type->kind == TYPE_COMPOUND_UNION;
241 static inline bool is_type_struct(const type_t *type)
243 assert(!is_typeref(type));
244 return type->kind == TYPE_COMPOUND_STRUCT;
247 static inline bool is_type_builtin(const type_t *type)
249 assert(!is_typeref(type));
250 return type->kind == TYPE_BUILTIN;
253 static inline bool is_type_compound(const type_t *type)
255 assert(!is_typeref(type));
256 return type->kind == TYPE_COMPOUND_STRUCT
257 || type->kind == TYPE_COMPOUND_UNION;
260 static inline bool is_type_valid(const type_t *type)
262 return type->kind != TYPE_ERROR;