17f4dd379Sjsg /* Public domain. */ 27f4dd379Sjsg 37f4dd379Sjsg #ifndef _LINUX_OVERFLOW_H 47f4dd379Sjsg #define _LINUX_OVERFLOW_H 57f4dd379Sjsg 67f4dd379Sjsg #define array_size(x, y) ((x) * (y)) 77f4dd379Sjsg 8c349dbc7Sjsg #define struct_size(p, member, n) \ 9c349dbc7Sjsg (sizeof(*(p)) + ((n) * (sizeof(*(p)->member)))) 10c349dbc7Sjsg 114d3df292Sjsg #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ >= 5) 124d3df292Sjsg #define check_add_overflow(x, y, sum) __builtin_add_overflow(x, y, sum) 13*8e54c6d8Sjsg #define check_mul_overflow(x, y, z) __builtin_mul_overflow(x, y, z) 14*8e54c6d8Sjsg #else 15*8e54c6d8Sjsg #define check_mul_overflow(x, y, z) ({ \ 16*8e54c6d8Sjsg *(z) = (x) * (y); \ 17*8e54c6d8Sjsg 0; \ 18*8e54c6d8Sjsg }) 194d3df292Sjsg #endif 204d3df292Sjsg 217f4dd379Sjsg #endif 22