xref: /aosp_15_r20/external/kmod/shared/macro.h (revision cc4ad7da8cefe208cb129ac2aa9a357c7c72deb2)
1*cc4ad7daSAndroid Build Coastguard Worker /*
2*cc4ad7daSAndroid Build Coastguard Worker  * kmod - interface to kernel module operations
3*cc4ad7daSAndroid Build Coastguard Worker  *
4*cc4ad7daSAndroid Build Coastguard Worker  * Copyright (C) 2011-2013  ProFUSION embedded systems
5*cc4ad7daSAndroid Build Coastguard Worker  *
6*cc4ad7daSAndroid Build Coastguard Worker  * This library is free software; you can redistribute it and/or
7*cc4ad7daSAndroid Build Coastguard Worker  * modify it under the terms of the GNU Lesser General Public
8*cc4ad7daSAndroid Build Coastguard Worker  * License as published by the Free Software Foundation; either
9*cc4ad7daSAndroid Build Coastguard Worker  * version 2.1 of the License, or (at your option) any later version.
10*cc4ad7daSAndroid Build Coastguard Worker  *
11*cc4ad7daSAndroid Build Coastguard Worker  * This library is distributed in the hope that it will be useful,
12*cc4ad7daSAndroid Build Coastguard Worker  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*cc4ad7daSAndroid Build Coastguard Worker  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*cc4ad7daSAndroid Build Coastguard Worker  * Lesser General Public License for more details.
15*cc4ad7daSAndroid Build Coastguard Worker  *
16*cc4ad7daSAndroid Build Coastguard Worker  * You should have received a copy of the GNU Lesser General Public
17*cc4ad7daSAndroid Build Coastguard Worker  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18*cc4ad7daSAndroid Build Coastguard Worker  */
19*cc4ad7daSAndroid Build Coastguard Worker #pragma once
20*cc4ad7daSAndroid Build Coastguard Worker 
21*cc4ad7daSAndroid Build Coastguard Worker #include <stddef.h>
22*cc4ad7daSAndroid Build Coastguard Worker 
23*cc4ad7daSAndroid Build Coastguard Worker #if defined(HAVE_STATIC_ASSERT)
24*cc4ad7daSAndroid Build Coastguard Worker #define assert_cc(expr) \
25*cc4ad7daSAndroid Build Coastguard Worker 	_Static_assert((expr), #expr)
26*cc4ad7daSAndroid Build Coastguard Worker #else
27*cc4ad7daSAndroid Build Coastguard Worker #define assert_cc(expr) \
28*cc4ad7daSAndroid Build Coastguard Worker        do { (void) sizeof(char [1 - 2*!(expr)]); } while(0)
29*cc4ad7daSAndroid Build Coastguard Worker #endif
30*cc4ad7daSAndroid Build Coastguard Worker 
31*cc4ad7daSAndroid Build Coastguard Worker #define check_types_match(expr1, expr2)		\
32*cc4ad7daSAndroid Build Coastguard Worker 	((typeof(expr1) *)0 != (typeof(expr2) *)0)
33*cc4ad7daSAndroid Build Coastguard Worker 
34*cc4ad7daSAndroid Build Coastguard Worker #define container_of(member_ptr, containing_type, member)		\
35*cc4ad7daSAndroid Build Coastguard Worker 	((containing_type *)						\
36*cc4ad7daSAndroid Build Coastguard Worker 	 ((char *)(member_ptr) - offsetof(containing_type, member))	\
37*cc4ad7daSAndroid Build Coastguard Worker 	 - check_types_match(*(member_ptr), ((containing_type *)0)->member))
38*cc4ad7daSAndroid Build Coastguard Worker 
39*cc4ad7daSAndroid Build Coastguard Worker 
40*cc4ad7daSAndroid Build Coastguard Worker /* Two gcc extensions.
41*cc4ad7daSAndroid Build Coastguard Worker  * &a[0] degrades to a pointer: a different type from an array */
42*cc4ad7daSAndroid Build Coastguard Worker #define _array_size_chk(arr) ({ \
43*cc4ad7daSAndroid Build Coastguard Worker 	assert_cc(!__builtin_types_compatible_p(typeof(arr), typeof(&(arr)[0]))); \
44*cc4ad7daSAndroid Build Coastguard Worker 	0; \
45*cc4ad7daSAndroid Build Coastguard Worker 	})
46*cc4ad7daSAndroid Build Coastguard Worker 
47*cc4ad7daSAndroid Build Coastguard Worker #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + _array_size_chk(arr))
48*cc4ad7daSAndroid Build Coastguard Worker 
49*cc4ad7daSAndroid Build Coastguard Worker #define XSTRINGIFY(x) #x
50*cc4ad7daSAndroid Build Coastguard Worker #define STRINGIFY(x) XSTRINGIFY(x)
51*cc4ad7daSAndroid Build Coastguard Worker 
52*cc4ad7daSAndroid Build Coastguard Worker #define XCONCATENATE(x, y) x ## y
53*cc4ad7daSAndroid Build Coastguard Worker #define CONCATENATE(x, y) XCONCATENATE(x, y)
54*cc4ad7daSAndroid Build Coastguard Worker #define UNIQ(x) CONCATENATE(x, __COUNTER__)
55*cc4ad7daSAndroid Build Coastguard Worker 
56*cc4ad7daSAndroid Build Coastguard Worker /* Temporaries for importing index handling */
57*cc4ad7daSAndroid Build Coastguard Worker #define NOFAIL(x) (x)
58*cc4ad7daSAndroid Build Coastguard Worker #define fatal(x...) do { } while (0)
59*cc4ad7daSAndroid Build Coastguard Worker 
60*cc4ad7daSAndroid Build Coastguard Worker /* Attributes */
61*cc4ad7daSAndroid Build Coastguard Worker 
62*cc4ad7daSAndroid Build Coastguard Worker #define _must_check_ __attribute__((warn_unused_result))
63*cc4ad7daSAndroid Build Coastguard Worker #define _printf_format_(a,b) __attribute__((format (printf, a, b)))
64*cc4ad7daSAndroid Build Coastguard Worker #define _unused_ __attribute__((unused))
65*cc4ad7daSAndroid Build Coastguard Worker #define _always_inline_ __inline__ __attribute__((always_inline))
66*cc4ad7daSAndroid Build Coastguard Worker #define _cleanup_(x) __attribute__((cleanup(x)))
67*cc4ad7daSAndroid Build Coastguard Worker 
68*cc4ad7daSAndroid Build Coastguard Worker /* Define C11 noreturn without <stdnoreturn.h> and even on older gcc
69*cc4ad7daSAndroid Build Coastguard Worker  * compiler versions */
70*cc4ad7daSAndroid Build Coastguard Worker #ifndef noreturn
71*cc4ad7daSAndroid Build Coastguard Worker #if defined(HAVE_NORETURN)
72*cc4ad7daSAndroid Build Coastguard Worker #define noreturn _Noreturn
73*cc4ad7daSAndroid Build Coastguard Worker #else
74*cc4ad7daSAndroid Build Coastguard Worker #define noreturn __attribute__((noreturn))
75*cc4ad7daSAndroid Build Coastguard Worker #endif
76*cc4ad7daSAndroid Build Coastguard Worker #endif
77