Go to the documentation of this file.
34 #ifndef ABSL_BASE_ATTRIBUTES_H_
35 #define ABSL_BASE_ATTRIBUTES_H_
37 #include "absl/base/config.h"
49 #ifdef __has_attribute
50 #define ABSL_HAVE_ATTRIBUTE(x) __has_attribute(x)
52 #define ABSL_HAVE_ATTRIBUTE(x) 0
61 #if defined(__cplusplus) && defined(__has_cpp_attribute)
64 #define ABSL_HAVE_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
66 #define ABSL_HAVE_CPP_ATTRIBUTE(x) 0
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)))
92 #define ABSL_PRINTF_ATTRIBUTE(string_index, first_to_check)
93 #define ABSL_SCANF_ATTRIBUTE(string_index, first_to_check)
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
105 #define ABSL_ATTRIBUTE_ALWAYS_INLINE
108 #if ABSL_HAVE_ATTRIBUTE(noinline) || (defined(__GNUC__) && !defined(__clang__))
109 #define ABSL_ATTRIBUTE_NOINLINE __attribute__((noinline))
110 #define ABSL_HAVE_ATTRIBUTE_NOINLINE 1
112 #define ABSL_ATTRIBUTE_NOINLINE
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")))
127 #define ABSL_ATTRIBUTE_NO_TAIL_CALL
128 #define ABSL_HAVE_ATTRIBUTE_NO_TAIL_CALL 0
139 #if (ABSL_HAVE_ATTRIBUTE(weak) || \
140 (defined(__GNUC__) && !defined(__clang__))) && \
141 (!defined(_WIN32) || __clang_major__ < 9) && !defined(__MINGW32__)
142 #undef ABSL_ATTRIBUTE_WEAK
143 #define ABSL_ATTRIBUTE_WEAK __attribute__((weak))
144 #define ABSL_HAVE_ATTRIBUTE_WEAK 1
146 #define ABSL_ATTRIBUTE_WEAK
147 #define ABSL_HAVE_ATTRIBUTE_WEAK 0
188 #if ABSL_HAVE_ATTRIBUTE(nonnull) || (defined(__GNUC__) && !defined(__clang__))
189 #define ABSL_ATTRIBUTE_NONNULL(arg_index) __attribute__((nonnull(arg_index)))
191 #define ABSL_ATTRIBUTE_NONNULL(...)
197 #if ABSL_HAVE_ATTRIBUTE(noreturn) || (defined(__GNUC__) && !defined(__clang__))
198 #define ABSL_ATTRIBUTE_NORETURN __attribute__((noreturn))
199 #elif defined(_MSC_VER)
200 #define ABSL_ATTRIBUTE_NORETURN __declspec(noreturn)
202 #define ABSL_ATTRIBUTE_NORETURN
213 #if ABSL_HAVE_ATTRIBUTE(no_sanitize_address)
214 #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
216 #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS
227 #if ABSL_HAVE_ATTRIBUTE(no_sanitize_memory)
228 #define ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
230 #define ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY
238 #if ABSL_HAVE_ATTRIBUTE(no_sanitize_thread)
239 #define ABSL_ATTRIBUTE_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread))
241 #define ABSL_ATTRIBUTE_NO_SANITIZE_THREAD
250 #if ABSL_HAVE_ATTRIBUTE(no_sanitize_undefined)
251 #define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED \
252 __attribute__((no_sanitize_undefined))
253 #elif ABSL_HAVE_ATTRIBUTE(no_sanitize)
254 #define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED \
255 __attribute__((no_sanitize("undefined")))
257 #define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED
264 #if ABSL_HAVE_ATTRIBUTE(no_sanitize)
265 #define ABSL_ATTRIBUTE_NO_SANITIZE_CFI __attribute__((no_sanitize("cfi")))
267 #define ABSL_ATTRIBUTE_NO_SANITIZE_CFI
274 #if ABSL_HAVE_ATTRIBUTE(no_sanitize)
275 #define ABSL_ATTRIBUTE_NO_SANITIZE_SAFESTACK \
276 __attribute__((no_sanitize("safe-stack")))
278 #define ABSL_ATTRIBUTE_NO_SANITIZE_SAFESTACK
284 #if ABSL_HAVE_ATTRIBUTE(returns_nonnull)
285 #define ABSL_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull))
287 #define ABSL_ATTRIBUTE_RETURNS_NONNULL
294 #ifdef ABSL_HAVE_ATTRIBUTE_SECTION
295 #error ABSL_HAVE_ATTRIBUTE_SECTION cannot be directly set
296 #elif (ABSL_HAVE_ATTRIBUTE(section) || \
297 (defined(__GNUC__) && !defined(__clang__))) && \
298 !defined(__APPLE__) && ABSL_HAVE_ATTRIBUTE_WEAK
299 #define ABSL_HAVE_ATTRIBUTE_SECTION 1
309 #ifndef ABSL_ATTRIBUTE_SECTION
310 #define ABSL_ATTRIBUTE_SECTION(name) \
311 __attribute__((section(#name))) __attribute__((noinline))
320 #ifndef ABSL_ATTRIBUTE_SECTION_VARIABLE
321 #define ABSL_ATTRIBUTE_SECTION_VARIABLE(name) __attribute__((section(#name)))
332 #ifndef ABSL_DECLARE_ATTRIBUTE_SECTION_VARS
333 #define ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name) \
334 extern char __start_##name[] ABSL_ATTRIBUTE_WEAK; \
335 extern char __stop_##name[] ABSL_ATTRIBUTE_WEAK
337 #ifndef ABSL_DEFINE_ATTRIBUTE_SECTION_VARS
338 #define ABSL_INIT_ATTRIBUTE_SECTION_VARS(name)
339 #define ABSL_DEFINE_ATTRIBUTE_SECTION_VARS(name)
350 #define ABSL_ATTRIBUTE_SECTION_START(name) \
351 (reinterpret_cast<void *>(__start_##name))
352 #define ABSL_ATTRIBUTE_SECTION_STOP(name) \
353 (reinterpret_cast<void *>(__stop_##name))
355 #else // !ABSL_HAVE_ATTRIBUTE_SECTION
357 #define ABSL_HAVE_ATTRIBUTE_SECTION 0
360 #define ABSL_ATTRIBUTE_SECTION(name)
361 #define ABSL_ATTRIBUTE_SECTION_VARIABLE(name)
362 #define ABSL_INIT_ATTRIBUTE_SECTION_VARS(name)
363 #define ABSL_DEFINE_ATTRIBUTE_SECTION_VARS(name)
364 #define ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name)
365 #define ABSL_ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void *>(0))
366 #define ABSL_ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void *>(0))
368 #endif // ABSL_ATTRIBUTE_SECTION
373 #if ABSL_HAVE_ATTRIBUTE(force_align_arg_pointer) || \
374 (defined(__GNUC__) && !defined(__clang__))
375 #if defined(__i386__)
376 #define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC \
377 __attribute__((force_align_arg_pointer))
378 #define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0)
379 #elif defined(__x86_64__)
380 #define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (1)
381 #define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC
382 #else // !__i386__ && !__x86_64
383 #define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0)
384 #define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC
387 #define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC
388 #define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0)
421 #if ABSL_HAVE_ATTRIBUTE(nodiscard)
422 #define ABSL_MUST_USE_RESULT [[nodiscard]]
423 #elif defined(__clang__) && ABSL_HAVE_ATTRIBUTE(warn_unused_result)
424 #define ABSL_MUST_USE_RESULT __attribute__((warn_unused_result))
426 #define ABSL_MUST_USE_RESULT
439 #if ABSL_HAVE_ATTRIBUTE(hot) || (defined(__GNUC__) && !defined(__clang__))
440 #define ABSL_ATTRIBUTE_HOT __attribute__((hot))
442 #define ABSL_ATTRIBUTE_HOT
445 #if ABSL_HAVE_ATTRIBUTE(cold) || (defined(__GNUC__) && !defined(__clang__))
446 #define ABSL_ATTRIBUTE_COLD __attribute__((cold))
448 #define ABSL_ATTRIBUTE_COLD
487 #if ABSL_HAVE_CPP_ATTRIBUTE(clang::xray_always_instrument) && \
488 !defined(ABSL_NO_XRAY_ATTRIBUTES) && !defined(__ANDROID__)
489 #define ABSL_XRAY_ALWAYS_INSTRUMENT [[clang::xray_always_instrument]]
490 #define ABSL_XRAY_NEVER_INSTRUMENT [[clang::xray_never_instrument]]
491 #if ABSL_HAVE_CPP_ATTRIBUTE(clang::xray_log_args)
492 #define ABSL_XRAY_LOG_ARGS(N) \
493 [[clang::xray_always_instrument, clang::xray_log_args(N)]]
495 #define ABSL_XRAY_LOG_ARGS(N) [[clang::xray_always_instrument]]
498 #define ABSL_XRAY_ALWAYS_INSTRUMENT
499 #define ABSL_XRAY_NEVER_INSTRUMENT
500 #define ABSL_XRAY_LOG_ARGS(N)
511 #if ABSL_HAVE_CPP_ATTRIBUTE(clang::reinitializes)
512 #define ABSL_ATTRIBUTE_REINITIALIZES [[clang::reinitializes]]
514 #define ABSL_ATTRIBUTE_REINITIALIZES
531 #if ABSL_HAVE_ATTRIBUTE(unused) || (defined(__GNUC__) && !defined(__clang__))
532 #undef ABSL_ATTRIBUTE_UNUSED
533 #define ABSL_ATTRIBUTE_UNUSED __attribute__((__unused__))
535 #define ABSL_ATTRIBUTE_UNUSED
542 #if ABSL_HAVE_ATTRIBUTE(tls_model) || (defined(__GNUC__) && !defined(__clang__))
543 #define ABSL_ATTRIBUTE_INITIAL_EXEC __attribute__((tls_model("initial-exec")))
545 #define ABSL_ATTRIBUTE_INITIAL_EXEC
563 #if ABSL_HAVE_ATTRIBUTE(packed) || (defined(__GNUC__) && !defined(__clang__))
564 #define ABSL_ATTRIBUTE_PACKED __attribute__((__packed__))
566 #define ABSL_ATTRIBUTE_PACKED
573 #if ABSL_HAVE_ATTRIBUTE(aligned) || (defined(__GNUC__) && !defined(__clang__))
574 #define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes) __attribute__((aligned(bytes)))
576 #define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes)
611 #ifdef ABSL_FALLTHROUGH_INTENDED
612 #error "ABSL_FALLTHROUGH_INTENDED should not be defined."
613 #elif ABSL_HAVE_CPP_ATTRIBUTE(fallthrough)
614 #define ABSL_FALLTHROUGH_INTENDED [[fallthrough]]
615 #elif ABSL_HAVE_CPP_ATTRIBUTE(clang::fallthrough)
616 #define ABSL_FALLTHROUGH_INTENDED [[clang::fallthrough]]
617 #elif ABSL_HAVE_CPP_ATTRIBUTE(gnu::fallthrough)
618 #define ABSL_FALLTHROUGH_INTENDED [[gnu::fallthrough]]
620 #define ABSL_FALLTHROUGH_INTENDED \
644 #if defined(__clang__) && defined(__cplusplus) && __cplusplus >= 201103L
645 #define ABSL_DEPRECATED(message) __attribute__((deprecated(message)))
648 #ifndef ABSL_DEPRECATED
649 #define ABSL_DEPRECATED(message)
672 #if ABSL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization)
673 #define ABSL_CONST_INIT [[clang::require_constant_initialization]]
675 #define ABSL_CONST_INIT
676 #endif // ABSL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization)
691 #if ABSL_HAVE_CPP_ATTRIBUTE(gnu::pure)
692 #define ABSL_ATTRIBUTE_PURE_FUNCTION [[gnu::pure]]
693 #elif ABSL_HAVE_ATTRIBUTE(pure)
694 #define ABSL_ATTRIBUTE_PURE_FUNCTION __attribute__((pure))
696 #define ABSL_ATTRIBUTE_PURE_FUNCTION
713 #if ABSL_HAVE_CPP_ATTRIBUTE(clang::lifetimebound)
714 #define ABSL_ATTRIBUTE_LIFETIME_BOUND [[clang::lifetimebound]]
715 #elif ABSL_HAVE_ATTRIBUTE(lifetimebound)
716 #define ABSL_ATTRIBUTE_LIFETIME_BOUND __attribute__((lifetimebound))
718 #define ABSL_ATTRIBUTE_LIFETIME_BOUND
721 #endif // ABSL_BASE_ATTRIBUTES_H_
grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:45