Add assert() for debug assertions
authorSimon Glass <sjg@chromium.org>
Wed, 29 Jun 2011 09:49:34 +0000 (09:49 +0000)
committerWolfgang Denk <wd@denx.de>
Fri, 9 Sep 2011 22:04:01 +0000 (00:04 +0200)
assert() is like BUG_ON() but compiles to nothing unless DEBUG is defined.
This is useful when a condition is an error but a board reset is unlikely
to fix it, so it is better to soldier on in hope. Assertion failures should
be caught during development/test.

It turns out that assert() is defined separately in a few places in U-Boot
with various meanings. This patch cleans up some of these.

Build errors exposed by this change (and defining DEBUG) are also fixed in
this patch.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/dlmalloc.c
include/common.h
include/malloc.h
lib/qsort.c
lib/vsprintf.c

index e9bab09b8eac7c0ec4900a3685f15a807b448c31..f2080c64bae06447c048fe5efb9481bbd884baa3 100644 (file)
@@ -286,13 +286,6 @@ extern "C" {
 
 */
 
-#ifdef DEBUG
-#include <assert.h>
-#else
-#define assert(x) ((void)0)
-#endif
-
-
 /*
   INTERNAL_SIZE_T is the word-size used for internal bookkeeping
   of chunk sizes. On a 64-bit machine, you can reduce malloc
index af8b154fd54d063fbe74d4008860f0e1d18b0f3b..d244bd40b5bc5b12d2e6bfd9831156a92c7eb525 100644 (file)
@@ -124,6 +124,27 @@ typedef volatile unsigned char     vu_char;
 #define debugX(level,fmt,args...)
 #endif /* DEBUG */
 
+#ifdef DEBUG
+# define _DEBUG 1
+#else
+# define _DEBUG 0
+#endif
+
+/*
+ * An assertion is run-time check done in debug mode only. If DEBUG is not
+ * defined then it is skipped. If DEBUG is defined and the assertion fails,
+ * then it calls panic*( which may or may not reset/halt U-Boot (see
+ * CONFIG_PANIC_HANG), It is hoped that all failing assertions are found
+ * before release, and after release it is hoped that they don't matter. But
+ * in any case these failing assertions cannot be fixed with a reset (which
+ * may just do the same assertion again).
+ */
+void __assert_fail(const char *assertion, const char *file, unsigned line,
+                  const char *function);
+#define assert(x) \
+       ({ if (!(x) && _DEBUG) \
+               __assert_fail(#x, __FILE__, __LINE__, __func__); })
+
 #define error(fmt, args...) do {                                       \
                printf("ERROR: " fmt "\nat %s:%d/%s()\n",               \
                        ##args, __FILE__, __LINE__, __func__);          \
index 3e145ad11c32bf0c9fcfb88c6d06f4895e8316d1..ecf3c678fe4b0065c7dd622c124e956a5fe32777 100644 (file)
@@ -285,14 +285,6 @@ extern "C" {
 
 */
 
-#ifdef DEBUG
-/* #include <assert.h> */
-#define assert(x) ((void)0)
-#else
-#define assert(x) ((void)0)
-#endif
-
-
 /*
   INTERNAL_SIZE_T is the word-size used for internal bookkeeping
   of chunk sizes. On a 64-bit machine, you can reduce malloc
index 1cc0d31c9ea2ae0561027ea5399393c7945b896a..86c392c225a53f5ebfe03f636853acae379ed056 100644 (file)
 
 #include <linux/types.h>
 #include <exports.h>
-#if 0
-#include <assert.h>
-#else
-#define assert(arg)
-#endif
 
 void qsort(void  *base,
           size_t nel,
index c029fbbc48191d58c1afd14c25af8e4ab2bc4971..79dead3996eb14bc82f40a68966be743e0743216 100644 (file)
@@ -730,3 +730,11 @@ void panic(const char *fmt, ...)
        while (1)
                ;
 }
+
+void __assert_fail(const char *assertion, const char *file, unsigned line,
+                  const char *function)
+{
+       /* This will not return */
+       panic("%s:%u: %s: Assertion `%s' failed.", file, line, function,
+             assertion);
+}