Message ID | 1308870873-32540-1-git-send-email-sjg@chromium.org |
---|---|
State | New, archived |
Headers | show |
Acked-by: Mike Frysinger <vapier@gentoo.org>
-mike
Dear Simon Glass, In message <1308870873-32540-1-git-send-email-sjg@chromium.org> you wrote: > 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> > --- > V2: > * Changed macros so that all code is compiled even if DEBUG is disabled ... > +#define assert(x) \ > + ({ if (!(x) && _DEBUG) \ > + printf("Assertion failure '%s' %s line %d\n", \ > + #x, __FILE__, __LINE__); }) Can we please use the same message format as used by assert(3) ? Afaict they use "%s%s%s:%u: %s%sAssertion `%s' failed.". Also, to save on memory footprint (frequent repetition of the common string "Assertion failed") we should probably provide a separate function for this (cf. /usr/include/assert.h). Finally, should the assert() not result in some termination or hang of U-Boot, like assert(3) is doing? Best regards, Wolfgang Denk
Hi Wolfgang, On Thu, Jun 23, 2011 at 10:33 PM, Wolfgang Denk <wd@denx.de> wrote: > Dear Simon Glass, ... >> +#define assert(x) \ >> + ({ if (!(x) && _DEBUG) \ >> + printf("Assertion failure '%s' %s line %d\n", \ >> + #x, __FILE__, __LINE__); }) > > Can we please use the same message format as used by assert(3) ? > Afaict they use "%s%s%s:%u: %s%sAssertion `%s' failed.". Yes, will do. > > Also, to save on memory footprint (frequent repetition of the common > string "Assertion failed") we should probably provide a separate > function for this (cf. /usr/include/assert.h). Good idea will do. > > Finally, should the assert() not result in some termination or hang of > U-Boot, like assert(3) is doing? I'm happy either way so long as it prints a message. A hang is better than a reboot for those with ICE units, etc. My intention was that it would simply print the message and try to continue (since we can't really 'terminate' U-Boot, and it continues with DEBUG not defined). But I am happy either way, so let me know if you would like it to hang. Regards, Simon > > Best regards, > > Wolfgang Denk > > -- > DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel > HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany > Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de > "What the scientists have in their briefcases is terrifying." > - Nikita Khrushchev >
On Fri, Jun 24, 2011 at 14:13, Simon Glass wrote: > On Thu, Jun 23, 2011 at 10:33 PM, Wolfgang Denk wrote: >> Finally, should the assert() not result in some termination or hang of >> U-Boot, like assert(3) is doing? > > I'm happy either way so long as it prints a message. A hang is better > than a reboot for those with ICE units, etc. My intention was that it > would simply print the message and try to continue (since we can't > really 'terminate' U-Boot, and it continues with DEBUG not defined). use panic() instead of printf() and then the hang-vs-reset issue is made into a board-config issue (CONFIG_PANIC_HANG) -mike
diff --git a/common/dlmalloc.c b/common/dlmalloc.c index e9bab09..f2080c6 100644 --- a/common/dlmalloc.c +++ b/common/dlmalloc.c @@ -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 diff --git a/include/common.h b/include/common.h index 1e21b7a..6181e07 100644 --- a/include/common.h +++ b/include/common.h @@ -124,6 +124,25 @@ 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. It does not BUG or halt U-Boot, but tries to + * continue execution in any case. 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 + * BUG-type reset (which may just do the same assertion again). + */ +#define assert(x) \ + ({ if (!(x) && _DEBUG) \ + printf("Assertion failure '%s' %s line %d\n", \ + #x, __FILE__, __LINE__); }) + #define error(fmt, args...) do { \ printf("ERROR: " fmt "\nat %s:%d/%s()\n", \ ##args, __FILE__, __LINE__, __func__); \ diff --git a/include/malloc.h b/include/malloc.h index 3e145ad..ecf3c67 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -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 diff --git a/lib/qsort.c b/lib/qsort.c index 1cc0d31..86c392c 100644 --- a/lib/qsort.c +++ b/lib/qsort.c @@ -17,11 +17,6 @@ #include <linux/types.h> #include <exports.h> -#if 0 -#include <assert.h> -#else -#define assert(arg) -#endif void qsort(void *base, size_t nel,
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> --- V2: * Changed macros so that all code is compiled even if DEBUG is disabled --- common/dlmalloc.c | 7 ------- include/common.h | 19 +++++++++++++++++++ include/malloc.h | 8 -------- lib/qsort.c | 5 ----- 4 files changed, 19 insertions(+), 20 deletions(-)