18#ifndef __L4_COMPILER_H__
19#define __L4_COMPILER_H__
21#if !defined(__ASSEMBLY__) && !defined(__ASSEMBLER__)
37# define L4_INLINE_STATIC static __inline__
38# define L4_INLINE_EXTERN extern __inline__
39# ifdef __GNUC_STDC_INLINE__
40# define L4_INLINE L4_INLINE_STATIC
42# define L4_INLINE L4_INLINE_EXTERN
45# define L4_INLINE static
48# define L4_INLINE inline
51# define L4_INLINE inline
58#define L4_ALWAYS_INLINE L4_INLINE __attribute__((__always_inline__))
61#define L4_DECLARE_CONSTRUCTOR(func, prio) \
62 static inline __attribute__((constructor(prio))) void func ## _ctor_func(void) { func(); }
148# define L4_NOTHROW__A __attribute__((nothrow))
150# ifndef __BEGIN_DECLS
151# define __BEGIN_DECLS
156# define L4_BEGIN_DECLS
158# define L4_DEFAULT_PARAM(x)
160# if __cplusplus >= 201103L
161# define L4_NOTHROW noexcept
163# define L4_NOTHROW throw()
165# define L4_BEGIN_DECLS extern "C" {
166# define L4_END_DECLS }
167# if !defined __BEGIN_DECLS || defined DOXYGEN
168# define __BEGIN_DECLS extern "C" {
170# if !defined __END_DECLS || defined DOXYGEN
171# define __END_DECLS }
173# define L4_DEFAULT_PARAM(x) = x
178#define EXTERN_C DO_NOT_USE_EXTERN_C_ANY_MORE
180#ifndef EXTERN_C_BEGIN
181#define EXTERN_C_BEGIN DO_NOT_USE_EXTERN_C_BEGIN_ANY_MORE__USE_L4_BEGIN_DECLS
184#define EXTERN_C_END DO_NOT_USE_EXTERN_C_END_ANY_MORE__USE_L4_END_DECLS
191#if defined __cplusplus && __cplusplus >= 201402L
192# define L4_CONSTEXPR constexpr
201#define L4_NORETURN __attribute__((noreturn))
203#define L4_PURE __attribute__((pure))
209#define L4_NOINSTRUMENT __attribute__((no_instrument_function))
211# define L4_HIDDEN __attribute__((visibility("hidden")))
213#if !defined L4_EXPORT || defined DOXYGEN
214# define L4_EXPORT __attribute__((visibility("default")))
216#ifndef L4_EXPORT_TYPE
218# define L4_EXPORT_TYPE __attribute__((visibility("default")))
220# define L4_EXPORT_TYPE
223#define L4_STRONG_ALIAS(name, aliasname) L4__STRONG_ALIAS(name, aliasname)
224#define L4_WEAK_ALIAS(name, aliasname) L4__WEAK_ALIAS(name, aliasname)
226#define L4__STRONG_ALIAS(name, aliasname) \
227 extern __typeof (name) aliasname __attribute__ ((alias (#name)));
228#define L4__WEAK_ALIAS(name, aliasname) \
229 extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
231#define L4__STRONG_ALIAS(name, aliasname) \
232 extern __typeof (name) aliasname __attribute__ ((alias (#name), copy(name)));
233#define L4__WEAK_ALIAS(name, aliasname) \
234 extern __typeof (name) aliasname __attribute__ ((weak, alias (#name), copy(name)));
244#if defined(__i386__) || defined(__amd64__) || \
245 defined(__arm__) || defined(__aarch64__) || \
246 defined(__mips__) || defined(__riscv) || \
247 defined(__powerpc__) || defined(__sparc__)
248# define L4_STACK_ALIGN __BIGGEST_ALIGNMENT__
250# error Define L4_STACK_ALIGN for this target!
270#if defined(__i386__) || defined(__amd64__)
273 if ((stack & (L4_STACK_ALIGN - 1)) == (L4_STACK_ALIGN -
sizeof(
unsigned long)))
275 return (stack & ~(L4_STACK_ALIGN)) -
sizeof(
unsigned long);
280 return stack & ~(L4_STACK_ALIGN);
286#include <l4/sys/linkage.h>
288#define L4_LIKELY(x) __builtin_expect((x),1)
289#define L4_UNLIKELY(x) __builtin_expect((x),0)
293#define L4_STICKY(x) __attribute__((used)) x
294#define L4_DEPRECATED(s) __attribute__((deprecated(s)))
297# if !defined(__cplusplus)
298# define static_assert(x, y) _Static_assert(x, y)
299# elif __cplusplus < 201103L
300# define static_assert(x, y) \
301 extern int l4_static_assert[-(!(x))] __attribute__((unused))
305#define L4_stringify_helper(x) #x
306#define L4_stringify(x) L4_stringify_helper(x)
309#define L4_HAS_BUILTIN(def) __has_builtin(def)
311#define L4_HAS_BUILTIN(def) 0
339 __asm__ __volatile__ (
"" : : :
"memory");
344 __asm__ __volatile__ (
"" : : :
"memory");
349 __asm__ __volatile__ (
"" : : :
"memory");
void l4_wmb(void)
Write memory barrier.
#define L4_INLINE
L4 Inline function attribute.
void l4_barrier(void)
Memory barrier.
void l4_mb(void)
Memory barrier.
unsigned long l4_align_stack_for_direct_fncall(unsigned long stack)
Specify the desired alignment of the stack pointer.
L4_NORETURN void l4_infinite_loop(void)
Infinite loop.
#define L4_NORETURN
Noreturn function attribute.