xref: /aosp_15_r20/external/webrtc/third_party/abseil-cpp/absl/base/attributes.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 // Copyright 2017 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // This header file defines macros for declaring attributes for functions,
16 // types, and variables.
17 //
18 // These macros are used within Abseil and allow the compiler to optimize, where
19 // applicable, certain function calls.
20 //
21 // Most macros here are exposing GCC or Clang features, and are stubbed out for
22 // other compilers.
23 //
24 // GCC attributes documentation:
25 //   https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Function-Attributes.html
26 //   https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Variable-Attributes.html
27 //   https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Type-Attributes.html
28 //
29 // Most attributes in this file are already supported by GCC 4.7. However, some
30 // of them are not supported in older version of Clang. Thus, we check
31 // `__has_attribute()` first. If the check fails, we check if we are on GCC and
32 // assume the attribute exists on GCC (which is verified on GCC 4.7).
33 
34 #ifndef ABSL_BASE_ATTRIBUTES_H_
35 #define ABSL_BASE_ATTRIBUTES_H_
36 
37 #include "absl/base/config.h"
38 
39 // ABSL_HAVE_ATTRIBUTE
40 //
41 // A function-like feature checking macro that is a wrapper around
42 // `__has_attribute`, which is defined by GCC 5+ and Clang and evaluates to a
43 // nonzero constant integer if the attribute is supported or 0 if not.
44 //
45 // It evaluates to zero if `__has_attribute` is not defined by the compiler.
46 //
47 // GCC: https://gcc.gnu.org/gcc-5/changes.html
48 // Clang: https://clang.llvm.org/docs/LanguageExtensions.html
49 #ifdef __has_attribute
50 #define ABSL_HAVE_ATTRIBUTE(x) __has_attribute(x)
51 #else
52 #define ABSL_HAVE_ATTRIBUTE(x) 0
53 #endif
54 
55 // ABSL_HAVE_CPP_ATTRIBUTE
56 //
57 // A function-like feature checking macro that accepts C++11 style attributes.
58 // It's a wrapper around `__has_cpp_attribute`, defined by ISO C++ SD-6
59 // (https://en.cppreference.com/w/cpp/experimental/feature_test). If we don't
60 // find `__has_cpp_attribute`, will evaluate to 0.
61 #if defined(__cplusplus) && defined(__has_cpp_attribute)
62 // NOTE: requiring __cplusplus above should not be necessary, but
63 // works around https://bugs.llvm.org/show_bug.cgi?id=23435.
64 #define ABSL_HAVE_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
65 #else
66 #define ABSL_HAVE_CPP_ATTRIBUTE(x) 0
67 #endif
68 
69 // -----------------------------------------------------------------------------
70 // Function Attributes
71 // -----------------------------------------------------------------------------
72 //
73 // GCC: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
74 // Clang: https://clang.llvm.org/docs/AttributeReference.html
75 
76 // ABSL_PRINTF_ATTRIBUTE
77 // ABSL_SCANF_ATTRIBUTE
78 //
79 // Tells the compiler to perform `printf` format string checking if the
80 // compiler supports it; see the 'format' attribute in
81 // <https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Function-Attributes.html>.
82 //
83 // Note: As the GCC manual states, "[s]ince non-static C++ methods
84 // have an implicit 'this' argument, the arguments of such methods
85 // should be counted from two, not one."
86 #if ABSL_HAVE_ATTRIBUTE(format) || (defined(__GNUC__) && !defined(__clang__))
87 #define ABSL_PRINTF_ATTRIBUTE(string_index, first_to_check) \
88   __attribute__((__format__(__printf__, string_index, first_to_check)))
89 #define ABSL_SCANF_ATTRIBUTE(string_index, first_to_check) \
90   __attribute__((__format__(__scanf__, string_index, first_to_check)))
91 #else
92 #define ABSL_PRINTF_ATTRIBUTE(string_index, first_to_check)
93 #define ABSL_SCANF_ATTRIBUTE(string_index, first_to_check)
94 #endif
95 
96 // ABSL_ATTRIBUTE_ALWAYS_INLINE
97 // ABSL_ATTRIBUTE_NOINLINE
98 //
99 // Forces functions to either inline or not inline. Introduced in gcc 3.1.
100 #if ABSL_HAVE_ATTRIBUTE(always_inline) || \
101     (defined(__GNUC__) && !defined(__clang__))
102 #define ABSL_ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline))
103 #define ABSL_HAVE_ATTRIBUTE_ALWAYS_INLINE 1
104 #else
105 #define ABSL_ATTRIBUTE_ALWAYS_INLINE
106 #endif
107 
108 #if ABSL_HAVE_ATTRIBUTE(noinline) || (defined(__GNUC__) && !defined(__clang__))
109 #define ABSL_ATTRIBUTE_NOINLINE __attribute__((noinline))
110 #define ABSL_HAVE_ATTRIBUTE_NOINLINE 1
111 #else
112 #define ABSL_ATTRIBUTE_NOINLINE
113 #endif
114 
115 // ABSL_ATTRIBUTE_NO_TAIL_CALL
116 //
117 // Prevents the compiler from optimizing away stack frames for functions which
118 // end in a call to another function.
119 #if ABSL_HAVE_ATTRIBUTE(disable_tail_calls)
120 #define ABSL_HAVE_ATTRIBUTE_NO_TAIL_CALL 1
121 #define ABSL_ATTRIBUTE_NO_TAIL_CALL __attribute__((disable_tail_calls))
122 #elif defined(__GNUC__) && !defined(__clang__) && !defined(__e2k__)
123 #define ABSL_HAVE_ATTRIBUTE_NO_TAIL_CALL 1
124 #define ABSL_ATTRIBUTE_NO_TAIL_CALL \
125   __attribute__((optimize("no-optimize-sibling-calls")))
126 #else
127 #define ABSL_ATTRIBUTE_NO_TAIL_CALL
128 #define ABSL_HAVE_ATTRIBUTE_NO_TAIL_CALL 0
129 #endif
130 
131 // ABSL_ATTRIBUTE_WEAK
132 //
133 // Tags a function as weak for the purposes of compilation and linking.
134 // Weak attributes did not work properly in LLVM's Windows backend before
135 // 9.0.0, so disable them there. See https://bugs.llvm.org/show_bug.cgi?id=37598
136 // for further information.
137 // The MinGW compiler doesn't complain about the weak attribute until the link
138 // step, presumably because Windows doesn't use ELF binaries.
139 #if (ABSL_HAVE_ATTRIBUTE(weak) ||                                         \
140      (defined(__GNUC__) && !defined(__clang__))) &&                       \
141     (!defined(_WIN32) || (defined(__clang__) && __clang_major__ >= 9)) && \
142     !defined(__MINGW32__)
143 #undef ABSL_ATTRIBUTE_WEAK
144 #define ABSL_ATTRIBUTE_WEAK __attribute__((weak))
145 #define ABSL_HAVE_ATTRIBUTE_WEAK 1
146 #else
147 #define ABSL_ATTRIBUTE_WEAK
148 #define ABSL_HAVE_ATTRIBUTE_WEAK 0
149 #endif
150 
151 // ABSL_ATTRIBUTE_NONNULL
152 //
153 // Tells the compiler either (a) that a particular function parameter
154 // should be a non-null pointer, or (b) that all pointer arguments should
155 // be non-null.
156 //
157 // Note: As the GCC manual states, "[s]ince non-static C++ methods
158 // have an implicit 'this' argument, the arguments of such methods
159 // should be counted from two, not one."
160 //
161 // Args are indexed starting at 1.
162 //
163 // For non-static class member functions, the implicit `this` argument
164 // is arg 1, and the first explicit argument is arg 2. For static class member
165 // functions, there is no implicit `this`, and the first explicit argument is
166 // arg 1.
167 //
168 // Example:
169 //
170 //   /* arg_a cannot be null, but arg_b can */
171 //   void Function(void* arg_a, void* arg_b) ABSL_ATTRIBUTE_NONNULL(1);
172 //
173 //   class C {
174 //     /* arg_a cannot be null, but arg_b can */
175 //     void Method(void* arg_a, void* arg_b) ABSL_ATTRIBUTE_NONNULL(2);
176 //
177 //     /* arg_a cannot be null, but arg_b can */
178 //     static void StaticMethod(void* arg_a, void* arg_b)
179 //     ABSL_ATTRIBUTE_NONNULL(1);
180 //   };
181 //
182 // If no arguments are provided, then all pointer arguments should be non-null.
183 //
184 //  /* No pointer arguments may be null. */
185 //  void Function(void* arg_a, void* arg_b, int arg_c) ABSL_ATTRIBUTE_NONNULL();
186 //
187 // NOTE: The GCC nonnull attribute actually accepts a list of arguments, but
188 // ABSL_ATTRIBUTE_NONNULL does not.
189 #if ABSL_HAVE_ATTRIBUTE(nonnull) || (defined(__GNUC__) && !defined(__clang__))
190 #define ABSL_ATTRIBUTE_NONNULL(arg_index) __attribute__((nonnull(arg_index)))
191 #else
192 #define ABSL_ATTRIBUTE_NONNULL(...)
193 #endif
194 
195 // ABSL_ATTRIBUTE_NORETURN
196 //
197 // Tells the compiler that a given function never returns.
198 #if ABSL_HAVE_ATTRIBUTE(noreturn) || (defined(__GNUC__) && !defined(__clang__))
199 #define ABSL_ATTRIBUTE_NORETURN __attribute__((noreturn))
200 #elif defined(_MSC_VER)
201 #define ABSL_ATTRIBUTE_NORETURN __declspec(noreturn)
202 #else
203 #define ABSL_ATTRIBUTE_NORETURN
204 #endif
205 
206 // ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS
207 //
208 // Tells the AddressSanitizer (or other memory testing tools) to ignore a given
209 // function. Useful for cases when a function reads random locations on stack,
210 // calls _exit from a cloned subprocess, deliberately accesses buffer
211 // out of bounds or does other scary things with memory.
212 // NOTE: GCC supports AddressSanitizer(asan) since 4.8.
213 // https://gcc.gnu.org/gcc-4.8/changes.html
214 #if ABSL_HAVE_ATTRIBUTE(no_sanitize_address)
215 #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
216 #elif defined(_MSC_VER) && _MSC_VER >= 1928
217 // https://docs.microsoft.com/en-us/cpp/cpp/no-sanitize-address
218 #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __declspec(no_sanitize_address)
219 #else
220 #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS
221 #endif
222 
223 // ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY
224 //
225 // Tells the MemorySanitizer to relax the handling of a given function. All "Use
226 // of uninitialized value" warnings from such functions will be suppressed, and
227 // all values loaded from memory will be considered fully initialized.  This
228 // attribute is similar to the ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS attribute
229 // above, but deals with initialized-ness rather than addressability issues.
230 // NOTE: MemorySanitizer(msan) is supported by Clang but not GCC.
231 #if ABSL_HAVE_ATTRIBUTE(no_sanitize_memory)
232 #define ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
233 #else
234 #define ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY
235 #endif
236 
237 // ABSL_ATTRIBUTE_NO_SANITIZE_THREAD
238 //
239 // Tells the ThreadSanitizer to not instrument a given function.
240 // NOTE: GCC supports ThreadSanitizer(tsan) since 4.8.
241 // https://gcc.gnu.org/gcc-4.8/changes.html
242 #if ABSL_HAVE_ATTRIBUTE(no_sanitize_thread)
243 #define ABSL_ATTRIBUTE_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread))
244 #else
245 #define ABSL_ATTRIBUTE_NO_SANITIZE_THREAD
246 #endif
247 
248 // ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED
249 //
250 // Tells the UndefinedSanitizer to ignore a given function. Useful for cases
251 // where certain behavior (eg. division by zero) is being used intentionally.
252 // NOTE: GCC supports UndefinedBehaviorSanitizer(ubsan) since 4.9.
253 // https://gcc.gnu.org/gcc-4.9/changes.html
254 #if ABSL_HAVE_ATTRIBUTE(no_sanitize_undefined)
255 #define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED \
256   __attribute__((no_sanitize_undefined))
257 #elif ABSL_HAVE_ATTRIBUTE(no_sanitize)
258 #define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED \
259   __attribute__((no_sanitize("undefined")))
260 #else
261 #define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED
262 #endif
263 
264 // ABSL_ATTRIBUTE_NO_SANITIZE_CFI
265 //
266 // Tells the ControlFlowIntegrity sanitizer to not instrument a given function.
267 // See https://clang.llvm.org/docs/ControlFlowIntegrity.html for details.
268 #if ABSL_HAVE_ATTRIBUTE(no_sanitize)
269 #define ABSL_ATTRIBUTE_NO_SANITIZE_CFI __attribute__((no_sanitize("cfi")))
270 #else
271 #define ABSL_ATTRIBUTE_NO_SANITIZE_CFI
272 #endif
273 
274 // ABSL_ATTRIBUTE_NO_SANITIZE_SAFESTACK
275 //
276 // Tells the SafeStack to not instrument a given function.
277 // See https://clang.llvm.org/docs/SafeStack.html for details.
278 #if ABSL_HAVE_ATTRIBUTE(no_sanitize)
279 #define ABSL_ATTRIBUTE_NO_SANITIZE_SAFESTACK \
280   __attribute__((no_sanitize("safe-stack")))
281 #else
282 #define ABSL_ATTRIBUTE_NO_SANITIZE_SAFESTACK
283 #endif
284 
285 // ABSL_ATTRIBUTE_RETURNS_NONNULL
286 //
287 // Tells the compiler that a particular function never returns a null pointer.
288 #if ABSL_HAVE_ATTRIBUTE(returns_nonnull)
289 #define ABSL_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull))
290 #else
291 #define ABSL_ATTRIBUTE_RETURNS_NONNULL
292 #endif
293 
294 // ABSL_HAVE_ATTRIBUTE_SECTION
295 //
296 // Indicates whether labeled sections are supported. Weak symbol support is
297 // a prerequisite. Labeled sections are not supported on Darwin/iOS.
298 #ifdef ABSL_HAVE_ATTRIBUTE_SECTION
299 #error ABSL_HAVE_ATTRIBUTE_SECTION cannot be directly set
300 #elif (ABSL_HAVE_ATTRIBUTE(section) ||                \
301        (defined(__GNUC__) && !defined(__clang__))) && \
302     !defined(__APPLE__) && ABSL_HAVE_ATTRIBUTE_WEAK
303 #define ABSL_HAVE_ATTRIBUTE_SECTION 1
304 
305 // ABSL_ATTRIBUTE_SECTION
306 //
307 // Tells the compiler/linker to put a given function into a section and define
308 // `__start_ ## name` and `__stop_ ## name` symbols to bracket the section.
309 // This functionality is supported by GNU linker.  Any function annotated with
310 // `ABSL_ATTRIBUTE_SECTION` must not be inlined, or it will be placed into
311 // whatever section its caller is placed into.
312 //
313 #ifndef ABSL_ATTRIBUTE_SECTION
314 #define ABSL_ATTRIBUTE_SECTION(name) \
315   __attribute__((section(#name))) __attribute__((noinline))
316 #endif
317 
318 // ABSL_ATTRIBUTE_SECTION_VARIABLE
319 //
320 // Tells the compiler/linker to put a given variable into a section and define
321 // `__start_ ## name` and `__stop_ ## name` symbols to bracket the section.
322 // This functionality is supported by GNU linker.
323 #ifndef ABSL_ATTRIBUTE_SECTION_VARIABLE
324 #ifdef _AIX
325 // __attribute__((section(#name))) on AIX is achived by using the `.csect` psudo
326 // op which includes an additional integer as part of its syntax indcating
327 // alignment. If data fall under different alignments then you might get a
328 // compilation error indicating a `Section type conflict`.
329 #define ABSL_ATTRIBUTE_SECTION_VARIABLE(name)
330 #else
331 #define ABSL_ATTRIBUTE_SECTION_VARIABLE(name) __attribute__((section(#name)))
332 #endif
333 #endif
334 
335 // ABSL_DECLARE_ATTRIBUTE_SECTION_VARS
336 //
337 // A weak section declaration to be used as a global declaration
338 // for ABSL_ATTRIBUTE_SECTION_START|STOP(name) to compile and link
339 // even without functions with ABSL_ATTRIBUTE_SECTION(name).
340 // ABSL_DEFINE_ATTRIBUTE_SECTION should be in the exactly one file; it's
341 // a no-op on ELF but not on Mach-O.
342 //
343 #ifndef ABSL_DECLARE_ATTRIBUTE_SECTION_VARS
344 #define ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name)   \
345   extern char __start_##name[] ABSL_ATTRIBUTE_WEAK; \
346   extern char __stop_##name[] ABSL_ATTRIBUTE_WEAK
347 #endif
348 #ifndef ABSL_DEFINE_ATTRIBUTE_SECTION_VARS
349 #define ABSL_INIT_ATTRIBUTE_SECTION_VARS(name)
350 #define ABSL_DEFINE_ATTRIBUTE_SECTION_VARS(name)
351 #endif
352 
353 // ABSL_ATTRIBUTE_SECTION_START
354 //
355 // Returns `void*` pointers to start/end of a section of code with
356 // functions having ABSL_ATTRIBUTE_SECTION(name).
357 // Returns 0 if no such functions exist.
358 // One must ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name) for this to compile and
359 // link.
360 //
361 #define ABSL_ATTRIBUTE_SECTION_START(name) \
362   (reinterpret_cast<void *>(__start_##name))
363 #define ABSL_ATTRIBUTE_SECTION_STOP(name) \
364   (reinterpret_cast<void *>(__stop_##name))
365 
366 #else  // !ABSL_HAVE_ATTRIBUTE_SECTION
367 
368 #define ABSL_HAVE_ATTRIBUTE_SECTION 0
369 
370 // provide dummy definitions
371 #define ABSL_ATTRIBUTE_SECTION(name)
372 #define ABSL_ATTRIBUTE_SECTION_VARIABLE(name)
373 #define ABSL_INIT_ATTRIBUTE_SECTION_VARS(name)
374 #define ABSL_DEFINE_ATTRIBUTE_SECTION_VARS(name)
375 #define ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name)
376 #define ABSL_ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void *>(0))
377 #define ABSL_ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void *>(0))
378 
379 #endif  // ABSL_ATTRIBUTE_SECTION
380 
381 // ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC
382 //
383 // Support for aligning the stack on 32-bit x86.
384 #if ABSL_HAVE_ATTRIBUTE(force_align_arg_pointer) || \
385     (defined(__GNUC__) && !defined(__clang__))
386 #if defined(__i386__)
387 #define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC \
388   __attribute__((force_align_arg_pointer))
389 #define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0)
390 #elif defined(__x86_64__)
391 #define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (1)
392 #define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC
393 #else  // !__i386__ && !__x86_64
394 #define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0)
395 #define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC
396 #endif  // __i386__
397 #else
398 #define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC
399 #define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0)
400 #endif
401 
402 // ABSL_MUST_USE_RESULT
403 //
404 // Tells the compiler to warn about unused results.
405 //
406 // For code or headers that are assured to only build with C++17 and up, prefer
407 // just using the standard `[[nodiscard]]` directly over this macro.
408 //
409 // When annotating a function, it must appear as the first part of the
410 // declaration or definition. The compiler will warn if the return value from
411 // such a function is unused:
412 //
413 //   ABSL_MUST_USE_RESULT Sprocket* AllocateSprocket();
414 //   AllocateSprocket();  // Triggers a warning.
415 //
416 // When annotating a class, it is equivalent to annotating every function which
417 // returns an instance.
418 //
419 //   class ABSL_MUST_USE_RESULT Sprocket {};
420 //   Sprocket();  // Triggers a warning.
421 //
422 //   Sprocket MakeSprocket();
423 //   MakeSprocket();  // Triggers a warning.
424 //
425 // Note that references and pointers are not instances:
426 //
427 //   Sprocket* SprocketPointer();
428 //   SprocketPointer();  // Does *not* trigger a warning.
429 //
430 // ABSL_MUST_USE_RESULT allows using cast-to-void to suppress the unused result
431 // warning. For that, warn_unused_result is used only for clang but not for gcc.
432 // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425
433 //
434 // Note: past advice was to place the macro after the argument list.
435 //
436 // TODO(b/176172494): Use ABSL_HAVE_CPP_ATTRIBUTE(nodiscard) when all code is
437 // compliant with the stricter [[nodiscard]].
438 #if defined(__clang__) && ABSL_HAVE_ATTRIBUTE(warn_unused_result)
439 #define ABSL_MUST_USE_RESULT __attribute__((warn_unused_result))
440 #else
441 #define ABSL_MUST_USE_RESULT
442 #endif
443 
444 // ABSL_ATTRIBUTE_HOT, ABSL_ATTRIBUTE_COLD
445 //
446 // Tells GCC that a function is hot or cold. GCC can use this information to
447 // improve static analysis, i.e. a conditional branch to a cold function
448 // is likely to be not-taken.
449 // This annotation is used for function declarations.
450 //
451 // Example:
452 //
453 //   int foo() ABSL_ATTRIBUTE_HOT;
454 #if ABSL_HAVE_ATTRIBUTE(hot) || (defined(__GNUC__) && !defined(__clang__))
455 #define ABSL_ATTRIBUTE_HOT __attribute__((hot))
456 #else
457 #define ABSL_ATTRIBUTE_HOT
458 #endif
459 
460 #if ABSL_HAVE_ATTRIBUTE(cold) || (defined(__GNUC__) && !defined(__clang__))
461 #define ABSL_ATTRIBUTE_COLD __attribute__((cold))
462 #else
463 #define ABSL_ATTRIBUTE_COLD
464 #endif
465 
466 // ABSL_XRAY_ALWAYS_INSTRUMENT, ABSL_XRAY_NEVER_INSTRUMENT, ABSL_XRAY_LOG_ARGS
467 //
468 // We define the ABSL_XRAY_ALWAYS_INSTRUMENT and ABSL_XRAY_NEVER_INSTRUMENT
469 // macro used as an attribute to mark functions that must always or never be
470 // instrumented by XRay. Currently, this is only supported in Clang/LLVM.
471 //
472 // For reference on the LLVM XRay instrumentation, see
473 // http://llvm.org/docs/XRay.html.
474 //
475 // A function with the XRAY_ALWAYS_INSTRUMENT macro attribute in its declaration
476 // will always get the XRay instrumentation sleds. These sleds may introduce
477 // some binary size and runtime overhead and must be used sparingly.
478 //
479 // These attributes only take effect when the following conditions are met:
480 //
481 //   * The file/target is built in at least C++11 mode, with a Clang compiler
482 //     that supports XRay attributes.
483 //   * The file/target is built with the -fxray-instrument flag set for the
484 //     Clang/LLVM compiler.
485 //   * The function is defined in the translation unit (the compiler honors the
486 //     attribute in either the definition or the declaration, and must match).
487 //
488 // There are cases when, even when building with XRay instrumentation, users
489 // might want to control specifically which functions are instrumented for a
490 // particular build using special-case lists provided to the compiler. These
491 // special case lists are provided to Clang via the
492 // -fxray-always-instrument=... and -fxray-never-instrument=... flags. The
493 // attributes in source take precedence over these special-case lists.
494 //
495 // To disable the XRay attributes at build-time, users may define
496 // ABSL_NO_XRAY_ATTRIBUTES. Do NOT define ABSL_NO_XRAY_ATTRIBUTES on specific
497 // packages/targets, as this may lead to conflicting definitions of functions at
498 // link-time.
499 //
500 // XRay isn't currently supported on Android:
501 // https://github.com/android/ndk/issues/368
502 #if ABSL_HAVE_CPP_ATTRIBUTE(clang::xray_always_instrument) && \
503     !defined(ABSL_NO_XRAY_ATTRIBUTES) && !defined(__ANDROID__)
504 #define ABSL_XRAY_ALWAYS_INSTRUMENT [[clang::xray_always_instrument]]
505 #define ABSL_XRAY_NEVER_INSTRUMENT [[clang::xray_never_instrument]]
506 #if ABSL_HAVE_CPP_ATTRIBUTE(clang::xray_log_args)
507 #define ABSL_XRAY_LOG_ARGS(N) \
508   [[clang::xray_always_instrument, clang::xray_log_args(N)]]
509 #else
510 #define ABSL_XRAY_LOG_ARGS(N) [[clang::xray_always_instrument]]
511 #endif
512 #else
513 #define ABSL_XRAY_ALWAYS_INSTRUMENT
514 #define ABSL_XRAY_NEVER_INSTRUMENT
515 #define ABSL_XRAY_LOG_ARGS(N)
516 #endif
517 
518 // ABSL_ATTRIBUTE_REINITIALIZES
519 //
520 // Indicates that a member function reinitializes the entire object to a known
521 // state, independent of the previous state of the object.
522 //
523 // The clang-tidy check bugprone-use-after-move allows member functions marked
524 // with this attribute to be called on objects that have been moved from;
525 // without the attribute, this would result in a use-after-move warning.
526 #if ABSL_HAVE_CPP_ATTRIBUTE(clang::reinitializes)
527 #define ABSL_ATTRIBUTE_REINITIALIZES [[clang::reinitializes]]
528 #else
529 #define ABSL_ATTRIBUTE_REINITIALIZES
530 #endif
531 
532 // -----------------------------------------------------------------------------
533 // Variable Attributes
534 // -----------------------------------------------------------------------------
535 
536 // ABSL_ATTRIBUTE_UNUSED
537 //
538 // Prevents the compiler from complaining about variables that appear unused.
539 //
540 // For code or headers that are assured to only build with C++17 and up, prefer
541 // just using the standard '[[maybe_unused]]' directly over this macro.
542 //
543 // Due to differences in positioning requirements between the old, compiler
544 // specific __attribute__ syntax and the now standard [[maybe_unused]], this
545 // macro does not attempt to take advantage of '[[maybe_unused]]'.
546 #if ABSL_HAVE_ATTRIBUTE(unused) || (defined(__GNUC__) && !defined(__clang__))
547 #undef ABSL_ATTRIBUTE_UNUSED
548 #define ABSL_ATTRIBUTE_UNUSED __attribute__((__unused__))
549 #else
550 #define ABSL_ATTRIBUTE_UNUSED
551 #endif
552 
553 // ABSL_ATTRIBUTE_INITIAL_EXEC
554 //
555 // Tells the compiler to use "initial-exec" mode for a thread-local variable.
556 // See http://people.redhat.com/drepper/tls.pdf for the gory details.
557 #if ABSL_HAVE_ATTRIBUTE(tls_model) || (defined(__GNUC__) && !defined(__clang__))
558 #define ABSL_ATTRIBUTE_INITIAL_EXEC __attribute__((tls_model("initial-exec")))
559 #else
560 #define ABSL_ATTRIBUTE_INITIAL_EXEC
561 #endif
562 
563 // ABSL_ATTRIBUTE_PACKED
564 //
565 // Instructs the compiler not to use natural alignment for a tagged data
566 // structure, but instead to reduce its alignment to 1.
567 //
568 // Therefore, DO NOT APPLY THIS ATTRIBUTE TO STRUCTS CONTAINING ATOMICS. Doing
569 // so can cause atomic variables to be mis-aligned and silently violate
570 // atomicity on x86.
571 //
572 // This attribute can either be applied to members of a structure or to a
573 // structure in its entirety. Applying this attribute (judiciously) to a
574 // structure in its entirety to optimize the memory footprint of very
575 // commonly-used structs is fine. Do not apply this attribute to a structure in
576 // its entirety if the purpose is to control the offsets of the members in the
577 // structure. Instead, apply this attribute only to structure members that need
578 // it.
579 //
580 // When applying ABSL_ATTRIBUTE_PACKED only to specific structure members the
581 // natural alignment of structure members not annotated is preserved. Aligned
582 // member accesses are faster than non-aligned member accesses even if the
583 // targeted microprocessor supports non-aligned accesses.
584 #if ABSL_HAVE_ATTRIBUTE(packed) || (defined(__GNUC__) && !defined(__clang__))
585 #define ABSL_ATTRIBUTE_PACKED __attribute__((__packed__))
586 #else
587 #define ABSL_ATTRIBUTE_PACKED
588 #endif
589 
590 // ABSL_ATTRIBUTE_FUNC_ALIGN
591 //
592 // Tells the compiler to align the function start at least to certain
593 // alignment boundary
594 #if ABSL_HAVE_ATTRIBUTE(aligned) || (defined(__GNUC__) && !defined(__clang__))
595 #define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes) __attribute__((aligned(bytes)))
596 #else
597 #define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes)
598 #endif
599 
600 // ABSL_FALLTHROUGH_INTENDED
601 //
602 // Annotates implicit fall-through between switch labels, allowing a case to
603 // indicate intentional fallthrough and turn off warnings about any lack of a
604 // `break` statement. The ABSL_FALLTHROUGH_INTENDED macro should be followed by
605 // a semicolon and can be used in most places where `break` can, provided that
606 // no statements exist between it and the next switch label.
607 //
608 // Example:
609 //
610 //  switch (x) {
611 //    case 40:
612 //    case 41:
613 //      if (truth_is_out_there) {
614 //        ++x;
615 //        ABSL_FALLTHROUGH_INTENDED;  // Use instead of/along with annotations
616 //                                    // in comments
617 //      } else {
618 //        return x;
619 //      }
620 //    case 42:
621 //      ...
622 //
623 // Notes: When supported, GCC and Clang can issue a warning on switch labels
624 // with unannotated fallthrough using the warning `-Wimplicit-fallthrough`. See
625 // clang documentation on language extensions for details:
626 // https://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough
627 //
628 // When used with unsupported compilers, the ABSL_FALLTHROUGH_INTENDED macro has
629 // no effect on diagnostics. In any case this macro has no effect on runtime
630 // behavior and performance of code.
631 
632 #ifdef ABSL_FALLTHROUGH_INTENDED
633 #error "ABSL_FALLTHROUGH_INTENDED should not be defined."
634 #elif ABSL_HAVE_CPP_ATTRIBUTE(fallthrough)
635 #define ABSL_FALLTHROUGH_INTENDED [[fallthrough]]
636 #elif ABSL_HAVE_CPP_ATTRIBUTE(clang::fallthrough)
637 #define ABSL_FALLTHROUGH_INTENDED [[clang::fallthrough]]
638 #elif ABSL_HAVE_CPP_ATTRIBUTE(gnu::fallthrough)
639 #define ABSL_FALLTHROUGH_INTENDED [[gnu::fallthrough]]
640 #else
641 #define ABSL_FALLTHROUGH_INTENDED \
642   do {                            \
643   } while (0)
644 #endif
645 
646 // ABSL_DEPRECATED()
647 //
648 // Marks a deprecated class, struct, enum, function, method and variable
649 // declarations. The macro argument is used as a custom diagnostic message (e.g.
650 // suggestion of a better alternative).
651 //
652 // For code or headers that are assured to only build with C++14 and up, prefer
653 // just using the standard `[[deprecated("message")]]` directly over this macro.
654 //
655 // Examples:
656 //
657 //   class ABSL_DEPRECATED("Use Bar instead") Foo {...};
658 //
659 //   ABSL_DEPRECATED("Use Baz() instead") void Bar() {...}
660 //
661 //   template <typename T>
662 //   ABSL_DEPRECATED("Use DoThat() instead")
663 //   void DoThis();
664 //
665 //   enum FooEnum {
666 //     kBar ABSL_DEPRECATED("Use kBaz instead"),
667 //   };
668 //
669 // Every usage of a deprecated entity will trigger a warning when compiled with
670 // GCC/Clang's `-Wdeprecated-declarations` option. Google's production toolchain
671 // turns this warning off by default, instead relying on clang-tidy to report
672 // new uses of deprecated code.
673 #if ABSL_HAVE_ATTRIBUTE(deprecated)
674 #define ABSL_DEPRECATED(message) __attribute__((deprecated(message)))
675 #else
676 #define ABSL_DEPRECATED(message)
677 #endif
678 
679 // ABSL_CONST_INIT
680 //
681 // A variable declaration annotated with the `ABSL_CONST_INIT` attribute will
682 // not compile (on supported platforms) unless the variable has a constant
683 // initializer. This is useful for variables with static and thread storage
684 // duration, because it guarantees that they will not suffer from the so-called
685 // "static init order fiasco".
686 //
687 // This attribute must be placed on the initializing declaration of the
688 // variable. Some compilers will give a -Wmissing-constinit warning when this
689 // attribute is placed on some other declaration but missing from the
690 // initializing declaration.
691 //
692 // In some cases (notably with thread_local variables), `ABSL_CONST_INIT` can
693 // also be used in a non-initializing declaration to tell the compiler that a
694 // variable is already initialized, reducing overhead that would otherwise be
695 // incurred by a hidden guard variable. Thus annotating all declarations with
696 // this attribute is recommended to potentially enhance optimization.
697 //
698 // Example:
699 //
700 //   class MyClass {
701 //    public:
702 //     ABSL_CONST_INIT static MyType my_var;
703 //   };
704 //
705 //   ABSL_CONST_INIT MyType MyClass::my_var = MakeMyType(...);
706 //
707 // For code or headers that are assured to only build with C++20 and up, prefer
708 // just using the standard `constinit` keyword directly over this macro.
709 //
710 // Note that this attribute is redundant if the variable is declared constexpr.
711 #if defined(__cpp_constinit) && __cpp_constinit >= 201907L
712 #define ABSL_CONST_INIT constinit
713 #elif ABSL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization)
714 #define ABSL_CONST_INIT [[clang::require_constant_initialization]]
715 #else
716 #define ABSL_CONST_INIT
717 #endif
718 
719 // ABSL_ATTRIBUTE_PURE_FUNCTION
720 //
721 // ABSL_ATTRIBUTE_PURE_FUNCTION is used to annotate declarations of "pure"
722 // functions. A function is pure if its return value is only a function of its
723 // arguments. The pure attribute prohibits a function from modifying the state
724 // of the program that is observable by means other than inspecting the
725 // function's return value. Declaring such functions with the pure attribute
726 // allows the compiler to avoid emitting some calls in repeated invocations of
727 // the function with the same argument values.
728 //
729 // Example:
730 //
731 //  ABSL_ATTRIBUTE_PURE_FUNCTION int64_t ToInt64Milliseconds(Duration d);
732 #if ABSL_HAVE_CPP_ATTRIBUTE(gnu::pure)
733 #define ABSL_ATTRIBUTE_PURE_FUNCTION [[gnu::pure]]
734 #elif ABSL_HAVE_ATTRIBUTE(pure)
735 #define ABSL_ATTRIBUTE_PURE_FUNCTION __attribute__((pure))
736 #else
737 #define ABSL_ATTRIBUTE_PURE_FUNCTION
738 #endif
739 
740 // ABSL_ATTRIBUTE_LIFETIME_BOUND indicates that a resource owned by a function
741 // parameter or implicit object parameter is retained by the return value of the
742 // annotated function (or, for a parameter of a constructor, in the value of the
743 // constructed object). This attribute causes warnings to be produced if a
744 // temporary object does not live long enough.
745 //
746 // When applied to a reference parameter, the referenced object is assumed to be
747 // retained by the return value of the function. When applied to a non-reference
748 // parameter (for example, a pointer or a class type), all temporaries
749 // referenced by the parameter are assumed to be retained by the return value of
750 // the function.
751 //
752 // See also the upstream documentation:
753 // https://clang.llvm.org/docs/AttributeReference.html#lifetimebound
754 #if ABSL_HAVE_CPP_ATTRIBUTE(clang::lifetimebound)
755 #define ABSL_ATTRIBUTE_LIFETIME_BOUND [[clang::lifetimebound]]
756 #elif ABSL_HAVE_ATTRIBUTE(lifetimebound)
757 #define ABSL_ATTRIBUTE_LIFETIME_BOUND __attribute__((lifetimebound))
758 #else
759 #define ABSL_ATTRIBUTE_LIFETIME_BOUND
760 #endif
761 
762 // ABSL_ATTRIBUTE_TRIVIAL_ABI
763 // Indicates that a type is "trivially relocatable" -- meaning it can be
764 // relocated without invoking the constructor/destructor, using a form of move
765 // elision.
766 //
767 // From a memory safety point of view, putting aside destructor ordering, it's
768 // safe to apply ABSL_ATTRIBUTE_TRIVIAL_ABI if an object's location
769 // can change over the course of its lifetime: if a constructor can be run one
770 // place, and then the object magically teleports to another place where some
771 // methods are run, and then the object teleports to yet another place where it
772 // is destroyed. This is notably not true for self-referential types, where the
773 // move-constructor must keep the self-reference up to date. If the type changed
774 // location without invoking the move constructor, it would have a dangling
775 // self-reference.
776 //
777 // The use of this teleporting machinery means that the number of paired
778 // move/destroy operations can change, and so it is a bad idea to apply this to
779 // a type meant to count the number of moves.
780 //
781 // Warning: applying this can, rarely, break callers. Objects passed by value
782 // will be destroyed at the end of the call, instead of the end of the
783 // full-expression containing the call. In addition, it changes the ABI
784 // of functions accepting this type by value (e.g. to pass in registers).
785 //
786 // See also the upstream documentation:
787 // https://clang.llvm.org/docs/AttributeReference.html#trivial-abi
788 //
789 #if ABSL_HAVE_CPP_ATTRIBUTE(clang::trivial_abi)
790 #define ABSL_ATTRIBUTE_TRIVIAL_ABI [[clang::trivial_abi]]
791 #define ABSL_HAVE_ATTRIBUTE_TRIVIAL_ABI 1
792 #elif ABSL_HAVE_ATTRIBUTE(trivial_abi)
793 #define ABSL_ATTRIBUTE_TRIVIAL_ABI __attribute__((trivial_abi))
794 #define ABSL_HAVE_ATTRIBUTE_TRIVIAL_ABI 1
795 #else
796 #define ABSL_ATTRIBUTE_TRIVIAL_ABI
797 #endif
798 
799 #endif  // ABSL_BASE_ATTRIBUTES_H_
800