| /* |
| * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) |
| * |
| * SPDX-License-Identifier: BSD-2-Clause |
| */ |
| |
| #pragma once |
| |
| /* macros for compile time attributes */ |
| |
| /* Stub out Clang feature macros for GCC. */ |
| #ifndef __has_attribute |
| #define __has_attribute(attrib) 0 |
| #endif |
| #ifndef __has_extension |
| #define __has_extension(ext) 0 |
| #endif |
| #ifndef __has_feature |
| #define __has_feature(feature) 0 |
| #endif |
| |
| #define ALIAS(sym) __attribute__((alias(#sym))) |
| #define ALIGN(n) __attribute__((__aligned__(n))) |
| #define ALLOC_SIZE(...) __attribute__((alloc_size(__VA_ARGS__))) |
| #define ASSUME_ALIGNED(...) __attribute__((assume_aligned(__VA_ARGS__))) |
| #define NO_INLINE __attribute__((noinline)) |
| #define ALWAYS_INLINE __attribute__((always_inline)) |
| #define CLEANUP(fn) __attribute__((cleanup(fn))) |
| #if (defined(__clang__) && __has_attribute(cold)) || (!defined(__clang__) && defined(__GNUC__)) |
| #define COLD __attribute__((cold)) |
| #else |
| #define COLD /* ignored */ |
| #endif |
| #define DEPRECATED(msg) __attribute__((deprecated(msg))) |
| #if defined(__clang__) && __has_extension(attribute_unavailable_with_message) |
| #define ERROR(msg) __attribute__((unavailable(msg))) |
| #elif defined(__GNUC__) |
| #define ERROR(msg) __attribute__((error(msg))) |
| #else |
| /* No good compile-time error feature. Just emit garbage that will force an unclean error. */ |
| #define ERROR(msg) __COMPILE_TIME_ERROR_SUPPORT_UNAVAILABLE(msg) |
| #endif |
| #if (defined(__clang__) && __has_attribute(hot)) || (!defined(__clang__) && defined(__GNUC__)) |
| #define HOT __attribute__((hot)) |
| #else |
| #define HOT /* ignored */ |
| #endif |
| #define MALLOC __attribute__((malloc)) |
| #define NONNULL(...) __attribute__((__nonnull__(__VA_ARGS__))) |
| #define NONNULL_ALL __attribute__((__nonnull__)) |
| #define NORETURN __attribute__((__noreturn__)) |
| #define PACKED __attribute__((__packed__)) |
| #define FORMAT(archetype, string_index, first_to_check) \ |
| __attribute__((format(archetype, string_index, first_to_check))) |
| #define SECTION(sect) __attribute__((section(sect))) |
| #define SENTINEL(param) __attribute__((sentinel(param))) |
| #define SENTINEL_LAST __attribute__((sentinel)) |
| #define UNUSED __attribute__((__unused__)) |
| #define USED __attribute__((__used__)) |
| #if defined(__clang__) && !__has_attribute(externally_visible) |
| #define VISIBLE /* ignored */ |
| #else |
| #define VISIBLE __attribute__((__externally_visible__)) |
| #endif |
| #define WARNING(msg) __attribute__((warning(msg))) |
| #define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) |
| #define WEAK __attribute__((weak)) |
| #define WEAK_ALIAS(to) __attribute__((weak, alias(#to))) |
| |
| #define CONSTRUCTOR_MIN_PRIORITY 101 |
| #define CONSTRUCTOR_MAX_PRIORITY 65535 |
| #define CONSTRUCTOR(priority) __attribute__((constructor(priority))) |
| |
| /* alloc_align was added to GCC in 4.9 */ |
| #if __has_attribute(alloc_align) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))) |
| #define ALLOC_ALIGN(arg) __attribute__((alloc_align(arg))) |
| #else |
| #define ALLOC_ALIGN(arg) /* ignored */ |
| #endif |
| |
| /* returns_nonnull was added to GCC in 4.9 */ |
| #if __has_attribute(returns_nonnull) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))) |
| #define RETURNS_NONNULL __attribute__((returns_nonnull)) |
| #else |
| #define RETURNS_NONNULL /* ignored */ |
| #endif |
| |
| /* A special case for libsel4 so we can avoid depending on this library. |
| * If any other library is caught doing this it will be immolated. */ |
| #ifndef __LIBSEL4_MACROS_H |
| #define PURE __attribute__((__pure__)) |
| #define CONST __attribute__((__const__)) |
| #endif /* __LIBSEL4_MACROS_H */ |