12 typedef enum attribute_kind_t {
16 ATTRIBUTE_GNU_ALIAS = ATTRIBUTE_GNU_FIRST,
17 ATTRIBUTE_GNU_ALIGNED,
18 ATTRIBUTE_GNU_ALWAYS_INLINE,
23 ATTRIBUTE_GNU_CONSTRUCTOR,
24 ATTRIBUTE_GNU_DEPRECATED,
25 ATTRIBUTE_GNU_DESTRUCTOR,
26 ATTRIBUTE_GNU_DLLEXPORT,
27 ATTRIBUTE_GNU_DLLIMPORT,
28 ATTRIBUTE_GNU_EIGTHBIT_DATA,
29 ATTRIBUTE_GNU_EXTERNALLY_VISIBLE,
31 ATTRIBUTE_GNU_FASTCALL,
32 ATTRIBUTE_GNU_FLATTEN,
34 ATTRIBUTE_GNU_FORMAT_ARG,
35 ATTRIBUTE_GNU_FUNCTION_VECTOR,
36 ATTRIBUTE_GNU_GCC_STRUCT,
37 ATTRIBUTE_GNU_INTERRUPT,
38 ATTRIBUTE_GNU_INTERRUPT_HANDLER,
39 ATTRIBUTE_GNU_LONGCALL,
40 ATTRIBUTE_GNU_LONG_CALL,
42 ATTRIBUTE_GNU_MAY_ALIAS,
45 ATTRIBUTE_GNU_MS_STRUCT,
48 ATTRIBUTE_GNU_NESTING,
49 ATTRIBUTE_GNU_NMI_HANDLER,
50 ATTRIBUTE_GNU_NOCOMMON,
51 ATTRIBUTE_GNU_NOINLINE,
52 ATTRIBUTE_GNU_NO_INSTRUMENT_FUNCTION,
53 ATTRIBUTE_GNU_NONNULL,
54 ATTRIBUTE_GNU_NORETURN,
55 ATTRIBUTE_GNU_NOTHROW,
56 ATTRIBUTE_GNU_NOTSHARED,
59 ATTRIBUTE_GNU_REGPARM,
60 ATTRIBUTE_GNU_RETURNS_TWICE,
61 ATTRIBUTE_GNU_RETURN_TWICE,
62 ATTRIBUTE_GNU_SAVEALL,
63 ATTRIBUTE_GNU_SECTION,
64 ATTRIBUTE_GNU_SENTINEL,
66 ATTRIBUTE_GNU_SHORTCALL,
67 ATTRIBUTE_GNU_SHORT_CALL,
69 ATTRIBUTE_GNU_SP_SWITCH,
70 ATTRIBUTE_GNU_SSEREGPARM,
71 ATTRIBUTE_GNU_STDCALL,
72 ATTRIBUTE_GNU_TINY_DATA,
73 ATTRIBUTE_GNU_TLS_MODEL,
74 ATTRIBUTE_GNU_TRANSPARENT_UNION,
75 ATTRIBUTE_GNU_TRAP_EXIT,
78 ATTRIBUTE_GNU_VISIBILITY,
79 ATTRIBUTE_GNU_VOLATILE,
80 ATTRIBUTE_GNU_WARN_UNUSED_RESULT,
82 ATTRIBUTE_GNU_WEAKREF,
83 ATTRIBUTE_GNU_LAST = ATTRIBUTE_GNU_WEAKREF,
85 ATTRIBUTE_MS_ALIGN = ATTRIBUTE_MS_FIRST,
86 ATTRIBUTE_MS_ALLOCATE,
89 ATTRIBUTE_MS_DEPRECATED,
90 ATTRIBUTE_MS_DLLEXPORT,
91 ATTRIBUTE_MS_DLLIMPORT,
92 ATTRIBUTE_MS_FASTCALL,
93 ATTRIBUTE_MS_FORCEINLINE,
96 ATTRIBUTE_MS_NOINLINE,
97 ATTRIBUTE_MS_NORETURN,
99 ATTRIBUTE_MS_NOVTABLE,
100 ATTRIBUTE_MS_PROPERTY,
101 ATTRIBUTE_MS_RESTRICT,
102 ATTRIBUTE_MS_RETURNS_TWICE,
103 ATTRIBUTE_MS_SELECTANY,
104 ATTRIBUTE_MS_STDCALL,
105 ATTRIBUTE_MS_THISCALL,
108 ATTRIBUTE_MS_LAST = ATTRIBUTE_MS_UUID,
109 ATTRIBUTE_LAST = ATTRIBUTE_MS_LAST
112 typedef enum attribute_argument_kind_t {
113 ATTRIBUTE_ARGUMENT_SYMBOL,
114 ATTRIBUTE_ARGUMENT_EXPRESSION
115 } attribute_argument_kind_t;
117 /** this argument type should be fine for 99% of the arguments */
118 typedef struct attribute_argument_t attribute_argument_t;
119 struct attribute_argument_t {
120 attribute_argument_t *next;
121 attribute_argument_kind_t kind;
124 expression_t *expression;
128 typedef struct attribute_property_argument_t attribute_property_argument_t;
129 struct attribute_property_argument_t {
130 symbol_t *put_symbol;
131 symbol_t *get_symbol;
135 source_position_t source_position;
137 attribute_kind_t kind; /**< The kind of the GNU attribute. */
139 attribute_argument_t *arguments;
140 attribute_property_argument_t *property;
144 const char *get_attribute_name(attribute_kind_t kind);
146 bool attributes_equal(const attribute_t *attr1, const attribute_t *attr2);