func_attr.h
Go to the documentation of this file.
1 // If DEFINE_FUNC_ATTRIBUTES macro is not defined then all function attributes
2 // are defined as empty values.
3 //
4 // If DO_NOT_DEFINE_EMPTY_ATTRIBUTES then empty macros are not defined. Thus
5 // undefined DEFINE_FUNC_ATTRIBUTES and defined DO_NOT_DEFINE_EMPTY_ATTRIBUTES
6 // leaves file with untouched FUNC_ATTR_* macros. This variant is used for
7 // scripts/gendeclarations.lua.
8 //
9 // Empty macros are used for *.c files. (undefined DEFINE_FUNC_ATTRIBUTES and
10 // undefined DO_NOT_DEFINE_EMPTY_ATTRIBUTES)
11 //
12 // Macros defined as __attribute__((*)) are used by generated header files.
13 // (defined DEFINE_FUNC_ATTRIBUTES and undefined
14 // DO_NOT_DEFINE_EMPTY_ATTRIBUTES)
15 //
16 // Defined DEFINE_FUNC_ATTRIBUTES and defined DO_NOT_DEFINE_EMPTY_ATTRIBUTES is
17 // not used by anything.
18 
19 // FUNC_ATTR_* macros should be in *.c files for declarations generator. If you
20 // define a function for which declaration is not generated by
21 // gendeclarations.lua (e.g. template hash implementation) then you should use
22 // REAL_FATTR_* macros.
23 
24 // gcc and clang expose their version as follows:
25 //
26 // gcc 4.7.2:
27 // __GNUC__ = 4
28 // __GNUC_MINOR__ = 7
29 // __GNUC_PATCHLEVEL = 2
30 //
31 // clang 3.4 (claims compat with gcc 4.2.1):
32 // __GNUC__ = 4
33 // __GNUC_MINOR__ = 2
34 // __GNUC_PATCHLEVEL = 1
35 // __clang__ = 1
36 // __clang_major__ = 3
37 // __clang_minor__ = 4
38 //
39 // To view the default defines of these compilers, you can perform:
40 //
41 // $ gcc -E -dM - </dev/null
42 // $ echo | clang -dM -E -
43 
44 #include "nvim/macros.h"
45 
46 #ifdef FUNC_ATTR_MALLOC
47 # undef FUNC_ATTR_MALLOC
48 #endif
49 
50 #ifdef FUNC_ATTR_ALLOC_SIZE
51 # undef FUNC_ATTR_ALLOC_SIZE
52 #endif
53 
54 #ifdef FUNC_ATTR_ALLOC_SIZE_PROD
55 # undef FUNC_ATTR_ALLOC_SIZE_PROD
56 #endif
57 
58 #ifdef FUNC_ATTR_ALLOC_ALIGN
59 # undef FUNC_ATTR_ALLOC_ALIGN
60 #endif
61 
62 #ifdef FUNC_ATTR_PURE
63 # undef FUNC_ATTR_PURE
64 #endif
65 
66 #ifdef FUNC_ATTR_CONST
67 # undef FUNC_ATTR_CONST
68 #endif
69 
70 #ifdef FUNC_ATTR_WARN_UNUSED_RESULT
71 # undef FUNC_ATTR_WARN_UNUSED_RESULT
72 #endif
73 
74 #ifdef FUNC_ATTR_ALWAYS_INLINE
75 # undef FUNC_ATTR_ALWAYS_INLINE
76 #endif
77 
78 #ifdef FUNC_ATTR_UNUSED
79 # undef FUNC_ATTR_UNUSED
80 #endif
81 
82 #ifdef FUNC_ATTR_NONNULL_ALL
83 # undef FUNC_ATTR_NONNULL_ALL
84 #endif
85 
86 #ifdef FUNC_ATTR_NONNULL_ARG
87 # undef FUNC_ATTR_NONNULL_ARG
88 #endif
89 
90 #ifdef FUNC_ATTR_NONNULL_RET
91 # undef FUNC_ATTR_NONNULL_RET
92 #endif
93 
94 #ifdef FUNC_ATTR_NORETURN
95 # undef FUNC_ATTR_NORETURN
96 #endif
97 
98 #ifdef FUNC_ATTR_NO_SANITIZE_UNDEFINED
99 # undef FUNC_ATTR_NO_SANITIZE_UNDEFINED
100 #endif
101 
102 #ifdef FUNC_ATTR_PRINTF
103 # undef FUNC_ATTR_PRINTF
104 #endif
105 
106 #ifndef DID_REAL_ATTR
107 # define DID_REAL_ATTR
108 # ifdef __GNUC__
109 // For all gnulikes: gcc, clang, intel.
110 
111 // place these after the argument list of the function declaration
112 // (not definition), like so:
113 // void myfunc(void) REAL_FATTR_ALWAYS_INLINE;
114 # define REAL_FATTR_MALLOC __attribute__((malloc))
115 # define REAL_FATTR_ALLOC_ALIGN(x) __attribute__((alloc_align(x)))
116 # define REAL_FATTR_PURE __attribute__ ((pure))
117 # define REAL_FATTR_CONST __attribute__((const))
118 # define REAL_FATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
119 # define REAL_FATTR_ALWAYS_INLINE __attribute__((always_inline))
120 # define REAL_FATTR_UNUSED __attribute__((unused))
121 # define REAL_FATTR_NONNULL_ALL __attribute__((nonnull))
122 # define REAL_FATTR_NONNULL_ARG(...) __attribute__((nonnull(__VA_ARGS__)))
123 # define REAL_FATTR_NORETURN __attribute__((noreturn))
124 # define REAL_FATTR_PRINTF(x, y) __attribute__((format (printf, x, y)))
125 
126 # if NVIM_HAS_ATTRIBUTE(returns_nonnull)
127 # define REAL_FATTR_NONNULL_RET __attribute__((returns_nonnull))
128 # endif
129 
130 # if NVIM_HAS_ATTRIBUTE(alloc_size)
131 # define REAL_FATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x)))
132 # define REAL_FATTR_ALLOC_SIZE_PROD(x, y) __attribute__((alloc_size(x, y)))
133 # endif
134 
135 # if NVIM_HAS_ATTRIBUTE(no_sanitize_undefined)
136 # define REAL_FATTR_NO_SANITIZE_UNDEFINED \
137  __attribute__((no_sanitize_undefined))
138 # elif NVIM_HAS_ATTRIBUTE(no_sanitize)
139 # define REAL_FATTR_NO_SANITIZE_UNDEFINED \
140  __attribute__((no_sanitize("undefined")))
141 # endif
142 # endif
143 
144 // Define attributes that are not defined for this compiler.
145 
146 # ifndef REAL_FATTR_MALLOC
147 # define REAL_FATTR_MALLOC
148 # endif
149 
150 # ifndef REAL_FATTR_ALLOC_SIZE
151 # define REAL_FATTR_ALLOC_SIZE(x)
152 # endif
153 
154 # ifndef REAL_FATTR_ALLOC_SIZE_PROD
155 # define REAL_FATTR_ALLOC_SIZE_PROD(x, y)
156 # endif
157 
158 # ifndef REAL_FATTR_ALLOC_ALIGN
159 # define REAL_FATTR_ALLOC_ALIGN(x)
160 # endif
161 
162 # ifndef REAL_FATTR_PURE
163 # define REAL_FATTR_PURE
164 # endif
165 
166 # ifndef REAL_FATTR_CONST
167 # define REAL_FATTR_CONST
168 # endif
169 
170 # ifndef REAL_FATTR_WARN_UNUSED_RESULT
171 # define REAL_FATTR_WARN_UNUSED_RESULT
172 # endif
173 
174 # ifndef REAL_FATTR_ALWAYS_INLINE
175 # define REAL_FATTR_ALWAYS_INLINE
176 # endif
177 
178 # ifndef REAL_FATTR_UNUSED
179 # define REAL_FATTR_UNUSED
180 # endif
181 
182 # ifndef REAL_FATTR_NONNULL_ALL
183 # define REAL_FATTR_NONNULL_ALL
184 # endif
185 
186 # ifndef REAL_FATTR_NONNULL_ARG
187 # define REAL_FATTR_NONNULL_ARG(...)
188 # endif
189 
190 # ifndef REAL_FATTR_NONNULL_RET
191 # define REAL_FATTR_NONNULL_RET
192 # endif
193 
194 # ifndef REAL_FATTR_NORETURN
195 # define REAL_FATTR_NORETURN
196 # endif
197 
198 # ifndef REAL_FATTR_NO_SANITIZE_UNDEFINED
199 # define REAL_FATTR_NO_SANITIZE_UNDEFINED
200 # endif
201 
202 # ifndef REAL_FATTR_PRINTF
203 # define REAL_FATTR_PRINTF(x, y)
204 # endif
205 #endif
206 
207 #ifdef DEFINE_FUNC_ATTRIBUTES
208 # define FUNC_API_ASYNC
209 # define FUNC_API_NOEXPORT
210 # define FUNC_API_REMOTE_ONLY
211 # define FUNC_API_SINCE(X)
212 # define FUNC_API_DEPRECATED_SINCE(X)
213 # define FUNC_ATTR_MALLOC REAL_FATTR_MALLOC
214 # define FUNC_ATTR_ALLOC_SIZE(x) REAL_FATTR_ALLOC_SIZE(x)
215 # define FUNC_ATTR_ALLOC_SIZE_PROD(x, y) REAL_FATTR_ALLOC_SIZE_PROD(x, y)
216 # define FUNC_ATTR_ALLOC_ALIGN(x) REAL_FATTR_ALLOC_ALIGN(x)
217 # define FUNC_ATTR_PURE REAL_FATTR_PURE
218 # define FUNC_ATTR_CONST REAL_FATTR_CONST
219 # define FUNC_ATTR_WARN_UNUSED_RESULT REAL_FATTR_WARN_UNUSED_RESULT
220 # define FUNC_ATTR_ALWAYS_INLINE REAL_FATTR_ALWAYS_INLINE
221 # define FUNC_ATTR_UNUSED REAL_FATTR_UNUSED
222 # define FUNC_ATTR_NONNULL_ALL REAL_FATTR_NONNULL_ALL
223 # define FUNC_ATTR_NONNULL_ARG(...) REAL_FATTR_NONNULL_ARG(__VA_ARGS__)
224 # define FUNC_ATTR_NONNULL_RET REAL_FATTR_NONNULL_RET
225 # define FUNC_ATTR_NORETURN REAL_FATTR_NORETURN
226 # define FUNC_ATTR_NO_SANITIZE_UNDEFINED REAL_FATTR_NO_SANITIZE_UNDEFINED
227 # define FUNC_ATTR_PRINTF(x, y) REAL_FATTR_PRINTF(x, y)
228 #elif !defined(DO_NOT_DEFINE_EMPTY_ATTRIBUTES)
229 # define FUNC_ATTR_MALLOC
230 # define FUNC_ATTR_ALLOC_SIZE(x)
231 # define FUNC_ATTR_ALLOC_SIZE_PROD(x, y)
232 # define FUNC_ATTR_ALLOC_ALIGN(x)
233 # define FUNC_ATTR_PURE
234 # define FUNC_ATTR_CONST
235 # define FUNC_ATTR_WARN_UNUSED_RESULT
236 # define FUNC_ATTR_ALWAYS_INLINE
237 # define FUNC_ATTR_UNUSED
238 # define FUNC_ATTR_NONNULL_ALL
239 # define FUNC_ATTR_NONNULL_ARG(...)
240 # define FUNC_ATTR_NONNULL_RET
241 # define FUNC_ATTR_NORETURN
242 # define FUNC_ATTR_NO_SANITIZE_UNDEFINED
243 # define FUNC_ATTR_PRINTF(x, y)
244 #endif