Neovim Home
src
nvim
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_FAST
210
# define FUNC_API_NOEXPORT
212
# define FUNC_API_REMOTE_ONLY
214
# define FUNC_API_LUA_ONLY
216
# define FUNC_API_CHECK_TEXTLOCK
218
# define FUNC_API_SINCE(X)
220
# define FUNC_API_DEPRECATED_SINCE(X)
222
# define FUNC_ATTR_MALLOC REAL_FATTR_MALLOC
223
# define FUNC_ATTR_ALLOC_SIZE(x) REAL_FATTR_ALLOC_SIZE(x)
224
# define FUNC_ATTR_ALLOC_SIZE_PROD(x, y) REAL_FATTR_ALLOC_SIZE_PROD(x, y)
225
# define FUNC_ATTR_ALLOC_ALIGN(x) REAL_FATTR_ALLOC_ALIGN(x)
226
# define FUNC_ATTR_PURE REAL_FATTR_PURE
227
# define FUNC_ATTR_CONST REAL_FATTR_CONST
228
# define FUNC_ATTR_WARN_UNUSED_RESULT REAL_FATTR_WARN_UNUSED_RESULT
229
# define FUNC_ATTR_ALWAYS_INLINE REAL_FATTR_ALWAYS_INLINE
230
# define FUNC_ATTR_UNUSED REAL_FATTR_UNUSED
231
# define FUNC_ATTR_NONNULL_ALL REAL_FATTR_NONNULL_ALL
232
# define FUNC_ATTR_NONNULL_ARG(...) REAL_FATTR_NONNULL_ARG(__VA_ARGS__)
233
# define FUNC_ATTR_NONNULL_RET REAL_FATTR_NONNULL_RET
234
# define FUNC_ATTR_NORETURN REAL_FATTR_NORETURN
235
# define FUNC_ATTR_NO_SANITIZE_UNDEFINED REAL_FATTR_NO_SANITIZE_UNDEFINED
236
# define FUNC_ATTR_PRINTF(x, y) REAL_FATTR_PRINTF(x, y)
237
#elif !defined(DO_NOT_DEFINE_EMPTY_ATTRIBUTES)
238
# define FUNC_ATTR_MALLOC
239
# define FUNC_ATTR_ALLOC_SIZE(x)
240
# define FUNC_ATTR_ALLOC_SIZE_PROD(x, y)
241
# define FUNC_ATTR_ALLOC_ALIGN(x)
242
# define FUNC_ATTR_PURE
243
# define FUNC_ATTR_CONST
244
# define FUNC_ATTR_WARN_UNUSED_RESULT
245
# define FUNC_ATTR_ALWAYS_INLINE
246
# define FUNC_ATTR_UNUSED
247
# define FUNC_ATTR_NONNULL_ALL
248
# define FUNC_ATTR_NONNULL_ARG(...)
249
# define FUNC_ATTR_NONNULL_RET
250
# define FUNC_ATTR_NORETURN
251
# define FUNC_ATTR_NO_SANITIZE_UNDEFINED
252
# define FUNC_ATTR_PRINTF(x, y)
253
#endif
macros.h