48 lines
1.4 KiB
C
48 lines
1.4 KiB
C
#pragma once
|
|
|
|
// These hints may improve code generation, but are optional and can be stubbed.
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
#define __cold gnu::cold
|
|
#define __hot gnu::hot
|
|
#define __used gnu::used
|
|
#define __unused gnu::unused
|
|
#define __format(like, ...) gnu::format(like, __VA_ARGS__)
|
|
#define __likely(x) __builtin_expect(!!(x), 1)
|
|
#define __unlikely(x) __builtin_expect(!!(x), 0)
|
|
#define __always_inline gnu::always_inline
|
|
#else
|
|
#define __cold
|
|
#define __hot
|
|
#define __used
|
|
#define __unused
|
|
#define __format(like, ...)
|
|
#define __likely(x) x
|
|
#define __unlikely(x) x
|
|
#define __always_inline
|
|
#endif
|
|
|
|
// Only clang has these hints, GCC will throw a warning here.
|
|
// They also don't support the C23 attribute format.
|
|
#ifdef __clang__
|
|
#define __user __attribute__((noderef, address_space(1)))
|
|
#define __phys __attribute__((noderef, address_space(2)))
|
|
#else
|
|
#define __user
|
|
#define __phys
|
|
#endif
|
|
|
|
// Attributes that affect data layout. Not optional.
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
#define __weak gnu::weak
|
|
#define __section(x) gnu::section(x)
|
|
#define __aligned(x) gnu::aligned(x)
|
|
#define __packed gnu::packed
|
|
#define __naked gnu::naked
|
|
#define __alias(x) gnu::alias(x)
|
|
#else
|
|
#error "Unsupported compiler!"
|
|
#endif
|
|
|
|
// Intrinsics
|
|
#define __unreachable() __builtin_unreachable()
|