sort attribute enum alphabetically
[cparser] / attribute_t.h
1 #ifndef ATTRIBUTE_T_H
2 #define ATTRIBUTE_T_H
3
4 #include "attribute.h"
5 #include "ast.h"
6 #include "symbol.h"
7 #include "type.h"
8
9 /**
10  * GNU attributes.
11  */
12 typedef enum attribute_kind_t {
13         ATTRIBUTE_ERROR,
14         ATTRIBUTE_UNKNOWN,
15         ATTRIBUTE_GNU_FIRST,
16         ATTRIBUTE_GNU_ALIAS = ATTRIBUTE_GNU_FIRST,
17         ATTRIBUTE_GNU_ALIGNED,
18         ATTRIBUTE_GNU_ALWAYS_INLINE,
19         ATTRIBUTE_GNU_ASM,
20         ATTRIBUTE_GNU_CDECL,
21         ATTRIBUTE_GNU_COMMON,
22         ATTRIBUTE_GNU_CONST,
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,
30         ATTRIBUTE_GNU_FAR,
31         ATTRIBUTE_GNU_FASTCALL,
32         ATTRIBUTE_GNU_FLATTEN,
33         ATTRIBUTE_GNU_FORMAT,
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,
41         ATTRIBUTE_GNU_MALLOC,
42         ATTRIBUTE_GNU_MAY_ALIAS,
43         ATTRIBUTE_GNU_MODE,
44         ATTRIBUTE_GNU_MODEL,
45         ATTRIBUTE_GNU_MS_STRUCT,
46         ATTRIBUTE_GNU_NAKED,
47         ATTRIBUTE_GNU_NEAR,
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,
57         ATTRIBUTE_GNU_PACKED,
58         ATTRIBUTE_GNU_PURE,
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,
65         ATTRIBUTE_GNU_SHARED,
66         ATTRIBUTE_GNU_SHORTCALL,
67         ATTRIBUTE_GNU_SHORT_CALL,
68         ATTRIBUTE_GNU_SIGNAL,
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,
76         ATTRIBUTE_GNU_UNUSED,
77         ATTRIBUTE_GNU_USED,
78         ATTRIBUTE_GNU_VISIBILITY,
79         ATTRIBUTE_GNU_VOLATILE,
80         ATTRIBUTE_GNU_WARN_UNUSED_RESULT,
81         ATTRIBUTE_GNU_WEAK,
82         ATTRIBUTE_GNU_WEAKREF,
83         ATTRIBUTE_GNU_LAST = ATTRIBUTE_GNU_WEAKREF,
84         ATTRIBUTE_MS_FIRST,
85         ATTRIBUTE_MS_ALIGN = ATTRIBUTE_MS_FIRST,
86         ATTRIBUTE_MS_ALLOCATE,
87         ATTRIBUTE_MS_BASED,
88         ATTRIBUTE_MS_CDECL,
89         ATTRIBUTE_MS_DEPRECATED,
90         ATTRIBUTE_MS_DLLEXPORT,
91         ATTRIBUTE_MS_DLLIMPORT,
92         ATTRIBUTE_MS_FASTCALL,
93         ATTRIBUTE_MS_FORCEINLINE,
94         ATTRIBUTE_MS_NAKED,
95         ATTRIBUTE_MS_NOALIAS,
96         ATTRIBUTE_MS_NOINLINE,
97         ATTRIBUTE_MS_NORETURN,
98         ATTRIBUTE_MS_NOTHROW,
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,
106         ATTRIBUTE_MS_THREAD,
107         ATTRIBUTE_MS_UUID,
108         ATTRIBUTE_MS_LAST = ATTRIBUTE_MS_UUID,
109         ATTRIBUTE_LAST = ATTRIBUTE_MS_LAST
110 } attribute_kind_t;
111
112 typedef enum attribute_argument_kind_t {
113         ATTRIBUTE_ARGUMENT_SYMBOL,
114         ATTRIBUTE_ARGUMENT_EXPRESSION
115 } attribute_argument_kind_t;
116
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;
122         union {
123                 symbol_t     *symbol;
124                 expression_t *expression;
125         } v;
126 };
127
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;
132 };
133
134 struct attribute_t {
135         source_position_t     source_position;
136         attribute_t          *next;
137         attribute_kind_t      kind;         /**< The kind of the GNU attribute. */
138         union {
139                 attribute_argument_t          *arguments;
140                 attribute_property_argument_t *property;
141         } a;
142 };
143
144 const char *get_attribute_name(attribute_kind_t kind);
145
146 bool attributes_equal(const attribute_t *attr1, const attribute_t *attr2);
147
148 #endif