12 typedef enum attribute_kind_t {
16 ATTRIBUTE_GNU_CONST = ATTRIBUTE_GNU_FIRST,
17 ATTRIBUTE_GNU_VOLATILE,
19 ATTRIBUTE_GNU_STDCALL,
20 ATTRIBUTE_GNU_FASTCALL,
21 ATTRIBUTE_GNU_DEPRECATED,
22 ATTRIBUTE_GNU_NOINLINE,
23 ATTRIBUTE_GNU_RETURNS_TWICE,
24 ATTRIBUTE_GNU_NORETURN,
27 ATTRIBUTE_GNU_ALWAYS_INLINE,
30 ATTRIBUTE_GNU_CONSTRUCTOR,
31 ATTRIBUTE_GNU_DESTRUCTOR,
32 ATTRIBUTE_GNU_NOTHROW,
33 ATTRIBUTE_GNU_TRANSPARENT_UNION,
35 ATTRIBUTE_GNU_NOCOMMON,
38 ATTRIBUTE_GNU_NOTSHARED,
41 ATTRIBUTE_GNU_NO_INSTRUMENT_FUNCTION,
42 ATTRIBUTE_GNU_WARN_UNUSED_RESULT,
43 ATTRIBUTE_GNU_LONGCALL,
44 ATTRIBUTE_GNU_SHORTCALL,
45 ATTRIBUTE_GNU_LONG_CALL,
46 ATTRIBUTE_GNU_SHORT_CALL,
47 ATTRIBUTE_GNU_FUNCTION_VECTOR,
48 ATTRIBUTE_GNU_INTERRUPT,
49 ATTRIBUTE_GNU_INTERRUPT_HANDLER,
50 ATTRIBUTE_GNU_NMI_HANDLER,
51 ATTRIBUTE_GNU_NESTING,
55 ATTRIBUTE_GNU_EIGTHBIT_DATA,
56 ATTRIBUTE_GNU_TINY_DATA,
57 ATTRIBUTE_GNU_SAVEALL,
58 ATTRIBUTE_GNU_FLATTEN,
59 ATTRIBUTE_GNU_SSEREGPARM,
60 ATTRIBUTE_GNU_EXTERNALLY_VISIBLE,
61 ATTRIBUTE_GNU_RETURN_TWICE,
62 ATTRIBUTE_GNU_MAY_ALIAS,
63 ATTRIBUTE_GNU_MS_STRUCT,
64 ATTRIBUTE_GNU_GCC_STRUCT,
65 ATTRIBUTE_GNU_DLLIMPORT,
66 ATTRIBUTE_GNU_DLLEXPORT,
67 ATTRIBUTE_GNU_ALIGNED,
69 ATTRIBUTE_GNU_SECTION,
71 ATTRIBUTE_GNU_FORMAT_ARG,
72 ATTRIBUTE_GNU_WEAKREF,
73 ATTRIBUTE_GNU_NONNULL,
74 ATTRIBUTE_GNU_TLS_MODEL,
75 ATTRIBUTE_GNU_VISIBILITY,
76 ATTRIBUTE_GNU_REGPARM,
79 ATTRIBUTE_GNU_TRAP_EXIT,
80 ATTRIBUTE_GNU_SP_SWITCH,
81 ATTRIBUTE_GNU_SENTINEL,
83 ATTRIBUTE_GNU_LAST = ATTRIBUTE_GNU_ASM,
85 ATTRIBUTE_MS_BASED = ATTRIBUTE_MS_FIRST,
87 ATTRIBUTE_MS_ALLOCATE,
89 ATTRIBUTE_MS_FASTCALL,
91 ATTRIBUTE_MS_THISCALL,
92 ATTRIBUTE_MS_RESTRICT,
93 ATTRIBUTE_MS_DLLIMPORT,
94 ATTRIBUTE_MS_DLLEXPORT,
97 ATTRIBUTE_MS_FORCEINLINE,
98 ATTRIBUTE_MS_NOINLINE,
99 ATTRIBUTE_MS_RETURNS_TWICE,
100 ATTRIBUTE_MS_NORETURN,
101 ATTRIBUTE_MS_NOTHROW,
102 ATTRIBUTE_MS_NOVTABLE,
103 ATTRIBUTE_MS_PROPERTY,
104 ATTRIBUTE_MS_SELECTANY,
106 ATTRIBUTE_MS_DEPRECATED,
107 ATTRIBUTE_MS_NOALIAS,
108 ATTRIBUTE_MS_LAST = ATTRIBUTE_MS_NOALIAS,
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);