parser: Remove the unused attribute alignment from struct declaration_specifiers_t.
[cparser] / attribute_t.h
1 /*
2  * This file is part of cparser.
3  * Copyright (C) 2012 Matthias Braun <matze@braunis.de>
4  */
5 #ifndef ATTRIBUTE_T_H
6 #define ATTRIBUTE_T_H
7
8 #include "attribute.h"
9 #include "ast.h"
10 #include "symbol.h"
11
12 /**
13  * GNU attributes.
14  */
15 typedef enum attribute_kind_t {
16         ATTRIBUTE_ERROR,
17         ATTRIBUTE_UNKNOWN,
18         ATTRIBUTE_GNU_FIRST,
19         ATTRIBUTE_GNU_ALIAS = ATTRIBUTE_GNU_FIRST,
20         ATTRIBUTE_GNU_ALIGNED,
21         ATTRIBUTE_GNU_ALWAYS_INLINE,
22         ATTRIBUTE_GNU_ASM,
23         ATTRIBUTE_GNU_CDECL,
24         ATTRIBUTE_GNU_COMMON,
25         ATTRIBUTE_GNU_CONST,
26         ATTRIBUTE_GNU_CONSTRUCTOR,
27         ATTRIBUTE_GNU_DEPRECATED,
28         ATTRIBUTE_GNU_DESTRUCTOR,
29         ATTRIBUTE_GNU_DLLEXPORT,
30         ATTRIBUTE_GNU_DLLIMPORT,
31         ATTRIBUTE_GNU_EIGTHBIT_DATA,
32         ATTRIBUTE_GNU_EXTERNALLY_VISIBLE,
33         ATTRIBUTE_GNU_FAR,
34         ATTRIBUTE_GNU_FASTCALL,
35         ATTRIBUTE_GNU_FLATTEN,
36         ATTRIBUTE_GNU_FORMAT,
37         ATTRIBUTE_GNU_FORMAT_ARG,
38         ATTRIBUTE_GNU_FUNCTION_VECTOR,
39         ATTRIBUTE_GNU_GCC_STRUCT,
40         ATTRIBUTE_GNU_INTERRUPT,
41         ATTRIBUTE_GNU_INTERRUPT_HANDLER,
42         ATTRIBUTE_GNU_LEAF,
43         ATTRIBUTE_GNU_LONGCALL,
44         ATTRIBUTE_GNU_LONG_CALL,
45         ATTRIBUTE_GNU_MALLOC,
46         ATTRIBUTE_GNU_MAY_ALIAS,
47         ATTRIBUTE_GNU_MODE,
48         ATTRIBUTE_GNU_MODEL,
49         ATTRIBUTE_GNU_MS_STRUCT,
50         ATTRIBUTE_GNU_NAKED,
51         ATTRIBUTE_GNU_NEAR,
52         ATTRIBUTE_GNU_NESTING,
53         ATTRIBUTE_GNU_NMI_HANDLER,
54         ATTRIBUTE_GNU_NOCOMMON,
55         ATTRIBUTE_GNU_NOINLINE,
56         ATTRIBUTE_GNU_NO_INSTRUMENT_FUNCTION,
57         ATTRIBUTE_GNU_NONNULL,
58         ATTRIBUTE_GNU_NORETURN,
59         ATTRIBUTE_GNU_NOTHROW,
60         ATTRIBUTE_GNU_NOTSHARED,
61         ATTRIBUTE_GNU_PACKED,
62         ATTRIBUTE_GNU_PURE,
63         ATTRIBUTE_GNU_REGPARM,
64         ATTRIBUTE_GNU_RETURNS_TWICE,
65         ATTRIBUTE_GNU_RETURN_TWICE,
66         ATTRIBUTE_GNU_SAVEALL,
67         ATTRIBUTE_GNU_SECTION,
68         ATTRIBUTE_GNU_SENTINEL,
69         ATTRIBUTE_GNU_SHARED,
70         ATTRIBUTE_GNU_SHORTCALL,
71         ATTRIBUTE_GNU_SHORT_CALL,
72         ATTRIBUTE_GNU_SIGNAL,
73         ATTRIBUTE_GNU_SP_SWITCH,
74         ATTRIBUTE_GNU_SSEREGPARM,
75         ATTRIBUTE_GNU_STDCALL,
76         ATTRIBUTE_GNU_TINY_DATA,
77         ATTRIBUTE_GNU_TLS_MODEL,
78         ATTRIBUTE_GNU_TRANSPARENT_UNION,
79         ATTRIBUTE_GNU_TRAP_EXIT,
80         ATTRIBUTE_GNU_UNUSED,
81         ATTRIBUTE_GNU_USED,
82         ATTRIBUTE_GNU_VISIBILITY,
83         ATTRIBUTE_GNU_VOLATILE,
84         ATTRIBUTE_GNU_WARN_UNUSED_RESULT,
85         ATTRIBUTE_GNU_WEAK,
86         ATTRIBUTE_GNU_WEAKREF,
87         ATTRIBUTE_GNU_LAST = ATTRIBUTE_GNU_WEAKREF,
88         ATTRIBUTE_MS_FIRST,
89         ATTRIBUTE_MS_ALIGN = ATTRIBUTE_MS_FIRST,
90         ATTRIBUTE_MS_ALLOCATE,
91         ATTRIBUTE_MS_BASED,
92         ATTRIBUTE_MS_CDECL,
93         ATTRIBUTE_MS_DEPRECATED,
94         ATTRIBUTE_MS_DLLEXPORT,
95         ATTRIBUTE_MS_DLLIMPORT,
96         ATTRIBUTE_MS_FASTCALL,
97         ATTRIBUTE_MS_FORCEINLINE,
98         ATTRIBUTE_MS_NAKED,
99         ATTRIBUTE_MS_NOALIAS,
100         ATTRIBUTE_MS_NOINLINE,
101         ATTRIBUTE_MS_NORETURN,
102         ATTRIBUTE_MS_NOTHROW,
103         ATTRIBUTE_MS_NOVTABLE,
104         ATTRIBUTE_MS_PROPERTY,
105         ATTRIBUTE_MS_RESTRICT,
106         ATTRIBUTE_MS_RETURNS_TWICE,
107         ATTRIBUTE_MS_SELECTANY,
108         ATTRIBUTE_MS_STDCALL,
109         ATTRIBUTE_MS_THISCALL,
110         ATTRIBUTE_MS_THREAD,
111         ATTRIBUTE_MS_UUID,
112         ATTRIBUTE_MS_LAST = ATTRIBUTE_MS_UUID,
113         ATTRIBUTE_LAST = ATTRIBUTE_MS_LAST
114 } attribute_kind_t;
115
116 typedef enum attribute_argument_kind_t {
117         ATTRIBUTE_ARGUMENT_SYMBOL,
118         ATTRIBUTE_ARGUMENT_EXPRESSION
119 } attribute_argument_kind_t;
120
121 /** this argument type should be fine for 99% of the arguments */
122 typedef struct attribute_argument_t attribute_argument_t;
123 struct attribute_argument_t {
124         attribute_argument_t      *next;
125         attribute_argument_kind_t  kind;
126         union {
127                 symbol_t     *symbol;
128                 expression_t *expression;
129         } v;
130 };
131
132 typedef struct attribute_property_argument_t attribute_property_argument_t;
133 struct attribute_property_argument_t {
134         symbol_t *put_symbol;
135         symbol_t *get_symbol;
136 };
137
138 struct attribute_t {
139         position_t        pos;
140         attribute_t      *next;
141         attribute_kind_t  kind;         /**< The kind of the GNU attribute. */
142         union {
143                 attribute_argument_t          *arguments;
144                 attribute_property_argument_t *property;
145         } a;
146 };
147
148 const char *get_attribute_name(attribute_kind_t kind);
149
150 bool attributes_equal(const attribute_t *attr1, const attribute_t *attr2);
151
152 #endif