From 3ef6b51848a977157b882c5180e5ac799b52674a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 30 Sep 2016 00:16:14 -0400 Subject: [PATCH 1/4] RegisterView: Move FormatSpecifier enum into CRegTable Considering there's a public method in the class using it, leaving the definition in the cpp file can cause a linker error if any method outside that cpp file calls it for one reason or another. --- .../Core/DolphinWX/Debugger/RegisterView.cpp | 28 ++++++++----------- Source/Core/DolphinWX/Debugger/RegisterView.h | 12 ++++++-- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/Source/Core/DolphinWX/Debugger/RegisterView.cpp b/Source/Core/DolphinWX/Debugger/RegisterView.cpp index 5c0a7e105c..356b30279e 100644 --- a/Source/Core/DolphinWX/Debugger/RegisterView.cpp +++ b/Source/Core/DolphinWX/Debugger/RegisterView.cpp @@ -36,16 +36,6 @@ enum IDM_VIEW_INT }; -enum class FormatSpecifier -{ - Hex8, - Hex16, - Float, - Double, - UInt, - Int -}; - constexpr const char* special_reg_names[] = {"PC", "LR", "CTR", "CR", "FPSCR", "MSR", "SRR0", "SRR1", "Exceptions", "Int Mask", "Int Cause", "DSISR", "DAR", "PT hashmask"}; @@ -541,27 +531,33 @@ void CRegisterView::OnPopupMenu(wxCommandEvent& event) Refresh(); break; case IDM_VIEW_HEX8: - m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, FormatSpecifier::Hex8); + m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, + CRegTable::FormatSpecifier::Hex8); Refresh(); break; case IDM_VIEW_HEX16: - m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, FormatSpecifier::Hex16); + m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, + CRegTable::FormatSpecifier::Hex16); Refresh(); break; case IDM_VIEW_INT: - m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, FormatSpecifier::Int); + m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, + CRegTable::FormatSpecifier::Int); Refresh(); break; case IDM_VIEW_UINT: - m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, FormatSpecifier::UInt); + m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, + CRegTable::FormatSpecifier::UInt); Refresh(); break; case IDM_VIEW_FLOAT: - m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, FormatSpecifier::Float); + m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, + CRegTable::FormatSpecifier::Float); Refresh(); break; case IDM_VIEW_DOUBLE: - m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, FormatSpecifier::Double); + m_register_table->SetRegisterFormat(m_selectedColumn, m_selectedRow, + CRegTable::FormatSpecifier::Double); Refresh(); break; } diff --git a/Source/Core/DolphinWX/Debugger/RegisterView.h b/Source/Core/DolphinWX/Debugger/RegisterView.h index 886a745b80..48eee91def 100644 --- a/Source/Core/DolphinWX/Debugger/RegisterView.h +++ b/Source/Core/DolphinWX/Debugger/RegisterView.h @@ -28,11 +28,19 @@ #define NUM_SPECIALS 14 -enum class FormatSpecifier; - class CRegTable : public wxGridTableBase { public: + enum class FormatSpecifier + { + Hex8, + Hex16, + Float, + Double, + UInt, + Int + }; + CRegTable(); int GetNumberCols() override { return 9; } int GetNumberRows() override { return 32 + NUM_SPECIALS; } From d080b0e8a564c47c1de15fa760bc0e68850efeb8 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 30 Sep 2016 00:33:06 -0400 Subject: [PATCH 2/4] RegisterView: Move CRegTable implementation details into the cpp file --- .../Core/DolphinWX/Debugger/RegisterView.cpp | 370 +++++++++--------- Source/Core/DolphinWX/Debugger/RegisterView.h | 5 - 2 files changed, 189 insertions(+), 186 deletions(-) diff --git a/Source/Core/DolphinWX/Debugger/RegisterView.cpp b/Source/Core/DolphinWX/Debugger/RegisterView.cpp index 356b30279e..ff5593ee83 100644 --- a/Source/Core/DolphinWX/Debugger/RegisterView.cpp +++ b/Source/Core/DolphinWX/Debugger/RegisterView.cpp @@ -23,6 +23,8 @@ // F-zero 80005e60 wtf?? +namespace +{ enum { IDM_WATCHADDRESS, @@ -40,154 +42,28 @@ constexpr const char* special_reg_names[] = {"PC", "LR", "CTR", "CR", "MSR", "SRR0", "SRR1", "Exceptions", "Int Mask", "Int Cause", "DSISR", "DAR", "PT hashmask"}; -CRegTable::CRegTable() -{ - m_formatRegs.fill(FormatSpecifier::Hex8); - - for (auto& entry : m_formatFRegs) - entry.fill(FormatSpecifier::Hex16); - - memset(m_CachedRegs, 0, sizeof(m_CachedRegs)); - memset(m_CachedSpecialRegs, 0, sizeof(m_CachedSpecialRegs)); - memset(m_CachedFRegs, 0, sizeof(m_CachedFRegs)); - memset(m_CachedRegHasChanged, 0, sizeof(m_CachedRegHasChanged)); - memset(m_CachedSpecialRegHasChanged, 0, sizeof(m_CachedSpecialRegHasChanged)); - memset(m_CachedFRegHasChanged, 0, sizeof(m_CachedFRegHasChanged)); -} - -wxString CRegTable::GetFormatString(FormatSpecifier specifier) +wxString GetFormatString(CRegTable::FormatSpecifier specifier) { switch (specifier) { - case FormatSpecifier::Hex8: + case CRegTable::FormatSpecifier::Hex8: return wxString("%08x"); - case FormatSpecifier::Hex16: + case CRegTable::FormatSpecifier::Hex16: return wxString("%016llx"); - case FormatSpecifier::Float: + case CRegTable::FormatSpecifier::Float: return wxString("%g"); - case FormatSpecifier::Double: + case CRegTable::FormatSpecifier::Double: return wxString("%g"); - case FormatSpecifier::UInt: + case CRegTable::FormatSpecifier::UInt: return wxString("%u"); - case FormatSpecifier::Int: + case CRegTable::FormatSpecifier::Int: return wxString("%i"); default: return wxString(""); } } -wxString CRegTable::FormatGPR(int reg_index) -{ - if (m_formatRegs[reg_index] == FormatSpecifier::Int) - { - return wxString::Format(GetFormatString(m_formatRegs[reg_index]), - static_cast(GPR(reg_index))); - } - if (m_formatRegs[reg_index] == FormatSpecifier::Float) - { - float value; - std::memcpy(&value, &GPR(reg_index), sizeof(float)); - return wxString::Format(GetFormatString(m_formatRegs[reg_index]), value); - } - return wxString::Format(GetFormatString(m_formatRegs[reg_index]), GPR(reg_index)); -} - -wxString CRegTable::FormatFPR(int reg_index, int reg_part) -{ - if (m_formatFRegs[reg_index][reg_part] == FormatSpecifier::Double) - { - double reg = (reg_part == 0) ? rPS0(reg_index) : rPS1(reg_index); - return wxString::Format(GetFormatString(m_formatFRegs[reg_index][reg_part]), reg); - } - u64 reg = (reg_part == 0) ? riPS0(reg_index) : riPS1(reg_index); - return wxString::Format(GetFormatString(m_formatFRegs[reg_index][reg_part]), reg); -} - -bool CRegTable::TryParseGPR(wxString str, FormatSpecifier format, u32* value) -{ - if (format == FormatSpecifier::Hex8) - { - unsigned long val; - if (str.ToCULong(&val, 16)) - { - *value = static_cast(val); - return true; - } - return false; - } - if (format == FormatSpecifier::Int) - { - long signed_val; - if (str.ToCLong(&signed_val)) - { - *value = static_cast(signed_val); - return true; - } - return false; - } - if (format == FormatSpecifier::UInt) - { - unsigned long val; - if (str.ToCULong(&val)) - { - *value = static_cast(val); - return true; - } - return false; - } - if (format == FormatSpecifier::Float) - { - double double_val; - if (str.ToCDouble(&double_val)) - { - float float_val = static_cast(double_val); - std::memcpy(value, &float_val, sizeof(float)); - return true; - } - return false; - } - return false; -} - -bool CRegTable::TryParseFPR(wxString str, FormatSpecifier format, unsigned long long* value) -{ - if (format == FormatSpecifier::Hex16) - { - return str.ToULongLong(value, 16); - } - if (format == FormatSpecifier::Double) - { - double double_val; - if (str.ToCDouble(&double_val)) - { - std::memcpy(value, &double_val, sizeof(u64)); - return true; - } - return false; - } - return false; -} - -void CRegTable::SetRegisterFormat(int col, int row, FormatSpecifier specifier) -{ - if (row >= 32) - return; - - switch (col) - { - case 1: - m_formatRegs[row] = specifier; - return; - case 3: - m_formatFRegs[row][0] = specifier; - return; - case 4: - m_formatFRegs[row][1] = specifier; - return; - } -} - -u32 CRegTable::GetSpecialRegValue(int reg) +u32 GetSpecialRegValue(int reg) { switch (reg) { @@ -224,6 +100,185 @@ u32 CRegTable::GetSpecialRegValue(int reg) } } +void SetSpecialRegValue(int reg, u32 value) +{ + switch (reg) + { + case 0: + PowerPC::ppcState.pc = value; + break; + case 1: + PowerPC::ppcState.spr[SPR_LR] = value; + break; + case 2: + PowerPC::ppcState.spr[SPR_CTR] = value; + break; + case 3: + SetCR(value); + break; + case 4: + PowerPC::ppcState.fpscr = value; + break; + case 5: + PowerPC::ppcState.msr = value; + break; + case 6: + PowerPC::ppcState.spr[SPR_SRR0] = value; + break; + case 7: + PowerPC::ppcState.spr[SPR_SRR1] = value; + break; + case 8: + PowerPC::ppcState.Exceptions = value; + break; + // Should we just change the value, or use ProcessorInterface::SetInterrupt() to make the system + // aware? + // case 9: return ProcessorInterface::GetMask(); + // case 10: return ProcessorInterface::GetCause(); + case 11: + PowerPC::ppcState.spr[SPR_DSISR] = value; + break; + case 12: + PowerPC::ppcState.spr[SPR_DAR] = value; + break; + // case 13: (PowerPC::ppcState.pagetable_hashmask << 6) | PowerPC::ppcState.pagetable_base; + default: + return; + } +} + +bool TryParseFPR(wxString str, CRegTable::FormatSpecifier format, unsigned long long* value) +{ + if (format == CRegTable::FormatSpecifier::Hex16) + return str.ToULongLong(value, 16); + + if (format == CRegTable::FormatSpecifier::Double) + { + double double_val; + if (str.ToCDouble(&double_val)) + { + std::memcpy(value, &double_val, sizeof(u64)); + return true; + } + + return false; + } + + return false; +} + +bool TryParseGPR(wxString str, CRegTable::FormatSpecifier format, u32* value) +{ + if (format == CRegTable::FormatSpecifier::Hex8) + { + unsigned long val; + if (str.ToCULong(&val, 16)) + { + *value = static_cast(val); + return true; + } + return false; + } + + if (format == CRegTable::FormatSpecifier::Int) + { + long signed_val; + if (str.ToCLong(&signed_val)) + { + *value = static_cast(signed_val); + return true; + } + return false; + } + + if (format == CRegTable::FormatSpecifier::UInt) + { + unsigned long val; + if (str.ToCULong(&val)) + { + *value = static_cast(val); + return true; + } + return false; + } + + if (format == CRegTable::FormatSpecifier::Float) + { + double double_val; + if (str.ToCDouble(&double_val)) + { + float float_val = static_cast(double_val); + std::memcpy(value, &float_val, sizeof(float)); + return true; + } + return false; + } + return false; +} + +} // Anonymous namespace + +CRegTable::CRegTable() +{ + m_formatRegs.fill(FormatSpecifier::Hex8); + + for (auto& entry : m_formatFRegs) + entry.fill(FormatSpecifier::Hex16); + + memset(m_CachedRegs, 0, sizeof(m_CachedRegs)); + memset(m_CachedSpecialRegs, 0, sizeof(m_CachedSpecialRegs)); + memset(m_CachedFRegs, 0, sizeof(m_CachedFRegs)); + memset(m_CachedRegHasChanged, 0, sizeof(m_CachedRegHasChanged)); + memset(m_CachedSpecialRegHasChanged, 0, sizeof(m_CachedSpecialRegHasChanged)); + memset(m_CachedFRegHasChanged, 0, sizeof(m_CachedFRegHasChanged)); +} + +wxString CRegTable::FormatGPR(int reg_index) +{ + if (m_formatRegs[reg_index] == FormatSpecifier::Int) + { + return wxString::Format(GetFormatString(m_formatRegs[reg_index]), + static_cast(GPR(reg_index))); + } + if (m_formatRegs[reg_index] == FormatSpecifier::Float) + { + float value; + std::memcpy(&value, &GPR(reg_index), sizeof(float)); + return wxString::Format(GetFormatString(m_formatRegs[reg_index]), value); + } + return wxString::Format(GetFormatString(m_formatRegs[reg_index]), GPR(reg_index)); +} + +wxString CRegTable::FormatFPR(int reg_index, int reg_part) +{ + if (m_formatFRegs[reg_index][reg_part] == FormatSpecifier::Double) + { + double reg = (reg_part == 0) ? rPS0(reg_index) : rPS1(reg_index); + return wxString::Format(GetFormatString(m_formatFRegs[reg_index][reg_part]), reg); + } + u64 reg = (reg_part == 0) ? riPS0(reg_index) : riPS1(reg_index); + return wxString::Format(GetFormatString(m_formatFRegs[reg_index][reg_part]), reg); +} + +void CRegTable::SetRegisterFormat(int col, int row, FormatSpecifier specifier) +{ + if (row >= 32) + return; + + switch (col) + { + case 1: + m_formatRegs[row] = specifier; + return; + case 3: + m_formatFRegs[row][0] = specifier; + return; + case 4: + m_formatFRegs[row][1] = specifier; + return; + } +} + wxString CRegTable::GetValue(int row, int col) { if (row < 32) @@ -315,53 +370,6 @@ wxString CRegTable::GetValue(int row, int col) return wxEmptyString; } -void CRegTable::SetSpecialRegValue(int reg, u32 value) -{ - switch (reg) - { - case 0: - PowerPC::ppcState.pc = value; - break; - case 1: - PowerPC::ppcState.spr[SPR_LR] = value; - break; - case 2: - PowerPC::ppcState.spr[SPR_CTR] = value; - break; - case 3: - SetCR(value); - break; - case 4: - PowerPC::ppcState.fpscr = value; - break; - case 5: - PowerPC::ppcState.msr = value; - break; - case 6: - PowerPC::ppcState.spr[SPR_SRR0] = value; - break; - case 7: - PowerPC::ppcState.spr[SPR_SRR1] = value; - break; - case 8: - PowerPC::ppcState.Exceptions = value; - break; - // Should we just change the value, or use ProcessorInterface::SetInterrupt() to make the system - // aware? - // case 9: return ProcessorInterface::GetMask(); - // case 10: return ProcessorInterface::GetCause(); - case 11: - PowerPC::ppcState.spr[SPR_DSISR] = value; - break; - case 12: - PowerPC::ppcState.spr[SPR_DAR] = value; - break; - // case 13: (PowerPC::ppcState.pagetable_hashmask << 6) | PowerPC::ppcState.pagetable_base; - default: - return; - } -} - void CRegTable::SetValue(int row, int col, const wxString& strNewVal) { if (row < 32) diff --git a/Source/Core/DolphinWX/Debugger/RegisterView.h b/Source/Core/DolphinWX/Debugger/RegisterView.h index 48eee91def..60d6e5c979 100644 --- a/Source/Core/DolphinWX/Debugger/RegisterView.h +++ b/Source/Core/DolphinWX/Debugger/RegisterView.h @@ -61,13 +61,8 @@ private: std::array m_formatRegs; std::array, 32> m_formatFRegs; - u32 GetSpecialRegValue(int reg); - void SetSpecialRegValue(int reg, u32 value); - wxString GetFormatString(FormatSpecifier specifier); wxString FormatGPR(int reg_index); wxString FormatFPR(int reg_index, int reg_part); - bool TryParseGPR(wxString str, FormatSpecifier format, u32* value); - bool TryParseFPR(wxString str, FormatSpecifier format, unsigned long long int* value); DECLARE_NO_COPY_CLASS(CRegTable); }; From 212cf4c7914e9d50d72e2f541a1c7240efd67961 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 30 Sep 2016 00:37:08 -0400 Subject: [PATCH 3/4] RegisterView: Convert #define into a static constant in CRegTable --- Source/Core/DolphinWX/Debugger/RegisterView.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/Core/DolphinWX/Debugger/RegisterView.h b/Source/Core/DolphinWX/Debugger/RegisterView.h index 60d6e5c979..8589cd176a 100644 --- a/Source/Core/DolphinWX/Debugger/RegisterView.h +++ b/Source/Core/DolphinWX/Debugger/RegisterView.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include #include @@ -26,8 +27,6 @@ // Interrupt Mask (PI) // Interrupt Cause(PI) -#define NUM_SPECIALS 14 - class CRegTable : public wxGridTableBase { public: @@ -52,6 +51,8 @@ public: void UpdateCachedRegs(); private: + static constexpr size_t NUM_SPECIALS = 14; + u32 m_CachedRegs[32]; u32 m_CachedSpecialRegs[NUM_SPECIALS]; u64 m_CachedFRegs[32][2]; From 567d0204dd0406612143c140bb48e634dfbcb226 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 30 Sep 2016 01:11:52 -0400 Subject: [PATCH 4/4] RegisterView: Get rid of explicit memsets in CRegTable's constructor Also gets rid of an unnecessary fill. This is done by just default initializing the arrays --- Source/Core/DolphinWX/Debugger/RegisterView.cpp | 9 --------- Source/Core/DolphinWX/Debugger/RegisterView.h | 14 +++++++------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/Source/Core/DolphinWX/Debugger/RegisterView.cpp b/Source/Core/DolphinWX/Debugger/RegisterView.cpp index ff5593ee83..f7145fd577 100644 --- a/Source/Core/DolphinWX/Debugger/RegisterView.cpp +++ b/Source/Core/DolphinWX/Debugger/RegisterView.cpp @@ -220,17 +220,8 @@ bool TryParseGPR(wxString str, CRegTable::FormatSpecifier format, u32* value) CRegTable::CRegTable() { - m_formatRegs.fill(FormatSpecifier::Hex8); - for (auto& entry : m_formatFRegs) entry.fill(FormatSpecifier::Hex16); - - memset(m_CachedRegs, 0, sizeof(m_CachedRegs)); - memset(m_CachedSpecialRegs, 0, sizeof(m_CachedSpecialRegs)); - memset(m_CachedFRegs, 0, sizeof(m_CachedFRegs)); - memset(m_CachedRegHasChanged, 0, sizeof(m_CachedRegHasChanged)); - memset(m_CachedSpecialRegHasChanged, 0, sizeof(m_CachedSpecialRegHasChanged)); - memset(m_CachedFRegHasChanged, 0, sizeof(m_CachedFRegHasChanged)); } wxString CRegTable::FormatGPR(int reg_index) diff --git a/Source/Core/DolphinWX/Debugger/RegisterView.h b/Source/Core/DolphinWX/Debugger/RegisterView.h index 8589cd176a..5da6c206fe 100644 --- a/Source/Core/DolphinWX/Debugger/RegisterView.h +++ b/Source/Core/DolphinWX/Debugger/RegisterView.h @@ -53,13 +53,13 @@ public: private: static constexpr size_t NUM_SPECIALS = 14; - u32 m_CachedRegs[32]; - u32 m_CachedSpecialRegs[NUM_SPECIALS]; - u64 m_CachedFRegs[32][2]; - bool m_CachedRegHasChanged[32]; - bool m_CachedSpecialRegHasChanged[NUM_SPECIALS]; - bool m_CachedFRegHasChanged[32][2]; - std::array m_formatRegs; + std::array m_CachedRegs{}; + std::array m_CachedSpecialRegs{}; + std::array, 32> m_CachedFRegs{}; + std::array m_CachedRegHasChanged{}; + std::array m_CachedSpecialRegHasChanged{}; + std::array, 32> m_CachedFRegHasChanged{}; + std::array m_formatRegs{}; std::array, 32> m_formatFRegs; wxString FormatGPR(int reg_index);