summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.in23
-rw-r--r--utils.h61
2 files changed, 80 insertions, 4 deletions
diff --git a/Makefile.in b/Makefile.in
index ac6b353b..9e0cb4c4 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -12,6 +12,11 @@
# V=1 verbose, print command lines (default: quiet)
# C=1 run checker before compilation (default checker: sparse)
# D=1 debugging build, turn off optimizations
+# D=dflags dtto, turn on additional debugging features:
+# verbose - print file:line along with error/warning messages
+# trace - print trace before the error/warning messages
+# abort - call abort() on first error (dumps core)
+# all - shortcut for all of the above
# W=123 build with warnings (default: off)
# DEBUG_CFLAGS additional compiler flags for debugging build
# EXTRA_CFLAGS additional compiler flags
@@ -121,6 +126,24 @@ ifeq ("$(origin D)", "command line")
DEBUG_CFLAGS_INTERNAL = $(DEBUG_CFLAGS_DEFAULT) $(DEBUG_CFLAGS)
endif
+ifneq (,$(findstring verbose,$(D)))
+ DEBUG_CFLAGS_INTERNAL += -DDEBUG_VERBOSE_ERROR=1
+endif
+
+ifneq (,$(findstring trace,$(D)))
+ DEBUG_CFLAGS_INTERNAL += -DDEBUG_TRACE_ON_ERROR=1
+endif
+
+ifneq (,$(findstring abort,$(D)))
+ DEBUG_CFLAGS_INTERNAL += -DDEBUG_ABORT_ON_ERROR=1
+endif
+
+ifneq (,$(findstring all,$(D)))
+ DEBUG_CFLAGS_INTERNAL += -DDEBUG_VERBOSE_ERROR=1
+ DEBUG_CFLAGS_INTERNAL += -DDEBUG_TRACE_ON_ERROR=1
+ DEBUG_CFLAGS_INTERNAL += -DDEBUG_ABORT_ON_ERROR=1
+endif
+
MAKEOPTS = --no-print-directory Q=$(Q)
# build all by default
diff --git a/utils.h b/utils.h
index 58121ced..da23bfcc 100644
--- a/utils.h
+++ b/utils.h
@@ -311,8 +311,61 @@ void clean_args_no_options_relaxed(int argc, char *argv[],
const char * const *usagestr);
int string_is_numerical(const char *str);
+#if DEBUG_VERBOSE_ERROR
+#define PRINT_VERBOSE_ERROR fprintf(stderr, "%s:%d:", __FILE__, __LINE__)
+#else
+#define PRINT_VERBOSE_ERROR
+#endif
+
+#if DEBUG_TRACE_ON_ERROR
+#define PRINT_TRACE_ON_ERROR print_trace()
+#else
+#define PRINT_TRACE_ON_ERROR
+#endif
+
+#if DEBUG_ABORT_ON_ERROR
+#define DO_ABORT_ON_ERROR abort()
+#else
+#define DO_ABORT_ON_ERROR
+#endif
+
+#define error(fmt, ...) \
+ do { \
+ PRINT_TRACE_ON_ERROR; \
+ PRINT_VERBOSE_ERROR; \
+ __error((fmt), ##__VA_ARGS__); \
+ DO_ABORT_ON_ERROR; \
+ } while (0)
+
+#define error_on(cond, fmt, ...) \
+ do { \
+ if ((cond)) \
+ PRINT_TRACE_ON_ERROR; \
+ if ((cond)) \
+ PRINT_VERBOSE_ERROR; \
+ __error_on((cond), (fmt), ##__VA_ARGS__); \
+ if ((cond)) \
+ DO_ABORT_ON_ERROR; \
+ } while (0)
+
+#define warning(fmt, ...) \
+ do { \
+ PRINT_TRACE_ON_ERROR; \
+ PRINT_VERBOSE_ERROR; \
+ __warning((fmt), ##__VA_ARGS__); \
+ } while (0)
+
+#define warning_on(cond, fmt, ...) \
+ do { \
+ if ((cond)) \
+ PRINT_TRACE_ON_ERROR; \
+ if ((cond)) \
+ PRINT_VERBOSE_ERROR; \
+ __warning_on((cond), (fmt), ##__VA_ARGS__); \
+ } while (0)
+
__attribute__ ((format (printf, 1, 2)))
-static inline void warning(const char *fmt, ...)
+static inline void __warning(const char *fmt, ...)
{
va_list args;
@@ -324,7 +377,7 @@ static inline void warning(const char *fmt, ...)
}
__attribute__ ((format (printf, 1, 2)))
-static inline void error(const char *fmt, ...)
+static inline void __error(const char *fmt, ...)
{
va_list args;
@@ -336,7 +389,7 @@ static inline void error(const char *fmt, ...)
}
__attribute__ ((format (printf, 2, 3)))
-static inline int warning_on(int condition, const char *fmt, ...)
+static inline int __warning_on(int condition, const char *fmt, ...)
{
va_list args;
@@ -353,7 +406,7 @@ static inline int warning_on(int condition, const char *fmt, ...)
}
__attribute__ ((format (printf, 2, 3)))
-static inline int error_on(int condition, const char *fmt, ...)
+static inline int __error_on(int condition, const char *fmt, ...)
{
va_list args;