type: Add missing space for printing complex types.
[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_LEAF,
40         ATTRIBUTE_GNU_LONGCALL,
41         ATTRIBUTE_GNU_LONG_CALL,
42         ATTRIBUTE_GNU_MALLOC,
43         ATTRIBUTE_GNU_MAY_ALIAS,
44         ATTRIBUTE_GNU_MODE,
45         ATTRIBUTE_GNU_MODEL,
46         ATTRIBUTE_GNU_MS_STRUCT,
47         ATTRIBUTE_GNU_NAKED,
48         ATTRIBUTE_GNU_NEAR,
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,
58         ATTRIBUTE_GNU_PACKED,
59         ATTRIBUTE_GNU_PURE,
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,
66         ATTRIBUTE_GNU_SHARED,
67         ATTRIBUTE_GNU_SHORTCALL,
68         ATTRIBUTE_GNU_SHORT_CALL,
69         ATTRIBUTE_GNU_SIGNAL,
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,
77         ATTRIBUTE_GNU_UNUSED,
78         ATTRIBUTE_GNU_USED,
79         ATTRIBUTE_GNU_VISIBILITY,
80         ATTRIBUTE_GNU_VOLATILE,
81         ATTRIBUTE_GNU_WARN_UNUSED_RESULT,
82         ATTRIBUTE_GNU_WEAK,
83         ATTRIBUTE_GNU_WEAKREF,
84         ATTRIBUTE_GNU_LAST = ATTRIBUTE_GNU_WEAKREF,
85         ATTRIBUTE_MS_FIRST,
86         ATTRIBUTE_MS_ALIGN = ATTRIBUTE_MS_FIRST,
87         ATTRIBUTE_MS_ALLOCATE,
88         ATTRIBUTE_MS_BASED,
89         ATTRIBUTE_MS_CDECL,
90         ATTRIBUTE_MS_DEPRECATED,
91         ATTRIBUTE_MS_DLLEXPORT,
92         ATTRIBUTE_MS_DLLIMPORT,
93         ATTRIBUTE_MS_FASTCALL,
94         ATTRIBUTE_MS_FORCEINLINE,
95         ATTRIBUTE_MS_NAKED,
96         ATTRIBUTE_MS_NOALIAS,
97         ATTRIBUTE_MS_NOINLINE,
98         ATTRIBUTE_MS_NORETURN,
99         ATTRIBUTE_MS_NOTHROW,
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,
107         ATTRIBUTE_MS_THREAD,
108         ATTRIBUTE_MS_UUID,
109         ATTRIBUTE_MS_LAST = ATTRIBUTE_MS_UUID,
110         ATTRIBUTE_LAST = ATTRIBUTE_MS_LAST
111 } attribute_kind_t;
112
113 typedef enum attribute_argument_kind_t {
114         ATTRIBUTE_ARGUMENT_SYMBOL,
115         ATTRIBUTE_ARGUMENT_EXPRESSION
116 } attribute_argument_kind_t;
117
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;
123         union {
124                 symbol_t     *symbol;
125                 expression_t *expression;
126         } v;
127 };
128
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;
133 };
134
135 struct attribute_t {
136         position_t        pos;
137         attribute_t      *next;
138         attribute_kind_t  kind;         /**< The kind of the GNU attribute. */
139         union {
140                 attribute_argument_t          *arguments;
141                 attribute_property_argument_t *property;
142         } a;
143 };
144
145 const char *get_attribute_name(attribute_kind_t kind);
146
147 bool attributes_equal(const attribute_t *attr1, const attribute_t *attr2);
148
149 #endif