summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/imagination/pvr_check.h
blob: 94764ce9bbd19f2145a08a0e186b8004e0e87f51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* 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 */