Quelle compiler.h
Sprache: C
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _TOOLS_LINUX_COMPILER_H_
#define _TOOLS_LINUX_COMPILER_H_
#ifndef __ASSEMBLY__
#include <linux/compiler_types.h>
#ifndef __compiletime_error
# define __compiletime_error(message)
#endif
#ifdef __OPTIMIZE__
# define __compiletime_assert(condition, msg, prefix, suffix) \
do { \
extern void prefix ## suffix(void ) __compiletime_error(msg); \
if (!(condition)) \
prefix ## suffix(); \
} while (0 )
#else
# define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0 )
#endif
#define _compiletime_assert(condition, msg, prefix, suffix) \
__compiletime_assert(condition, msg, prefix, suffix)
/**
* compiletime_assert - break build and emit msg if condition is false
* @ condition : a compile - time constant condition to check
* @ msg : a message to emit if condition is false
*
* In tradition of POSIX assert , this macro will break the build if the
* supplied condition is * false * , emitting the supplied error message if the
* compiler has support to do so .
*/
#define compiletime_assert(condition, msg) \
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
/* Optimization barrier */
/* The "volatile" is due to gcc bugs */
#define barrier() __asm__ __volatile__("" : : :"memory" )
#ifndef __always_inline
# define __always_inline inline __attribute__((always_inline))
#endif
#ifndef __always_unused
#define __always_unused __attribute__((__unused__))
#endif
#ifndef __noreturn
#define __noreturn __attribute__((__noreturn__))
#endif
#ifndef unreachable
#define unreachable() __builtin_unreachable()
#endif
#ifndef noinline
#define noinline
#endif
#ifndef __nocf_check
#define __nocf_check __attribute__((nocf_check))
#endif
#ifndef __naked
#define __naked __attribute__((__naked__))
#endif
/* Are two types/vars the same type (ignoring qualifiers)? */
#ifndef __same_type
# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
#endif
/*
* This returns a constant expression while determining if an argument is
* a constant expression , most importantly without evaluating the argument .
* Glory to Martin Uecker < Martin . Uecker @ med . uni - goettingen . de >
*/
#define __is_constexpr(x) \
(sizeof (int ) == sizeof (*(8 ? ((void *)((long )(x) * 0 l)) : (int *)8 )))
/*
* Similar to statically_true ( ) but produces a constant expression
*
* To be used in conjunction with macros , such as BUILD_BUG_ON_ZERO ( ) ,
* which require their input to be a constant expression and for which
* statically_true ( ) would otherwise fail .
*
* This is a trade - off : const_true ( ) requires all its operands to be
* compile time constants . Else , it would always returns false even on
* the most trivial cases like :
*
* true | | non_const_var
*
* On the opposite , statically_true ( ) is able to fold more complex
* tautologies and will return true on expressions such as :
*
* ! ( non_const_var * 8 % 4 )
*
* For the general case , statically_true ( ) is better .
*/
#define const_true(x) __builtin_choose_expr(__is_constexpr(x), x, false )
#ifdef __ANDROID__
/*
* FIXME : Big hammer to get rid of tons of :
* " warning : always_inline function might not be inlinable "
*
* At least on android - ndk - r12 / platforms / android - 24 / arch - arm
*/
#undef __always_inline
#define __always_inline inline
#endif
#define __user
#define __rcu
#define __read_mostly
#ifndef __attribute_const__
# define __attribute_const__
#endif
#ifndef __maybe_unused
# define __maybe_unused __attribute__((unused))
#endif
#ifndef __used
# define __used __attribute__((__unused__))
#endif
#ifndef __packed
# define __packed __attribute__((__packed__))
#endif
#ifndef __force
# define __force
#endif
#ifndef __weak
# define __weak __attribute__((weak))
#endif
#ifndef likely
# define likely(x) __builtin_expect(!!(x), 1 )
#endif
#ifndef unlikely
# define unlikely(x) __builtin_expect(!!(x), 0 )
#endif
#include <linux/types.h>
/*
* Following functions are taken from kernel sources and
* break aliasing rules in their original form .
*
* While kernel is compiled with - fno - strict - aliasing ,
* perf uses - Wstrict - aliasing = 3 which makes build fail
* under gcc 4 . 4 .
*
* Using extra _ _ may_alias__ type to allow aliasing
* in this case .
*/
typedef __u8 __attribute__((__may_alias__)) __u8_alias_t;
typedef __u16 __attribute__((__may_alias__)) __u16_alias_t;
typedef __u32 __attribute__((__may_alias__)) __u32_alias_t;
typedef __u64 __attribute__((__may_alias__)) __u64_alias_t;
static __always_inline void __read_once_size(const volatile void *p, void *res, int size)
{
switch (size) {
case 1 : *(__u8_alias_t *) res = *(volatile __u8_alias_t *) p; break ;
case 2 : *(__u16_alias_t *) res = *(volatile __u16_alias_t *) p; break ;
case 4 : *(__u32_alias_t *) res = *(volatile __u32_alias_t *) p; break ;
case 8 : *(__u64_alias_t *) res = *(volatile __u64_alias_t *) p; break ;
default :
barrier();
__builtin_memcpy((void *)res, (const void *)p, size);
barrier();
}
}
static __always_inline void __write_once_size(volatile void *p, void *res, int size)
{
switch (size) {
case 1 : *(volatile __u8_alias_t *) p = *(__u8_alias_t *) res; break ;
case 2 : *(volatile __u16_alias_t *) p = *(__u16_alias_t *) res; break ;
case 4 : *(volatile __u32_alias_t *) p = *(__u32_alias_t *) res; break ;
case 8 : *(volatile __u64_alias_t *) p = *(__u64_alias_t *) res; break ;
default :
barrier();
__builtin_memcpy((void *)p, (const void *)res, size);
barrier();
}
}
/*
* Prevent the compiler from merging or refetching reads or writes . The
* compiler is also forbidden from reordering successive instances of
* READ_ONCE and WRITE_ONCE , but only when the compiler is aware of some
* particular ordering . One way to make the compiler aware of ordering is to
* put the two invocations of READ_ONCE or WRITE_ONCE in different C
* statements .
*
* These two macros will also work on aggregate data types like structs or
* unions . If the size of the accessed data type exceeds the word size of
* the machine ( e . g . , 32 bits or 64 bits ) READ_ONCE ( ) and WRITE_ONCE ( ) will
* fall back to memcpy and print a compile - time warning .
*
* Their two major use cases are : ( 1 ) Mediating communication between
* process - level code and irq / NMI handlers , all running on the same CPU ,
* and ( 2 ) Ensuring that the compiler does not fold , spindle , or otherwise
* mutilate accesses that either do not require ordering or that interact
* with an explicit memory barrier or atomic instruction that provides the
* required ordering .
*/
#define READ_ONCE(x) \
({ \
union { typeof(x) __val; char __c[1 ]; } __u = \
{ .__c = { 0 } }; \
__read_once_size(&(x), __u.__c, sizeof (x)); \
__u.__val; \
})
#define WRITE_ONCE(x, val) \
({ \
union { typeof(x) __val; char __c[1 ]; } __u = \
{ .__val = (val) }; \
__write_once_size(&(x), __u.__c, sizeof (x)); \
__u.__val; \
})
/* Indirect macros required for expanded argument pasting, eg. __LINE__. */
#define ___PASTE(a, b) a## b
#define __PASTE(a, b) ___PASTE(a, b)
#ifndef OPTIMIZER_HIDE_VAR
/* Make the optimizer believe the variable can be manipulated arbitrarily. */
#define OPTIMIZER_HIDE_VAR(var) \
__asm__ ("" : "=r" (var) : "0" (var))
#endif
#ifndef __BUILD_BUG_ON_ZERO_MSG
#if defined (__clang__)
#define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int )(sizeof (struct { int :(-!!(e)); })))
#else
#define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int )sizeof (struct {_Static_assert(!(e), msg);}))
#endif
#endif
#endif /* __ASSEMBLY__ */
#endif /* _TOOLS_LINUX_COMPILER_H */
Messung V0.5 in Prozent C=95 H=91 G=92
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-09-28)
¤
*© Formatika GbR, Deutschland
2026-10-10
Neuigkeiten
Aktuelles
Motto des Tages
Open Source Software
Jenseits des Üblichen ....
Besucherstatistik
Statistik
#Sources=1126864
#Domains=1897691