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,
40 ATTRIBUTE_GNU_LONGCALL,
41 ATTRIBUTE_GNU_LONG_CALL,
43 ATTRIBUTE_GNU_MAY_ALIAS,
46 ATTRIBUTE_GNU_MS_STRUCT,
49 ATTRIBUTE_GNU_NESTING,
50 ATTRIBUTE_GNU_NMI_HANDLER,
51 ATTRIBUTE_GNU_NOCOMMON,
52 ATTRIBUTE_GNU_NOINLINE,
53 ATTRIBUTE_GNU_NO_INSTRUMENT_FUNCTION,
54 ATTRIBUTE_GNU_NONNULL,
55 ATTRIBUTE_GNU_NORETURN,
56 ATTRIBUTE_GNU_NOTHROW,
57 ATTRIBUTE_GNU_NOTSHARED,
60 ATTRIBUTE_GNU_REGPARM,
61 ATTRIBUTE_GNU_RETURNS_TWICE,
62 ATTRIBUTE_GNU_RETURN_TWICE,
63 ATTRIBUTE_GNU_SAVEALL,
64 ATTRIBUTE_GNU_SECTION,
65 ATTRIBUTE_GNU_SENTINEL,
67 ATTRIBUTE_GNU_SHORTCALL,
68 ATTRIBUTE_GNU_SHORT_CALL,
70 ATTRIBUTE_GNU_SP_SWITCH,
71 ATTRIBUTE_GNU_SSEREGPARM,
72 ATTRIBUTE_GNU_STDCALL,
73 ATTRIBUTE_GNU_TINY_DATA,
74 ATTRIBUTE_GNU_TLS_MODEL,
75 ATTRIBUTE_GNU_TRANSPARENT_UNION,
76 ATTRIBUTE_GNU_TRAP_EXIT,
79 ATTRIBUTE_GNU_VISIBILITY,
80 ATTRIBUTE_GNU_VOLATILE,
81 ATTRIBUTE_GNU_WARN_UNUSED_RESULT,
83 ATTRIBUTE_GNU_WEAKREF,
84 ATTRIBUTE_GNU_LAST = ATTRIBUTE_GNU_WEAKREF,
86 ATTRIBUTE_MS_ALIGN = ATTRIBUTE_MS_FIRST,
87 ATTRIBUTE_MS_ALLOCATE,
90 ATTRIBUTE_MS_DEPRECATED,
91 ATTRIBUTE_MS_DLLEXPORT,
92 ATTRIBUTE_MS_DLLIMPORT,
93 ATTRIBUTE_MS_FASTCALL,
94 ATTRIBUTE_MS_FORCEINLINE,
97 ATTRIBUTE_MS_NOINLINE,
98 ATTRIBUTE_MS_NORETURN,
100 ATTRIBUTE_MS_NOVTABLE,
101 ATTRIBUTE_MS_PROPERTY,
102 ATTRIBUTE_MS_RESTRICT,
103 ATTRIBUTE_MS_RETURNS_TWICE,
104 ATTRIBUTE_MS_SELECTANY,
105 ATTRIBUTE_MS_STDCALL,
106 ATTRIBUTE_MS_THISCALL,
109 ATTRIBUTE_MS_LAST = ATTRIBUTE_MS_UUID,
110 ATTRIBUTE_LAST = ATTRIBUTE_MS_LAST
113 typedef enum attribute_argument_kind_t {
114 ATTRIBUTE_ARGUMENT_SYMBOL,
115 ATTRIBUTE_ARGUMENT_EXPRESSION
116 } attribute_argument_kind_t;
118 /** this argument type should be fine for 99% of the arguments */
119 typedef struct attribute_argument_t attribute_argument_t;
120 struct attribute_argument_t {
121 attribute_argument_t *next;
122 attribute_argument_kind_t kind;
125 expression_t *expression;
129 typedef struct attribute_property_argument_t attribute_property_argument_t;
130 struct attribute_property_argument_t {
131 symbol_t *put_symbol;
132 symbol_t *get_symbol;
136 source_position_t source_position;
138 attribute_kind_t kind; /**< The kind of the GNU attribute. */
140 attribute_argument_t *arguments;
141 attribute_property_argument_t *property;
145 const char *get_attribute_name(attribute_kind_t kind);
147 bool attributes_equal(const attribute_t *attr1, const attribute_t *attr2);