diff options
author | Petri Latvala <petri.latvala@intel.com> | 2019-01-21 13:33:38 +0200 |
---|---|---|
committer | Petri Latvala <petri.latvala@intel.com> | 2019-01-21 13:49:11 +0200 |
commit | 5b4485f55b0336e2b39e30b6bb187c41b63b52f5 (patch) | |
tree | 126262b32289f0e329ff517f107b90431dbe728e /lib/igt_core.h | |
parent | d4199510374514489b1ab56e3416f53f6c1d6291 (diff) |
lib: Introduce BUILD_BUG_ON_INVALID and igt_assume()
BUILD_BUG_ON_INVALID() is a macro that, like the kernel counterpart,
expands to an expression that generates no code. Useful for making
sure an expression is valid code while producing no side effects.
igt_assume() is an assert-like macro that is used to give hints to
static analysis of code. If static analysis is not used (as detected
by STATIC_ANALYSIS_BUILD), igt_assume() expands to a
BUILD_BUG_ON_INVALID, otherwise expands to an assert().
v2: Make sure the expression in igt_assume is still parsed without
static analysis. (Chris)
v3: Also introduce BUILD_BUG_ON_INVALID as standalone
Signed-off-by: Petri Latvala <petri.latvala@intel.com>
Cc: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: MichaĆ Winiarski <michal.winiarski@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'lib/igt_core.h')
-rw-r--r-- | lib/igt_core.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/lib/igt_core.h b/lib/igt_core.h index 6f8c3852..0d02c90b 100644 --- a/lib/igt_core.h +++ b/lib/igt_core.h @@ -30,6 +30,7 @@ #ifndef IGT_CORE_H #define IGT_CORE_H +#include <assert.h> #include <setjmp.h> #include <stdbool.h> #include <stdint.h> @@ -54,6 +55,30 @@ #endif #endif +/** + * BUILD_BUG_ON_INVALID: + * @expr: Expression + * + * A macro that takes an expression and generates no code. Used for + * checking at build-time that an expression is valid code. + */ +#define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((long)(e)))) + +/** + * igt_assume: + * @expr: Condition to test + * + * An assert-like macro to be used for tautologies to give hints to + * static analysis of code. No-op if STATIC_ANALYSIS_BUILD is not + * defined, expands to an assert() if it is. + */ +#if STATIC_ANALYSIS_BUILD +#define igt_assume(e) assert(e) +#else +/* Make sure the expression is still parsed even though it generates no code */ +#define igt_assume(e) BUILD_BUG_ON_INVALID(e) +#endif + extern const char* __igt_test_description __attribute__((weak)); extern bool __igt_plain_output; extern char *igt_frame_dump_path; |