blob: cbf7c26a936c9ec315b0330a3fa8bfebd7d8b09d [file] [log] [blame] [edit]
/*
* 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 */