From f1e56cd353df38bbb3a295d6f2243cd85e13f7a8 Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Sat, 30 Nov 2024 12:04:23 +0100 Subject: [PATCH] Make the debugger a global object. --- debugger/debugger.cpp | 7 ++++++- debugger/debugger.h | 18 +++++++++++++++++- main.cpp | 8 ++++---- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/debugger/debugger.cpp b/debugger/debugger.cpp index 75d6c9a..0f59dee 100644 --- a/debugger/debugger.cpp +++ b/debugger/debugger.cpp @@ -22,6 +22,7 @@ along with this program. If not, see . #include #include #include +#include #include #include #include "memaccess.h" @@ -445,7 +446,11 @@ static void delete_prompt() { #endif } -void enter_debugger() { +DppcDebugger::DppcDebugger() { + +} + +void DppcDebugger::enter_debugger() { string inp, cmd, addr_str, expr_str, reg_expr, last_cmd, reg_value_str, inst_string, inst_num_str, profile_name, sub_cmd; uint32_t addr, inst_grab; diff --git a/debugger/debugger.h b/debugger/debugger.h index 0744b73..3a3b078 100644 --- a/debugger/debugger.h +++ b/debugger/debugger.h @@ -22,6 +22,22 @@ along with this program. If not, see . #ifndef DEBUGGER_H_ #define DEBUGGER_H_ -void enter_debugger(); +#include + +class DppcDebugger { +public: + static DppcDebugger* get_instance() { + if (!debugger_obj) { + debugger_obj = std::unique_ptr(new DppcDebugger()); + } + return debugger_obj.get(); + }; + + void enter_debugger(); + +private: + inline static std::unique_ptr debugger_obj{nullptr}; + explicit DppcDebugger(); // private constructor to implement a singleton +}; #endif // DEBUGGER_H_ diff --git a/main.cpp b/main.cpp index 7fdb708..c64983c 100644 --- a/main.cpp +++ b/main.cpp @@ -208,7 +208,7 @@ int main(int argc, char** argv) { // sent to the logfile only). cerr << message.preamble << message.indentation << message.prefix << message.message << endl; power_off_reason = po_enter_debugger; - enter_debugger(); + DppcDebugger::get_instance()->enter_debugger(); // Ensure that NVRAM and other state is persisted before we terminate. delete gMachineObj.release(); @@ -282,15 +282,15 @@ void run_machine(std::string machine_str, std::string bootrom_path, uint32_t exe switch (execution_mode) { case interpreter: power_off_reason = po_starting_up; - enter_debugger(); + DppcDebugger::get_instance()->enter_debugger(); break; case threaded_int: power_off_reason = po_starting_up; - enter_debugger(); + DppcDebugger::get_instance()->enter_debugger(); break; case debugger: power_off_reason = po_enter_debugger; - enter_debugger(); + DppcDebugger::get_instance()->enter_debugger(); break; default: LOG_F(ERROR, "Invalid EXECUTION MODE");