| /* 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 */ |