xref: /dflybsd-src/contrib/zstd/lib/common/debug.h (revision a28cd43d19e8b720a6c852a4bbc5ae147a26165a)
1a28cd43dSSascha Wildner /* ******************************************************************
2a28cd43dSSascha Wildner  * debug
3a28cd43dSSascha Wildner  * Part of FSE library
4a28cd43dSSascha Wildner  * Copyright (c) 2013-2020, Yann Collet, Facebook, Inc.
5a28cd43dSSascha Wildner  *
6a28cd43dSSascha Wildner  * You can contact the author at :
7a28cd43dSSascha Wildner  * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
8a28cd43dSSascha Wildner  *
9a28cd43dSSascha Wildner  * This source code is licensed under both the BSD-style license (found in the
10a28cd43dSSascha Wildner  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
11a28cd43dSSascha Wildner  * in the COPYING file in the root directory of this source tree).
12a28cd43dSSascha Wildner  * You may select, at your option, one of the above-listed licenses.
13a28cd43dSSascha Wildner ****************************************************************** */
14a28cd43dSSascha Wildner 
15a28cd43dSSascha Wildner 
16a28cd43dSSascha Wildner /*
17a28cd43dSSascha Wildner  * The purpose of this header is to enable debug functions.
18a28cd43dSSascha Wildner  * They regroup assert(), DEBUGLOG() and RAWLOG() for run-time,
19a28cd43dSSascha Wildner  * and DEBUG_STATIC_ASSERT() for compile-time.
20a28cd43dSSascha Wildner  *
21a28cd43dSSascha Wildner  * By default, DEBUGLEVEL==0, which means run-time debug is disabled.
22a28cd43dSSascha Wildner  *
23a28cd43dSSascha Wildner  * Level 1 enables assert() only.
24a28cd43dSSascha Wildner  * Starting level 2, traces can be generated and pushed to stderr.
25a28cd43dSSascha Wildner  * The higher the level, the more verbose the traces.
26a28cd43dSSascha Wildner  *
27a28cd43dSSascha Wildner  * It's possible to dynamically adjust level using variable g_debug_level,
28a28cd43dSSascha Wildner  * which is only declared if DEBUGLEVEL>=2,
29a28cd43dSSascha Wildner  * and is a global variable, not multi-thread protected (use with care)
30a28cd43dSSascha Wildner  */
31a28cd43dSSascha Wildner 
32a28cd43dSSascha Wildner #ifndef DEBUG_H_12987983217
33a28cd43dSSascha Wildner #define DEBUG_H_12987983217
34a28cd43dSSascha Wildner 
35a28cd43dSSascha Wildner #if defined (__cplusplus)
36a28cd43dSSascha Wildner extern "C" {
37a28cd43dSSascha Wildner #endif
38a28cd43dSSascha Wildner 
39a28cd43dSSascha Wildner 
40a28cd43dSSascha Wildner /* static assert is triggered at compile time, leaving no runtime artefact.
41a28cd43dSSascha Wildner  * static assert only works with compile-time constants.
42a28cd43dSSascha Wildner  * Also, this variant can only be used inside a function. */
43a28cd43dSSascha Wildner #define DEBUG_STATIC_ASSERT(c) (void)sizeof(char[(c) ? 1 : -1])
44a28cd43dSSascha Wildner 
45a28cd43dSSascha Wildner 
46a28cd43dSSascha Wildner /* DEBUGLEVEL is expected to be defined externally,
47a28cd43dSSascha Wildner  * typically through compiler command line.
48a28cd43dSSascha Wildner  * Value must be a number. */
49a28cd43dSSascha Wildner #ifndef DEBUGLEVEL
50a28cd43dSSascha Wildner #  define DEBUGLEVEL 0
51a28cd43dSSascha Wildner #endif
52a28cd43dSSascha Wildner 
53a28cd43dSSascha Wildner 
54a28cd43dSSascha Wildner /* recommended values for DEBUGLEVEL :
55a28cd43dSSascha Wildner  * 0 : release mode, no debug, all run-time checks disabled
56a28cd43dSSascha Wildner  * 1 : enables assert() only, no display
57a28cd43dSSascha Wildner  * 2 : reserved, for currently active debug path
58a28cd43dSSascha Wildner  * 3 : events once per object lifetime (CCtx, CDict, etc.)
59a28cd43dSSascha Wildner  * 4 : events once per frame
60a28cd43dSSascha Wildner  * 5 : events once per block
61a28cd43dSSascha Wildner  * 6 : events once per sequence (verbose)
62a28cd43dSSascha Wildner  * 7+: events at every position (*very* verbose)
63a28cd43dSSascha Wildner  *
64a28cd43dSSascha Wildner  * It's generally inconvenient to output traces > 5.
65a28cd43dSSascha Wildner  * In which case, it's possible to selectively trigger high verbosity levels
66a28cd43dSSascha Wildner  * by modifying g_debug_level.
67a28cd43dSSascha Wildner  */
68a28cd43dSSascha Wildner 
69a28cd43dSSascha Wildner #if (DEBUGLEVEL>=1)
70a28cd43dSSascha Wildner #  define ZSTD_DEPS_NEED_ASSERT
71a28cd43dSSascha Wildner #  include "zstd_deps.h"
72a28cd43dSSascha Wildner #else
73a28cd43dSSascha Wildner #  ifndef assert   /* assert may be already defined, due to prior #include <assert.h> */
74a28cd43dSSascha Wildner #    define assert(condition) ((void)0)   /* disable assert (default) */
75a28cd43dSSascha Wildner #  endif
76a28cd43dSSascha Wildner #endif
77a28cd43dSSascha Wildner 
78a28cd43dSSascha Wildner #if (DEBUGLEVEL>=2)
79a28cd43dSSascha Wildner #  define ZSTD_DEPS_NEED_IO
80a28cd43dSSascha Wildner #  include "zstd_deps.h"
81a28cd43dSSascha Wildner extern int g_debuglevel; /* the variable is only declared,
82a28cd43dSSascha Wildner                             it actually lives in debug.c,
83a28cd43dSSascha Wildner                             and is shared by the whole process.
84a28cd43dSSascha Wildner                             It's not thread-safe.
85a28cd43dSSascha Wildner                             It's useful when enabling very verbose levels
86a28cd43dSSascha Wildner                             on selective conditions (such as position in src) */
87a28cd43dSSascha Wildner 
88a28cd43dSSascha Wildner #  define RAWLOG(l, ...) {                                       \
89a28cd43dSSascha Wildner                 if (l<=g_debuglevel) {                           \
90a28cd43dSSascha Wildner                     ZSTD_DEBUG_PRINT(__VA_ARGS__);               \
91a28cd43dSSascha Wildner             }   }
92a28cd43dSSascha Wildner #  define DEBUGLOG(l, ...) {                                     \
93a28cd43dSSascha Wildner                 if (l<=g_debuglevel) {                           \
94a28cd43dSSascha Wildner                     ZSTD_DEBUG_PRINT(__FILE__ ": " __VA_ARGS__); \
95a28cd43dSSascha Wildner                     ZSTD_DEBUG_PRINT(" \n");                     \
96a28cd43dSSascha Wildner             }   }
97a28cd43dSSascha Wildner #else
98a28cd43dSSascha Wildner #  define RAWLOG(l, ...)      {}    /* disabled */
99a28cd43dSSascha Wildner #  define DEBUGLOG(l, ...)    {}    /* disabled */
100a28cd43dSSascha Wildner #endif
101a28cd43dSSascha Wildner 
102a28cd43dSSascha Wildner 
103a28cd43dSSascha Wildner #if defined (__cplusplus)
104a28cd43dSSascha Wildner }
105a28cd43dSSascha Wildner #endif
106a28cd43dSSascha Wildner 
107a28cd43dSSascha Wildner #endif /* DEBUG_H_12987983217 */
108