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