145 lines
3.8 KiB
C
145 lines
3.8 KiB
C
/*
|
|
* klibc/compiler.h
|
|
*
|
|
* Various compiler features
|
|
*/
|
|
|
|
#ifndef _KLIBC_COMPILER_H
|
|
#define _KLIBC_COMPILER_H
|
|
|
|
#define __user
|
|
|
|
/* Specific calling conventions */
|
|
/* __cdecl is used when we want varadic and non-varadic functions to have
|
|
the same binary calling convention. */
|
|
#ifdef __i386__
|
|
# ifdef __GNUC__
|
|
# define __cdecl __attribute__((cdecl,regparm(0)))
|
|
# else
|
|
/* Most other C compilers have __cdecl as a keyword */
|
|
# endif
|
|
#else
|
|
# define __cdecl /* Meaningless on non-i386 */
|
|
#endif
|
|
|
|
/* How to declare a function that *must* be inlined */
|
|
#ifdef __GNUC__
|
|
# if __GNUC_MAJOR__ >= 3
|
|
# define __must_inline static __inline__ __attribute__((always_inline))
|
|
# else
|
|
# define __must_inline extern __inline__
|
|
# endif
|
|
#else
|
|
# define __must_inline inline /* Just hope this works... */
|
|
#endif
|
|
|
|
/* How to declare a function that does not return */
|
|
#ifdef __GNUC__
|
|
# define __noreturn void __attribute__((noreturn))
|
|
#else
|
|
# define __noreturn void
|
|
#endif
|
|
|
|
/* "const" function:
|
|
|
|
Many functions do not examine any values except their arguments,
|
|
and have no effects except the return value. Basically this is
|
|
just slightly more strict class than the `pure' attribute above,
|
|
since function is not allowed to read global memory.
|
|
|
|
Note that a function that has pointer arguments and examines the
|
|
data pointed to must _not_ be declared `const'. Likewise, a
|
|
function that calls a non-`const' function usually must not be
|
|
`const'. It does not make sense for a `const' function to return
|
|
`void'.
|
|
*/
|
|
#ifdef __GNUC__
|
|
# define __constfunc __attribute__((const))
|
|
#else
|
|
# define __constfunc
|
|
#endif
|
|
#undef __attribute_const__
|
|
#define __attribute_const__ __constfunc
|
|
|
|
/* "pure" function:
|
|
|
|
Many functions have no effects except the return value and their
|
|
return value depends only on the parameters and/or global
|
|
variables. Such a function can be subject to common subexpression
|
|
elimination and loop optimization just as an arithmetic operator
|
|
would be. These functions should be declared with the attribute
|
|
`pure'.
|
|
*/
|
|
#ifdef __GNUC__
|
|
# define __purefunc __attribute__((pure))
|
|
#else
|
|
# define __purefunc
|
|
#endif
|
|
#undef __attribute_pure__
|
|
#define __attribute_pure__ __purefunc
|
|
|
|
/* Format attribute */
|
|
#ifdef __GNUC__
|
|
# define __formatfunc(t,f,a) __attribute__((format(t,f,a)))
|
|
#else
|
|
# define __formatfunc(t,f,a)
|
|
#endif
|
|
|
|
/* malloc() function (returns unaliased pointer) */
|
|
#if defined(__GNUC__) && (__GNUC_MAJOR__ >= 3)
|
|
# define __mallocfunc __attribute__((malloc))
|
|
#else
|
|
# define __mallocfunc
|
|
#endif
|
|
|
|
/* likely/unlikely */
|
|
#if defined(__GNUC__) && (__GNUC_MAJOR__ > 2 || (__GNUC_MAJOR__ == 2 && __GNUC_MINOR__ >= 95))
|
|
# define __likely(x) __builtin_expect(!!(x), 1)
|
|
# define __unlikely(x) __builtin_expect(!!(x), 0)
|
|
#else
|
|
# define __likely(x) (!!(x))
|
|
# define __unlikely(x) (!!(x))
|
|
#endif
|
|
|
|
/* Possibly unused function */
|
|
#ifdef __GNUC__
|
|
# define __unusedfunc __attribute__((unused))
|
|
#else
|
|
# define __unusedfunc
|
|
#endif
|
|
|
|
/* Declare a variable or data structure as unused. */
|
|
#ifdef __GNUC__
|
|
# define __unused __attribute__((unused))
|
|
#else
|
|
# define __unused
|
|
#endif
|
|
|
|
/* Used symbol */
|
|
#define __used __attribute__((used))
|
|
|
|
/* Constructors and destructors */
|
|
#define __constructor __attribute__((constructor))
|
|
#define __destructor __attribute__((destructor))
|
|
|
|
/* Packed structures */
|
|
#define __packed __attribute__((packed))
|
|
|
|
/* Weak symbols */
|
|
#define __weak __attribute__((weak))
|
|
|
|
/* Alignment */
|
|
#define __aligned(x) __attribute__((aligned(x)))
|
|
#define __alignas(x) __attribute__((aligned(__alignof__(x))))
|
|
|
|
/* Handling of common (affect constructors/destructors) */
|
|
#define __common __attribute__((common))
|
|
#define __nocommon __attribute__((nocommon))
|
|
|
|
/* Weak symbols */
|
|
#define __weak __attribute__((weak))
|
|
|
|
#define __export __attribute__((visibility("default")))
|
|
|
|
#endif
|