rewrite of attribute handling
[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_CONST = ATTRIBUTE_GNU_FIRST,
17         ATTRIBUTE_GNU_VOLATILE,
18         ATTRIBUTE_GNU_CDECL,
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,
25         ATTRIBUTE_GNU_NAKED,
26         ATTRIBUTE_GNU_PURE,
27         ATTRIBUTE_GNU_ALWAYS_INLINE,
28         ATTRIBUTE_GNU_MALLOC,
29         ATTRIBUTE_GNU_WEAK,
30         ATTRIBUTE_GNU_CONSTRUCTOR,
31         ATTRIBUTE_GNU_DESTRUCTOR,
32         ATTRIBUTE_GNU_NOTHROW,
33         ATTRIBUTE_GNU_TRANSPARENT_UNION,
34         ATTRIBUTE_GNU_COMMON,
35         ATTRIBUTE_GNU_NOCOMMON,
36         ATTRIBUTE_GNU_PACKED,
37         ATTRIBUTE_GNU_SHARED,
38         ATTRIBUTE_GNU_NOTSHARED,
39         ATTRIBUTE_GNU_USED,
40         ATTRIBUTE_GNU_UNUSED,
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,
52         ATTRIBUTE_GNU_NEAR,
53         ATTRIBUTE_GNU_FAR,
54         ATTRIBUTE_GNU_SIGNAL,
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,
68         ATTRIBUTE_GNU_ALIAS,
69         ATTRIBUTE_GNU_SECTION,
70         ATTRIBUTE_GNU_FORMAT,
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,
77         ATTRIBUTE_GNU_MODEL,
78         ATTRIBUTE_GNU_MODE,
79         ATTRIBUTE_GNU_TRAP_EXIT,
80         ATTRIBUTE_GNU_SP_SWITCH,
81         ATTRIBUTE_GNU_SENTINEL,
82         ATTRIBUTE_GNU_ASM,
83         ATTRIBUTE_GNU_LAST = ATTRIBUTE_GNU_ASM,
84         ATTRIBUTE_MS_FIRST,
85         ATTRIBUTE_MS_BASED = ATTRIBUTE_MS_FIRST,
86         ATTRIBUTE_MS_ALIGN,
87         ATTRIBUTE_MS_ALLOCATE,
88         ATTRIBUTE_MS_CDECL,
89         ATTRIBUTE_MS_FASTCALL,
90         ATTRIBUTE_MS_STDCALL,
91         ATTRIBUTE_MS_THISCALL,
92         ATTRIBUTE_MS_RESTRICT,
93         ATTRIBUTE_MS_DLLIMPORT,
94         ATTRIBUTE_MS_DLLEXPORT,
95         ATTRIBUTE_MS_THREAD,
96         ATTRIBUTE_MS_NAKED,
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,
105         ATTRIBUTE_MS_UUID,
106         ATTRIBUTE_MS_DEPRECATED,
107         ATTRIBUTE_MS_NOALIAS,
108         ATTRIBUTE_MS_LAST = ATTRIBUTE_MS_NOALIAS,
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 #endif