History

Initial public commit for Dis VM

arr committed 10 years ago

Commit f95902eNo parent (first commit)40 files · +9358 −0Browse files

Showing the changes to src/include/debug.h (1 of 40 files). Show all

Unified · Split

src/include/debug.h+99−0
@@ -0,0 +1,99 @@
1//
2// Dis VM
3// File: debug.h
4// Author: arr
5//
6
7#ifndef _DISVM_SRC_INCLUDE_DEBUG_H_
8#define _DISVM_SRC_INCLUDE_DEBUG_H_
9
10#include <array>
11#include <cstdarg>
12#include <cassert>
13
14namespace disvm
15{
16 namespace debug
17 {
18 // Components that have tracing
19 enum class component_trace_t
20 {
21 builtin,
22 module,
23 thread,
24 stack,
25 channel,
26 exception,
27 memory, // Noisy component
28 addressing, // Noisy component [DEBUG build only]
29
30 // Potentially logged from a VM extension.
31 scheduler,
32 garbage_collector,
33
34 // Tracking purposes
35 last = garbage_collector
36 };
37
38 // Trace component enable state.
39 extern std::array<bool, static_cast<std::size_t>(disvm::debug::component_trace_t::last) + 1> trace_enabled;
40
41 // Set tracing for a component
42 inline void set_component_tracing(const component_trace_t c, bool is_enabled)
43 {
44 trace_enabled[static_cast<const std::size_t>(c)] = is_enabled;
45 }
46
47 // Check if tracing is enabled on a component (compile time optimization)
48 template<component_trace_t C>
49 bool is_component_tracing_enabled()
50 {
51 return trace_enabled[static_cast<const std::size_t>(C)];
52 }
53
54 // Check if tracing is enabled on a component
55 inline bool is_component_tracing_enabled(const component_trace_t c)
56 {
57 return trace_enabled[static_cast<const std::size_t>(c)];
58 }
59
60 // Message log level
61 enum class log_level_t
62 {
63 warning,
64 debug,
65 };
66
67 using log_callback_t = void(*)(const component_trace_t origin, const log_level_t level, const char *msg_fmt, std::va_list args);
68
69 // Set the logging callback
70 // Returns the previous callback.
71 log_callback_t set_logging_callback(log_callback_t cb);
72
73 // Log a message
74 void log_msg(const component_trace_t origin, const log_level_t level, const char *msg_fmt, ...);
75
76 //
77 // Memory debugging
78 //
79
80 inline void assign_debug_memory(void *dest, std::size_t size_in_bytes)
81 {
82#ifndef NDEBUG
83 const auto debug_memory = int{ 0xda }; // Dante Alighieri's initials
84 std::memset(dest, debug_memory, size_in_bytes);
85#endif
86 }
87
88 template<typename T>
89 void assign_debug_pointer(T **t)
90 {
91#ifndef NDEBUG
92 assert(t != nullptr);
93 *t = reinterpret_cast<T *>(0xbada110c);
94#endif
95 }
96 }
97}
98
99#endif // _DISVM_SRC_INCLUDE_DEBUG_H_