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