2 * This file is part of cparser.
3 * Copyright (C) 2012 Matthias Braun <matze@braunis.de>
16 typedef enum attribute_kind_t {
20 ATTRIBUTE_GNU_ALIAS = ATTRIBUTE_GNU_FIRST,
21 ATTRIBUTE_GNU_ALIGNED,
22 ATTRIBUTE_GNU_ALWAYS_INLINE,
27 ATTRIBUTE_GNU_CONSTRUCTOR,
28 ATTRIBUTE_GNU_DEPRECATED,
29 ATTRIBUTE_GNU_DESTRUCTOR,
30 ATTRIBUTE_GNU_DLLEXPORT,
31 ATTRIBUTE_GNU_DLLIMPORT,
32 ATTRIBUTE_GNU_EIGTHBIT_DATA,
33 ATTRIBUTE_GNU_EXTERNALLY_VISIBLE,
35 ATTRIBUTE_GNU_FASTCALL,
36 ATTRIBUTE_GNU_FLATTEN,
38 ATTRIBUTE_GNU_FORMAT_ARG,
39 ATTRIBUTE_GNU_FUNCTION_VECTOR,
40 ATTRIBUTE_GNU_GCC_STRUCT,
41 ATTRIBUTE_GNU_INTERRUPT,
42 ATTRIBUTE_GNU_INTERRUPT_HANDLER,
44 ATTRIBUTE_GNU_LONGCALL,
45 ATTRIBUTE_GNU_LONG_CALL,
47 ATTRIBUTE_GNU_MAY_ALIAS,
50 ATTRIBUTE_GNU_MS_STRUCT,
53 ATTRIBUTE_GNU_NESTING,
54 ATTRIBUTE_GNU_NMI_HANDLER,
55 ATTRIBUTE_GNU_NOCOMMON,
56 ATTRIBUTE_GNU_NOINLINE,
57 ATTRIBUTE_GNU_NO_INSTRUMENT_FUNCTION,
58 ATTRIBUTE_GNU_NONNULL,
59 ATTRIBUTE_GNU_NORETURN,
60 ATTRIBUTE_GNU_NOTHROW,
61 ATTRIBUTE_GNU_NOTSHARED,
64 ATTRIBUTE_GNU_REGPARM,
65 ATTRIBUTE_GNU_RETURNS_TWICE,
66 ATTRIBUTE_GNU_RETURN_TWICE,
67 ATTRIBUTE_GNU_SAVEALL,
68 ATTRIBUTE_GNU_SECTION,
69 ATTRIBUTE_GNU_SENTINEL,
71 ATTRIBUTE_GNU_SHORTCALL,
72 ATTRIBUTE_GNU_SHORT_CALL,
74 ATTRIBUTE_GNU_SP_SWITCH,
75 ATTRIBUTE_GNU_SSEREGPARM,
76 ATTRIBUTE_GNU_STDCALL,
77 ATTRIBUTE_GNU_TINY_DATA,
78 ATTRIBUTE_GNU_TLS_MODEL,
79 ATTRIBUTE_GNU_TRANSPARENT_UNION,
80 ATTRIBUTE_GNU_TRAP_EXIT,
83 ATTRIBUTE_GNU_VISIBILITY,
84 ATTRIBUTE_GNU_VOLATILE,
85 ATTRIBUTE_GNU_WARN_UNUSED_RESULT,
87 ATTRIBUTE_GNU_WEAKREF,
88 ATTRIBUTE_GNU_LAST = ATTRIBUTE_GNU_WEAKREF,
90 ATTRIBUTE_MS_ALIGN = ATTRIBUTE_MS_FIRST,
91 ATTRIBUTE_MS_ALLOCATE,
94 ATTRIBUTE_MS_DEPRECATED,
95 ATTRIBUTE_MS_DLLEXPORT,
96 ATTRIBUTE_MS_DLLIMPORT,
97 ATTRIBUTE_MS_FASTCALL,
98 ATTRIBUTE_MS_FORCEINLINE,
100 ATTRIBUTE_MS_NOALIAS,
101 ATTRIBUTE_MS_NOINLINE,
102 ATTRIBUTE_MS_NORETURN,
103 ATTRIBUTE_MS_NOTHROW,
104 ATTRIBUTE_MS_NOVTABLE,
105 ATTRIBUTE_MS_PROPERTY,
106 ATTRIBUTE_MS_RESTRICT,
107 ATTRIBUTE_MS_RETURNS_TWICE,
108 ATTRIBUTE_MS_SELECTANY,
109 ATTRIBUTE_MS_STDCALL,
110 ATTRIBUTE_MS_THISCALL,
113 ATTRIBUTE_MS_LAST = ATTRIBUTE_MS_UUID,
114 ATTRIBUTE_LAST = ATTRIBUTE_MS_LAST
117 typedef enum attribute_argument_kind_t {
118 ATTRIBUTE_ARGUMENT_SYMBOL,
119 ATTRIBUTE_ARGUMENT_EXPRESSION
120 } attribute_argument_kind_t;
122 /** this argument type should be fine for 99% of the arguments */
123 typedef struct attribute_argument_t attribute_argument_t;
124 struct attribute_argument_t {
125 attribute_argument_t *next;
126 attribute_argument_kind_t kind;
129 expression_t *expression;
133 typedef struct attribute_property_argument_t attribute_property_argument_t;
134 struct attribute_property_argument_t {
135 symbol_t *put_symbol;
136 symbol_t *get_symbol;
142 attribute_kind_t kind; /**< The kind of the GNU attribute. */
144 attribute_argument_t *arguments;
145 attribute_property_argument_t *property;
149 const char *get_attribute_name(attribute_kind_t kind);
151 bool attributes_equal(const attribute_t *attr1, const attribute_t *attr2);