1 #ifndef NVIM_LOG_H
2 #define NVIM_LOG_H
3 
4 #include <stdbool.h>
5 #include <stdio.h>
6 
7 #include "auto/config.h"
8 #include "nvim/macros.h"
9 
10 // USDT probes. Example invocation:
11 //     NVIM_PROBE(nvim_foo_bar, 1, string.data);
12 #if defined(HAVE_SYS_SDT_H)
13 # include <sys/sdt.h>  // NOLINT
14 # define NVIM_PROBE(name, n, ...) STAP_PROBE##n(neovim, name, __VA_ARGS__)
15 #else
16 # define NVIM_PROBE(name, n, ...)
17 #endif
18 
19 
20 #define TRACE_LOG_LEVEL 0
21 #define DEBUG_LOG_LEVEL 1
22 #define INFO_LOG_LEVEL 2
23 #define WARN_LOG_LEVEL 3
24 #define ERROR_LOG_LEVEL 4
25 
26 #define DLOG(...)
27 #define DLOGN(...)
28 #define ILOG(...)
29 #define ILOGN(...)
30 #define WLOG(...)
31 #define WLOGN(...)
32 #define ELOG(...)
33 #define ELOGN(...)
34 
35 #ifndef MIN_LOG_LEVEL
36 # define MIN_LOG_LEVEL INFO_LOG_LEVEL
37 #endif
38 
39 #define LOG(level, ...) logmsg((level), NULL, __func__, __LINE__, true, \
40                                __VA_ARGS__)
41 
42 #if MIN_LOG_LEVEL <= DEBUG_LOG_LEVEL
43 # undef DLOG
44 # undef DLOGN
45 # define DLOG(...) logmsg(DEBUG_LOG_LEVEL, NULL, __func__, __LINE__, true, \
46                           __VA_ARGS__)
47 # define DLOGN(...) logmsg(DEBUG_LOG_LEVEL, NULL, __func__, __LINE__, false, \
48                            __VA_ARGS__)
49 #endif
50 
51 #if MIN_LOG_LEVEL <= INFO_LOG_LEVEL
52 # undef ILOG
53 # undef ILOGN
54 # define ILOG(...) logmsg(INFO_LOG_LEVEL, NULL, __func__, __LINE__, true, \
55                           __VA_ARGS__)
56 # define ILOGN(...) logmsg(INFO_LOG_LEVEL, NULL, __func__, __LINE__, false, \
57                            __VA_ARGS__)
58 #endif
59 
60 #if MIN_LOG_LEVEL <= WARN_LOG_LEVEL
61 # undef WLOG
62 # undef WLOGN
63 # define WLOG(...) logmsg(WARN_LOG_LEVEL, NULL, __func__, __LINE__, true, \
64                           __VA_ARGS__)
65 # define WLOGN(...) logmsg(WARN_LOG_LEVEL, NULL, __func__, __LINE__, false, \
66                            __VA_ARGS__)
67 #endif
68 
69 #if MIN_LOG_LEVEL <= ERROR_LOG_LEVEL
70 # undef ELOG
71 # undef ELOGN
72 # define ELOG(...) logmsg(ERROR_LOG_LEVEL, NULL, __func__, __LINE__, true, \
73                           __VA_ARGS__)
74 # define ELOGN(...) logmsg(ERROR_LOG_LEVEL, NULL, __func__, __LINE__, false, \
75                            __VA_ARGS__)
76 #endif
77 
78 #ifdef HAVE_EXECINFO_BACKTRACE
79 # define LOG_CALLSTACK() log_callstack(__func__, __LINE__)
80 # define LOG_CALLSTACK_TO_FILE(fp) log_callstack_to_file(fp, __func__, __LINE__)
81 #endif
82 
83 #if NVIM_HAS_INCLUDE("sanitizer/asan_interface.h")
84 # include "sanitizer/asan_interface.h"
85 #endif
86 
87 #ifdef INCLUDE_GENERATED_DECLARATIONS
88 # include "log.h.generated.h"
89 #endif
90 #endif  // NVIM_LOG_H
91