summaryrefslogtreecommitdiff
path: root/tools/common/debug.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/common/debug.cpp')
-rw-r--r--tools/common/debug.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/tools/common/debug.cpp b/tools/common/debug.cpp
new file mode 100644
index 00000000..a3fb9956
--- /dev/null
+++ b/tools/common/debug.cpp
@@ -0,0 +1,80 @@
+/*
+ * MiniCargo - mrustc's minimal clone of cargo
+ * - By John Hodge (Mutabah/thePowersGang)
+ *
+ * debug.cpp
+ * - Debugging helpers
+ */
+#if defined(__MINGW32__)
+# define DISABLE_MULTITHREAD // Mingw32 doesn't have c++11 threads
+#endif
+#include <set>
+#include <iostream>
+#include "debug.h"
+#include <mutex>
+
+static int giIndentLevel = 0;
+static const char* gsDebugPhase = "";
+static ::std::set<::std::string> gmDisabledDebug;
+#ifndef DISABLE_MULTITHREAD
+static ::std::mutex gDebugLock;
+#endif
+
+void Debug_SetPhase(const char* phase_name)
+{
+ gsDebugPhase = phase_name;
+}
+bool Debug_IsEnabled()
+{
+ if( gmDisabledDebug.find(gsDebugPhase) != gmDisabledDebug.end() )
+ return false;
+ return true;
+}
+void Debug_DisablePhase(const char* phase_name)
+{
+ gmDisabledDebug.insert( ::std::string(phase_name) );
+}
+void Debug_Print(::std::function<void(::std::ostream& os)> cb)
+{
+ if( !Debug_IsEnabled() )
+ return ;
+#ifndef DISABLE_MULTITHREAD
+ ::std::unique_lock<::std::mutex> _lh { gDebugLock };
+#endif
+
+ ::std::cout << gsDebugPhase << "- ";
+ for(auto i = giIndentLevel; i --; )
+ ::std::cout << " ";
+ cb(::std::cout);
+ ::std::cout << ::std::endl;
+}
+void Debug_EnterScope(const char* name, dbg_cb_t cb)
+{
+ if( !Debug_IsEnabled() )
+ return ;
+#ifndef DISABLE_MULTITHREAD
+ ::std::unique_lock<::std::mutex> _lh { gDebugLock };
+#endif
+
+ ::std::cout << gsDebugPhase << "- ";
+ for(auto i = giIndentLevel; i --; )
+ ::std::cout << " ";
+ ::std::cout << ">>> " << name << "(";
+ cb(::std::cout);
+ ::std::cout << ")" << ::std::endl;
+ giIndentLevel ++;
+}
+void Debug_LeaveScope(const char* name, dbg_cb_t cb)
+{
+ if( !Debug_IsEnabled() )
+ return ;
+#ifndef DISABLE_MULTITHREAD
+ ::std::unique_lock<::std::mutex> _lh { gDebugLock };
+#endif
+
+ ::std::cout << gsDebugPhase << "- ";
+ giIndentLevel --;
+ for(auto i = giIndentLevel; i --; )
+ ::std::cout << " ";
+ ::std::cout << "<<< " << name << ::std::endl;
+}