blob: a2d9994650ce6f98efb5d199765c052208ed8ca9 [file] [log] [blame]
/* See COPYRIGHT for copyright information. */
#pragma once
#include <compiler.h>
void _warn(const char *, int, const char *, ...);
struct hw_trapframe;
void _panic(struct hw_trapframe *, const char *, int, const char *, ...)
__attribute__((noreturn));
#define warn(...) _warn(__FILE__, __LINE__, __VA_ARGS__)
#define warn_once(...) run_once_racy(warn(__VA_ARGS__))
#define warn_on(x) do { if (x) warn(#x);} while (0)
#define warn_on_once(x) do { if (x) warn_once(#x);} while (0)
#define panic(...) _panic(NULL, __FILE__, __LINE__, __VA_ARGS__)
#define panic_hwtf(x, ...) _panic(x, __FILE__, __LINE__, __VA_ARGS__)
#define exhausted(...) _panic(NULL, __FILE__, __LINE__, __VA_ARGS__)
#define assert(x) \
do { if (unlikely(!(x))) panic("assertion failed: %s", #x); } while (0)
#define error_assert(e, x) \
do { if (unlikely(!(x))) error(e, "Assertion failed: " #x); } while (0)
// static_assert(x) will generate a compile-time error if 'x' is false.
#define static_assert(x) switch (x) case 0: case (x):
#ifdef CONFIG_DEVELOPMENT_ASSERTIONS
#define dassert(x) assert(x)
#else
#define dassert(x) ((void) (x)) // 'Use' value, stop compile warnings
#endif /* DEVELOPMENT_ASSERTIONS */