From 726c4a25659bfc0b3458da48a115dad67ddcb2ab Mon Sep 17 00:00:00 2001
From: Brian Behlendorf <behlendorf1@llnl.gov>
Date: Tue, 1 Mar 2016 15:45:43 +0100
Subject: [PATCH] Remove complicated libspl assert wrappers

Effectively provide our own version of assert()/verify() for use
in user space.  This minimizes our dependencies and aligns the
user space assertion handling with what's used in the kernel.

Signed-off-by: Carlo Landmeter <clandmeter@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #4449
---
 include/libzfs_impl.h       |  5 ---
 lib/libspl/include/assert.h | 82 ++++++++++++++++---------------------
 2 files changed, 36 insertions(+), 51 deletions(-)

diff --git a/include/libzfs_impl.h b/include/libzfs_impl.h
index e805e3ee7..ff02fa794 100644
--- a/include/libzfs_impl.h
+++ b/include/libzfs_impl.h
@@ -46,11 +46,6 @@
 extern "C" {
 #endif
 
-#ifdef	VERIFY
-#undef	VERIFY
-#endif
-#define	VERIFY	verify
-
 typedef struct libzfs_fru {
 	char *zf_device;
 	char *zf_fru;
diff --git a/lib/libspl/include/assert.h b/lib/libspl/include/assert.h
index 52924e8ba..6226872e5 100644
--- a/lib/libspl/include/assert.h
+++ b/lib/libspl/include/assert.h
@@ -32,68 +32,54 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#ifndef __assert_c99
-static inline void
-__assert_c99(const char *expr, const char *file, int line, const char *func)
+static inline int
+libspl_assert(const char *buf, const char *file, const char *func, int line)
 {
-	fprintf(stderr, "%s:%i: %s: Assertion `%s` failed.\n",
-		file, line, func, expr);
+	fprintf(stderr, "%s\n", buf);
+	fprintf(stderr, "ASSERT at %s:%d:%s()", file, line, func);
 	abort();
 }
-#endif  /* __assert_c99 */
-
-#ifndef verify
-#if defined(__STDC__)
-#if __STDC_VERSION__ - 0 >= 199901L
-#define	verify(EX) (void)((EX) || \
-	(__assert_c99(#EX, __FILE__, __LINE__, __func__), 0))
-#else
-#define	verify(EX) (void)((EX) || (__assert(#EX, __FILE__, __LINE__), 0))
-#endif  /* __STDC_VERSION__ - 0 >= 199901L */
-#else
-#define	verify(EX) (void)((EX) || (_assert("EX", __FILE__, __LINE__), 0))
-#endif	/* __STDC__ */
-#endif  /* verify */
-
-#undef VERIFY
-#undef ASSERT
 
-#define	VERIFY	verify
-#define	ASSERT	assert
+#ifdef verify
+#undef verify
+#endif
 
-extern void __assert(const char *, const char *, int);
+#define	VERIFY(cond)							\
+	(void) ((!(cond)) &&						\
+	    libspl_assert(#cond, __FILE__, __FUNCTION__, __LINE__))
+#define	verify(cond)							\
+	(void) ((!(cond)) &&						\
+	    libspl_assert(#cond, __FILE__, __FUNCTION__, __LINE__))
 
-static inline int
-assfail(const char *buf, const char *file, int line)
-{
-	__assert(buf, file, line);
-	return (0);
-}
-
-/* BEGIN CSTYLED */
-#define	VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE) do { \
-	const TYPE __left = (TYPE)(LEFT); \
-	const TYPE __right = (TYPE)(RIGHT); \
-	if (!(__left OP __right)) { \
-		char *__buf = alloca(256); \
-		(void) snprintf(__buf, 256, "%s %s %s (0x%llx %s 0x%llx)", \
-			#LEFT, #OP, #RIGHT, \
-			(u_longlong_t)__left, #OP, (u_longlong_t)__right); \
-		assfail(__buf, __FILE__, __LINE__); \
-	} \
+#define	VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE)				\
+do {									\
+	const TYPE __left = (TYPE)(LEFT);				\
+	const TYPE __right = (TYPE)(RIGHT);				\
+	if (!(__left OP __right)) {					\
+		char *__buf = alloca(256);				\
+		(void) snprintf(__buf, 256,				\
+		    "%s %s %s (0x%llx %s 0x%llx)", #LEFT, #OP, #RIGHT,	\
+		    (u_longlong_t)__left, #OP, (u_longlong_t)__right);	\
+		libspl_assert(__buf, __FILE__, __FUNCTION__, __LINE__);	\
+	}								\
 } while (0)
-/* END CSTYLED */
 
 #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, uint64_t)
 
+#ifdef assert
+#undef assert
+#endif
+
 #ifdef NDEBUG
 #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)
+#define	ASSERT(x)		((void)0)
+#define	assert(x)		((void)0)
 #define	ASSERTV(x)
 #define	IMPLY(A, B)		((void)0)
 #define	EQUIV(A, B)		((void)0)
@@ -102,13 +88,17 @@ assfail(const char *buf, const char *file, int line)
 #define	ASSERT3U(x, y, z)	VERIFY3U(x, y, z)
 #define	ASSERT3P(x, y, z)	VERIFY3P(x, y, z)
 #define	ASSERT0(x)		VERIFY0(x)
+#define	ASSERT(x)		VERIFY(x)
+#define	assert(x)		VERIFY(x)
 #define	ASSERTV(x)		x
 #define	IMPLY(A, B) \
 	((void)(((!(A)) || (B)) || \
-	    assfail("(" #A ") implies (" #B ")", __FILE__, __LINE__)))
+	    libspl_assert("(" #A ") implies (" #B ")", \
+	    __FILE__, __FUNCTION__, __LINE__)))
 #define	EQUIV(A, B) \
 	((void)((!!(A) == !!(B)) || \
-	    assfail("(" #A ") is equivalent to (" #B ")", __FILE__, __LINE__)))
+	    libspl_assert("(" #A ") is equivalent to (" #B ")", \
+	    __FILE__, __FUNCTION__, __LINE__)))
 
 #endif  /* NDEBUG */
 
-- 
2.40.0