Viewing file: compiler.h (3.04 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* * 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
/* Constructors and destructors */ #define __constructor __attribute__((constructor)) #define __destructor __attribute__((destructor))
#endif
|