diff options
Diffstat (limited to 'gl/attribute.h')
-rw-r--r-- | gl/attribute.h | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/gl/attribute.h b/gl/attribute.h new file mode 100644 index 0000000..130644d --- /dev/null +++ b/gl/attribute.h | |||
@@ -0,0 +1,226 @@ | |||
1 | /* ATTRIBUTE_* macros for using attributes in GCC and similar compilers | ||
2 | |||
3 | Copyright 2020-2023 Free Software Foundation, Inc. | ||
4 | |||
5 | This file is free software: you can redistribute it and/or modify | ||
6 | it under the terms of the GNU Lesser General Public License as | ||
7 | published by the Free Software Foundation; either version 2.1 of the | ||
8 | License, or (at your option) any later version. | ||
9 | |||
10 | This file is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public License | ||
16 | along with this program. If not, see <https://www.gnu.org/licenses/>. */ | ||
17 | |||
18 | /* Written by Paul Eggert. */ | ||
19 | |||
20 | /* Provide public ATTRIBUTE_* names for the private _GL_ATTRIBUTE_* | ||
21 | macros used within Gnulib. */ | ||
22 | |||
23 | /* These attributes can be placed in two ways: | ||
24 | - At the start of a declaration (i.e. even before storage-class | ||
25 | specifiers!); then they apply to all entities that are declared | ||
26 | by the declaration. | ||
27 | - Immediately after the name of an entity being declared by the | ||
28 | declaration; then they apply to that entity only. */ | ||
29 | |||
30 | #ifndef _GL_ATTRIBUTE_H | ||
31 | #define _GL_ATTRIBUTE_H | ||
32 | |||
33 | |||
34 | /* This file defines two types of attributes: | ||
35 | * C23 standard attributes. These have macro names that do not begin with | ||
36 | 'ATTRIBUTE_'. | ||
37 | * Selected GCC attributes; see: | ||
38 | https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html | ||
39 | https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html | ||
40 | https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html | ||
41 | These names begin with 'ATTRIBUTE_' to avoid name clashes. */ | ||
42 | |||
43 | |||
44 | /* =============== Attributes for specific kinds of functions =============== */ | ||
45 | |||
46 | /* Attributes for functions that should not be used. */ | ||
47 | |||
48 | /* Warn if the entity is used. */ | ||
49 | /* Applies to: | ||
50 | - function, variable, | ||
51 | - struct, union, struct/union member, | ||
52 | - enumeration, enumeration item, | ||
53 | - typedef, | ||
54 | in C++ also: namespace, class, template specialization. */ | ||
55 | #define DEPRECATED _GL_ATTRIBUTE_DEPRECATED | ||
56 | |||
57 | /* If a function call is not optimized way, warn with MSG. */ | ||
58 | /* Applies to: functions. */ | ||
59 | #define ATTRIBUTE_WARNING(msg) _GL_ATTRIBUTE_WARNING (msg) | ||
60 | |||
61 | /* If a function call is not optimized way, report an error with MSG. */ | ||
62 | /* Applies to: functions. */ | ||
63 | #define ATTRIBUTE_ERROR(msg) _GL_ATTRIBUTE_ERROR (msg) | ||
64 | |||
65 | |||
66 | /* Attributes for memory-allocating functions. */ | ||
67 | |||
68 | /* The function returns a pointer to freshly allocated memory. */ | ||
69 | /* Applies to: functions. */ | ||
70 | #define ATTRIBUTE_MALLOC _GL_ATTRIBUTE_MALLOC | ||
71 | |||
72 | /* ATTRIBUTE_ALLOC_SIZE ((N)) - The Nth argument of the function | ||
73 | is the size of the returned memory block. | ||
74 | ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments | ||
75 | to determine the size of the returned memory block. */ | ||
76 | /* Applies to: function, pointer to function, function types. */ | ||
77 | #define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args) | ||
78 | |||
79 | /* ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers | ||
80 | that can be freed by passing them as the Ith argument to the | ||
81 | function F. | ||
82 | ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that | ||
83 | can be freed via 'free'; it can be used only after declaring 'free'. */ | ||
84 | /* Applies to: functions. Cannot be used on inline functions. */ | ||
85 | #define ATTRIBUTE_DEALLOC(f, i) _GL_ATTRIBUTE_DEALLOC(f, i) | ||
86 | #define ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC_FREE | ||
87 | |||
88 | /* Attributes for variadic functions. */ | ||
89 | |||
90 | /* The variadic function expects a trailing NULL argument. | ||
91 | ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99). | ||
92 | ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */ | ||
93 | /* Applies to: functions. */ | ||
94 | #define ATTRIBUTE_SENTINEL(pos) _GL_ATTRIBUTE_SENTINEL (pos) | ||
95 | |||
96 | |||
97 | /* ================== Attributes for compiler diagnostics ================== */ | ||
98 | |||
99 | /* Attributes that help the compiler diagnose programmer mistakes. | ||
100 | Some of them may also help for some compiler optimizations. */ | ||
101 | |||
102 | /* ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) - | ||
103 | The STRING-INDEXth function argument is a format string of style | ||
104 | ARCHETYPE, which is one of: | ||
105 | printf, gnu_printf | ||
106 | scanf, gnu_scanf, | ||
107 | strftime, gnu_strftime, | ||
108 | strfmon, | ||
109 | or the same thing prefixed and suffixed with '__'. | ||
110 | If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK | ||
111 | are suitable for the format string. */ | ||
112 | /* Applies to: functions. */ | ||
113 | #define ATTRIBUTE_FORMAT(spec) _GL_ATTRIBUTE_FORMAT (spec) | ||
114 | |||
115 | /* ATTRIBUTE_NONNULL ((N1, N2,...)) - Arguments N1, N2,... must not be NULL. | ||
116 | ATTRIBUTE_NONNULL () - All pointer arguments must not be null. */ | ||
117 | /* Applies to: functions. */ | ||
118 | #define ATTRIBUTE_NONNULL(args) _GL_ATTRIBUTE_NONNULL (args) | ||
119 | |||
120 | /* The function's return value is a non-NULL pointer. */ | ||
121 | /* Applies to: functions. */ | ||
122 | #define ATTRIBUTE_RETURNS_NONNULL _GL_ATTRIBUTE_RETURNS_NONNULL | ||
123 | |||
124 | /* Warn if the caller does not use the return value, | ||
125 | unless the caller uses something like ignore_value. */ | ||
126 | /* Applies to: function, enumeration, class. */ | ||
127 | #define NODISCARD _GL_ATTRIBUTE_NODISCARD | ||
128 | |||
129 | |||
130 | /* Attributes that disable false alarms when the compiler diagnoses | ||
131 | programmer "mistakes". */ | ||
132 | |||
133 | /* Do not warn if the entity is not used. */ | ||
134 | /* Applies to: | ||
135 | - function, variable, | ||
136 | - struct, union, struct/union member, | ||
137 | - enumeration, enumeration item, | ||
138 | - typedef, | ||
139 | in C++ also: class. */ | ||
140 | #define MAYBE_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED | ||
141 | |||
142 | /* The contents of a character array is not meant to be NUL-terminated. */ | ||
143 | /* Applies to: struct/union members and variables that are arrays of element | ||
144 | type '[[un]signed] char'. */ | ||
145 | #define ATTRIBUTE_NONSTRING _GL_ATTRIBUTE_NONSTRING | ||
146 | |||
147 | /* Do not warn if control flow falls through to the immediately | ||
148 | following 'case' or 'default' label. */ | ||
149 | /* Applies to: Empty statement (;), inside a 'switch' statement. */ | ||
150 | #define FALLTHROUGH _GL_ATTRIBUTE_FALLTHROUGH | ||
151 | |||
152 | |||
153 | /* ================== Attributes for debugging information ================== */ | ||
154 | |||
155 | /* Attributes regarding debugging information emitted by the compiler. */ | ||
156 | |||
157 | /* Omit the function from stack traces when debugging. */ | ||
158 | /* Applies to: function. */ | ||
159 | #define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL | ||
160 | |||
161 | /* Make the entity visible to debuggers etc., even with '-fwhole-program'. */ | ||
162 | /* Applies to: functions, variables. */ | ||
163 | #define ATTRIBUTE_EXTERNALLY_VISIBLE _GL_ATTRIBUTE_EXTERNALLY_VISIBLE | ||
164 | |||
165 | |||
166 | /* ========== Attributes that mainly direct compiler optimizations ========== */ | ||
167 | |||
168 | /* The function does not throw exceptions. */ | ||
169 | /* Applies to: functions. */ | ||
170 | #define ATTRIBUTE_NOTHROW _GL_ATTRIBUTE_NOTHROW | ||
171 | |||
172 | /* Do not inline the function. */ | ||
173 | /* Applies to: functions. */ | ||
174 | #define ATTRIBUTE_NOINLINE _GL_ATTRIBUTE_NOINLINE | ||
175 | |||
176 | /* Always inline the function, and report an error if the compiler | ||
177 | cannot inline. */ | ||
178 | /* Applies to: function. */ | ||
179 | #define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE | ||
180 | |||
181 | /* It is OK for a compiler to omit duplicate calls with the same arguments. | ||
182 | This attribute is safe for a function that neither depends on | ||
183 | nor affects observable state, and always returns exactly once - | ||
184 | e.g., does not loop forever, and does not call longjmp. | ||
185 | (This attribute is stricter than ATTRIBUTE_PURE.) */ | ||
186 | /* Applies to: functions. */ | ||
187 | #define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST | ||
188 | |||
189 | /* It is OK for a compiler to omit duplicate calls with the same | ||
190 | arguments if observable state is not changed between calls. | ||
191 | This attribute is safe for a function that does not affect | ||
192 | observable state, and always returns exactly once. | ||
193 | (This attribute is looser than ATTRIBUTE_CONST.) */ | ||
194 | /* Applies to: functions. */ | ||
195 | #define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE | ||
196 | |||
197 | /* The function is rarely executed. */ | ||
198 | /* Applies to: functions. */ | ||
199 | #define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD | ||
200 | |||
201 | /* If called from some other compilation unit, the function executes | ||
202 | code from that unit only by return or by exception handling, | ||
203 | letting the compiler optimize that unit more aggressively. */ | ||
204 | /* Applies to: functions. */ | ||
205 | #define ATTRIBUTE_LEAF _GL_ATTRIBUTE_LEAF | ||
206 | |||
207 | /* For struct members: The member has the smallest possible alignment. | ||
208 | For struct, union, class: All members have the smallest possible alignment, | ||
209 | minimizing the memory required. */ | ||
210 | /* Applies to: struct members, struct, union, | ||
211 | in C++ also: class. */ | ||
212 | #define ATTRIBUTE_PACKED _GL_ATTRIBUTE_PACKED | ||
213 | |||
214 | |||
215 | /* ================ Attributes that make invalid code valid ================ */ | ||
216 | |||
217 | /* Attributes that prevent fatal compiler optimizations for code that is not | ||
218 | fully ISO C compliant. */ | ||
219 | |||
220 | /* Pointers to the type may point to the same storage as pointers to | ||
221 | other types, thus disabling strict aliasing optimization. */ | ||
222 | /* Applies to: types. */ | ||
223 | #define ATTRIBUTE_MAY_ALIAS _GL_ATTRIBUTE_MAY_ALIAS | ||
224 | |||
225 | |||
226 | #endif /* _GL_ATTRIBUTE_H */ | ||