#ifndef _SYS_DEBUG_H
#define _SYS_DEBUG_H
#if !defined(_STANDALONE)
#include <sys/isa_defs.h>
#endif
#include <sys/types.h>
#include <sys/note.h>
#ifdef __cplusplus
extern "C" {
#endif
extern void assfail(const char *, const char *, int);
#define VERIFY(EX) ((void)((EX) || (assfail(#EX, __FILE__, __LINE__), 0)))
#if DEBUG
#define ASSERT(EX) ((void)((EX) || (assfail(#EX, __FILE__, __LINE__), 0)))
#else
#define ASSERT(x) ((void)0)
#endif
#if defined(_LP64)
#define ASSERT64(x) ASSERT(x)
#define ASSERT32(x)
#else
#define ASSERT64(x)
#define ASSERT32(x) ASSERT(x)
#endif
#if DEBUG
#define IMPLY(A, B) \
((void)(((!(A)) || (B)) || \
(assfail("(" #A ") implies (" #B ")", __FILE__, __LINE__), 0)))
#define EQUIV(A, B) \
((void)((!!(A) == !!(B)) || \
(assfail("(" #A ") is equivalent to (" #B ")", \
__FILE__, __LINE__), 0)))
#else
#define IMPLY(A, B) ((void)0)
#define EQUIV(A, B) ((void)0)
#endif
extern void assfail3(const char *, uintmax_t, const char *, uintmax_t,
const char *, int);
#define VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE) do { \
const TYPE __left = (TYPE)(LEFT); \
const TYPE __right = (TYPE)(RIGHT); \
if (!(__left OP __right)) \
assfail3(#LEFT " " #OP " " #RIGHT, \
(uintmax_t)__left, #OP, (uintmax_t)__right, \
__FILE__, __LINE__); \
_NOTE(CONSTCOND) } while (0)
#define VERIFY3B(x, y, z) VERIFY3_IMPL(x, y, z, boolean_t)
#define VERIFY3S(x, y, z) VERIFY3_IMPL(x, y, z, int64_t)
#define VERIFY3U(x, y, z) VERIFY3_IMPL(x, y, z, uint64_t)
#define VERIFY3P(x, y, z) VERIFY3_IMPL(x, y, z, uintptr_t)
#define VERIFY0(x) VERIFY3_IMPL(x, ==, 0, uintmax_t)
#if DEBUG
#define ASSERT3B(x, y, z) VERIFY3_IMPL(x, y, z, boolean_t)
#define ASSERT3S(x, y, z) VERIFY3_IMPL(x, y, z, int64_t)
#define ASSERT3U(x, y, z) VERIFY3_IMPL(x, y, z, uint64_t)
#define ASSERT3P(x, y, z) VERIFY3_IMPL(x, y, z, uintptr_t)
#define ASSERT0(x) VERIFY3_IMPL(x, ==, 0, uintmax_t)
#else
#define ASSERT3B(x, y, z) ((void)0)
#define ASSERT3S(x, y, z) ((void)0)
#define ASSERT3U(x, y, z) ((void)0)
#define ASSERT3P(x, y, z) ((void)0)
#define ASSERT0(x) ((void)0)
#endif
#define CTASSERT(x) _Static_assert(x, "compile-time assertion failed")
#if defined(_KERNEL) || defined(_FAKE_KERNEL)
extern void abort_sequence_enter(char *);
extern void debug_enter(char *);
#endif
#if defined(DEBUG) && !defined(__sun)
#define STATIC
#else
#define STATIC static
#endif
#ifdef __cplusplus
}
#endif
#endif