| /* SPDX-License-Identifier: GPL-2.0-only OR MIT */ | |
| /* Copyright (c) 2026 Imagination Technologies Ltd. */ | |
| #ifndef PVR_CHECK_H | |
| #define PVR_CHECK_H | |
| #include <linux/build_bug.h> | |
| #include <linux/overflow.h> | |
| #include <linux/stddef.h> | |
| #define OFFSET_CHECK(type, member, offset) \ | |
| static_assert(offsetof(type, member) == (offset), \ | |
| "offsetof(" #type ", " #member ") incorrect") | |
| #define SIZE_CHECK(type, size) \ | |
| static_assert(sizeof(type) == (size), #type " is incorrect size") | |
| #define ALIGN_CHECK(type, align) \ | |
| static_assert(__alignof__(type) <= (align), #type " has incorrect alignment") | |
| /* | |
| * Where the last member of a struct is a flexible array member, using | |
| * SIZE_CHECK() is pointless. If the structure is not already padded to | |
| * alignment without the flexible array member, sizeof() will not match the | |
| * offset of the flexible array member and the "correct" sizeof() value is | |
| * completely meaningless. | |
| * | |
| * In those instances, use FLEX_ARRAY_CHECK() instead to assert that the final | |
| * field is a flexible array member and that it behaves as expected. | |
| */ | |
| #define FLEX_ARRAY_CHECK(type, member) \ | |
| static_assert(flex_array_size((type *)NULL, member, 1) == \ | |
| sizeof_field(type, member[0]), \ | |
| #type "->" #member " is incorrect size") | |
| #endif /* PVR_CHECK_H */ |