2 * This file is part of cparser.
3 * Copyright (C) 2007-2009 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 "attribute.h"
27 #include <libfirm/firm_types.h>
32 ENTITY_COMPOUND_MEMBER,
45 typedef unsigned char entity_kind_t;
47 typedef enum namespace_tag_t {
53 typedef unsigned char entity_namespace_t;
55 typedef enum storage_class_tag_t {
59 STORAGE_CLASS_TYPEDEF,
61 STORAGE_CLASS_REGISTER,
62 } storage_class_tag_t;
63 typedef unsigned char storage_class_t;
65 typedef enum decl_modifier_t {
67 DM_DLLIMPORT = 1 << 0,
68 DM_DLLEXPORT = 1 << 1,
71 DM_MICROSOFT_INLINE = 1 << 4,
72 DM_FORCEINLINE = 1 << 5,
73 DM_SELECTANY = 1 << 6,
77 DM_NOINLINE = 1 << 10,
78 DM_RESTRICT = 1 << 11,
80 DM_TRANSPARENT_UNION = 1 << 13,
83 DM_CONSTRUCTOR = 1 << 16,
84 DM_DESTRUCTOR = 1 << 17,
88 DM_FASTCALL = 1 << 21,
90 DM_THISCALL = 1 << 23,
91 DM_DEPRECATED = 1 << 24,
92 DM_RETURNS_TWICE = 1 << 25,
98 * A scope containing entities.
102 entity_t *last_entity; /**< pointer to last entity (so appending is fast) */
103 unsigned depth; /**< while parsing, the depth of this scope in the
108 * a named entity is something which can be referenced by its name
111 struct entity_base_t {
113 entity_namespace_t namespc;
115 source_position_t source_position;
116 scope_t *parent_scope; /**< The scope where this entity
118 entity_t *parent_entity;
120 /** next declaration in a scope */
122 /** next declaration with same symbol */
123 entity_t *symbol_next;
128 entity_t *alias; /* used for name mangling of anonymous types */
130 decl_modifiers_t modifiers;
133 bool transparent_union : 1;
136 il_alignment_t alignment;
141 bool irtype_complete : 1;
146 entity_t *alias; /* used for name mangling of anonymous types */
153 struct enum_value_t {
165 bool address_taken : 1;
166 statement_t *statement;
179 decl_modifiers_t modifiers;
181 il_alignment_t alignment;
185 struct declaration_t {
188 storage_class_t declared_storage_class;
189 storage_class_t storage_class;
190 decl_modifiers_t modifiers;
191 il_alignment_t alignment;
192 attribute_t *attributes;
193 bool used : 1; /**< Set if the declaration is used. */
194 bool implicit : 1; /**< Set for implicit (not found in source code) declarations. */
200 struct compound_member_t {
203 bool address_taken : 1; /**< Set if the address of this declaration was taken. */
204 unsigned short offset; /**< the offset of this member in the compound */
205 unsigned char bit_offset; /**< extra bit offset for bitfield members */
213 bool thread_local : 1; /**< GCC __thread */
218 bool address_taken : 1; /**< Set if the address of this declaration was taken. */
221 initializer_t *initializer;
225 unsigned int value_number;
233 bool address_taken : 1;
238 unsigned int value_number;
244 * GNU builtin or MS intrinsic functions.
246 typedef enum builtin_kind_t {
247 bk_none = 0, /**< no builtin */
248 bk_gnu_builtin_alloca, /**< GNU __builtin_alloca */
249 bk_gnu_builtin_huge_val, /**< GNU __builtin_huge_val */
250 bk_gnu_builtin_inf, /**< GNU __builtin_inf */
251 bk_gnu_builtin_inff, /**< GNU __builtin_inff */
252 bk_gnu_builtin_infl, /**< GNU __builtin_infl */
253 bk_gnu_builtin_nan, /**< GNU __builtin_nan */
254 bk_gnu_builtin_nanf, /**< GNU __builtin_nanf */
255 bk_gnu_builtin_nanl, /**< GNU __builtin_nanl */
256 bk_gnu_builtin_va_end, /**< GNU __builtin_va_end */
257 bk_gnu_builtin_expect, /**< GNU __builtin_expect */
258 bk_gnu_builtin_return_address, /**< GNU __builtin_return_address */
259 bk_gnu_builtin_frame_address, /**< GNU __builtin_frame_address */
260 bk_gnu_builtin_ffs, /**< GNU __builtin_ffs */
261 bk_gnu_builtin_clz, /**< GNU __builtin_clz */
262 bk_gnu_builtin_ctz, /**< GNU __builtin_ctz */
263 bk_gnu_builtin_popcount, /**< GNU __builtin_popcount */
264 bk_gnu_builtin_parity, /**< GNU __builtin_parity */
265 bk_gnu_builtin_prefetch, /**< GNU __builtin_prefetch */
266 bk_gnu_builtin_trap, /**< GNU __builtin_trap */
268 bk_ms_rotl, /**< MS _rotl */
269 bk_ms_rotr, /**< MS _rotr */
270 bk_ms_rotl64, /**< MS _rotl64 */
271 bk_ms_rotr64, /**< MS _rotr64 */
272 bk_ms_byteswap_ushort, /**< MS _byteswap_ushort */
273 bk_ms_byteswap_ulong, /**< MS _byteswap_ulong */
274 bk_ms_byteswap_uint64, /**< MS _byteswap_uint64 */
276 bk_ms__debugbreak, /**< MS __debugbreak */
277 bk_ms_ReturnAddress, /**< MS _ReturnAddress */
278 bk_ms_AddressOfReturnAddress, /**< MS _AddressOfReturnAddress */
279 bk_ms__popcount, /**< MS __popcount */
280 bk_ms_enable, /**< MS _enable */
281 bk_ms_disable, /**< MS _disable */
282 bk_ms__inbyte, /**< MS __inbyte */
283 bk_ms__inword, /**< MS __inword */
284 bk_ms__indword, /**< MS __indword */
285 bk_ms__outbyte, /**< MS __outbyte */
286 bk_ms__outword, /**< MS __outword */
287 bk_ms__outdword, /**< MS __outdword */
288 bk_ms__ud2, /**< MS __ud2 */
289 bk_ms_BitScanForward, /**< MS _BitScanForward */
290 bk_ms_BitScanReverse, /**< MS _BitScanReverse */
291 bk_ms_InterlockedExchange, /**< MS _InterlockedExchange */
292 bk_ms_InterlockedExchange64, /**< MS _InterlockedExchange64 */
293 bk_ms__readeflags, /**< MS __readflags */
294 bk_ms__writeeflags, /**< MS __writeflags */
301 bool need_closure : 1; /**< Inner function needs closure. */
302 bool goto_to_outer : 1; /**< Inner function has goto to outer function. */
306 statement_t *statement;
310 ir_node *static_link; /**< if need_closure is set, the node
311 representing the static link. */
321 enum_value_t enum_value;
323 namespace_t namespacee;
325 declaration_t declaration;
327 parameter_t parameter;
329 compound_member_t compound_member;
332 #define DECLARATION_KIND_CASES \
333 case ENTITY_FUNCTION: \
334 case ENTITY_VARIABLE: \
335 case ENTITY_PARAMETER: \
336 case ENTITY_COMPOUND_MEMBER:
338 static inline bool is_declaration(const entity_t *entity)
340 switch(entity->kind) {
341 DECLARATION_KIND_CASES
348 const char *get_entity_kind_name(entity_kind_t kind);