summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinWX/Debugger/CodeView.cpp
diff options
context:
space:
mode:
authorLioncash <mathew1800@gmail.com>2014-07-17 21:33:51 -0400
committerLioncash <mathew1800@gmail.com>2014-08-04 00:45:07 -0400
commit0718937237db22d26e1b764b4733645c2b9f1562 (patch)
treef2cdfd9bd744acd87fd1862e5f4be80a93d4bdc5 /Source/Core/DolphinWX/Debugger/CodeView.cpp
parent15920d0f10f143a49b9861bff3d4e7b11913e74f (diff)
Common: Introduce the new Gekko disassembler to Common.
This moves the Gekko disassembler to Common where it should be. Having it in the Bochs disassembly Externals is incorrect. Unlike the PowerPC disassembler prior however, this one is updated to have an API that is more fitting for C++. e.g. Not needing to specify a string buffer and size. It does all of this under the hood. This modifies all the DebuggingInterfaces as necessary to handle this.
Diffstat (limited to 'Source/Core/DolphinWX/Debugger/CodeView.cpp')
-rw-r--r--Source/Core/DolphinWX/Debugger/CodeView.cpp108
1 files changed, 46 insertions, 62 deletions
diff --git a/Source/Core/DolphinWX/Debugger/CodeView.cpp b/Source/Core/DolphinWX/Debugger/CodeView.cpp
index 9d7b869518..7b18a5e9d8 100644
--- a/Source/Core/DolphinWX/Debugger/CodeView.cpp
+++ b/Source/Core/DolphinWX/Debugger/CodeView.cpp
@@ -2,6 +2,7 @@
// Licensed under GPLv2
// Refer to the license.txt file included.
+#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
@@ -189,15 +190,15 @@ void CCodeView::OnMouseUpL(wxMouseEvent& event)
u32 CCodeView::AddrToBranch(u32 addr)
{
- char disasm[256];
- m_debugger->Disassemble(addr, disasm, 256);
- const char *mojs = strstr(disasm, "->0x");
- if (mojs)
+ std::string disasm = m_debugger->Disassemble(addr);
+ size_t pos = disasm.find("->0x");
+
+ if (pos != std::string::npos)
{
- u32 dest;
- sscanf(mojs+4,"%08x", &dest);
- return dest;
+ std::string hex = disasm.substr(pos + 2);
+ return std::stoul(hex, nullptr, 16);
}
+
return 0;
}
@@ -253,16 +254,14 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event)
case IDM_COPYCODE:
{
- char disasm[256];
- m_debugger->Disassemble(m_selection, disasm, 256);
+ std::string disasm = m_debugger->Disassemble(m_selection);
wxTheClipboard->SetData(new wxTextDataObject(StrToWxStr(disasm)));
}
break;
case IDM_COPYHEX:
{
- char temp[24];
- sprintf(temp, "%08x", m_debugger->ReadInstruction(m_selection));
+ std::string temp = StringFromFormat("%08x", m_debugger->ReadInstruction(m_selection));
wxTheClipboard->SetData(new wxTextDataObject(StrToWxStr(temp)));
}
break;
@@ -280,9 +279,8 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event)
u32 end = start + symbol->size;
for (u32 addr = start; addr != end; addr += 4)
{
- char disasm[256];
- m_debugger->Disassemble(addr, disasm, 256);
- text = text + StringFromFormat("%08x: ", addr) + disasm + "\r\n";
+ std::string disasm = m_debugger->Disassemble(addr);
+ text += StringFromFormat("%08x: ", addr) + disasm + "\r\n";
}
wxTheClipboard->SetData(new wxTextDataObject(StrToWxStr(text)));
}
@@ -478,65 +476,51 @@ void CCodeView::OnPaint(wxPaintEvent& event)
// If running
if (m_debugger->IsAlive())
{
- char dis[256];
- m_debugger->Disassemble(address, dis, 256);
- char* dis2 = strchr(dis, '\t');
- char desc[256] = "";
+ std::vector<std::string> dis;
+ SplitString(m_debugger->Disassemble(address), '\t', dis);
+
+ static const size_t VALID_BRANCH_LENGTH = 10;
+ const std::string& opcode = dis[0];
+ const std::string& operands = dis[1];
+ std::string desc;
+
+ // look for hex strings to decode branches
+ std::string hex_str;
+ size_t pos = operands.find("0x8");
+ if (pos != std::string::npos)
+ {
+ hex_str = operands.substr(pos);
+ }
- // If we have a code
- if (dis2)
+ if (hex_str.length() == VALID_BRANCH_LENGTH)
{
- *dis2 = 0;
- dis2++;
- // look for hex strings to decode branches
- const char* mojs = strstr(dis2, "0x8");
- if (mojs)
- {
- for (int k = 0; k < 8; k++)
- {
- bool found = false;
- for (int j = 0; j < 22; j++)
- {
- if (mojs[k + 2] == "0123456789ABCDEFabcdef"[j])
- found = true;
- }
- if (!found)
- {
- mojs = nullptr;
- break;
- }
- }
- }
- if (mojs)
- {
- int offs;
- sscanf(mojs + 2, "%08x", &offs);
- branches[numBranches].src = rowY1 + m_rowHeight / 2;
- branches[numBranches].srcAddr = address / m_align;
- branches[numBranches++].dst = (int)(rowY1 + ((s64)(u32)offs - (s64)(u32)address) * m_rowHeight / m_align + m_rowHeight / 2);
- sprintf(desc, "-->%s", m_debugger->GetDescription(offs).c_str());
- dc.SetTextForeground(wxTheColourDatabase->Find("PURPLE")); // the -> arrow illustrations are purple
- }
- else
- {
- dc.SetTextForeground(*wxBLACK);
- }
+ u32 offs = std::stoul(hex_str, nullptr, 16);
- dc.DrawText(StrToWxStr(dis2), 17 + 17*charWidth, rowY1);
- // ------------
+ branches[numBranches].src = rowY1 + m_rowHeight / 2;
+ branches[numBranches].srcAddr = address / m_align;
+ branches[numBranches++].dst = (int)(rowY1 + ((s64)(u32)offs - (s64)(u32)address) * m_rowHeight / m_align + m_rowHeight / 2);
+ desc = StringFromFormat("-->%s", m_debugger->GetDescription(offs).c_str());
+ dc.SetTextForeground(wxTheColourDatabase->Find("PURPLE")); // the -> arrow illustrations are purple
}
+ else
+ {
+ dc.SetTextForeground(*wxBLACK);
+ }
+
+ dc.DrawText(StrToWxStr(operands), 17 + 17*charWidth, rowY1);
+ // ------------
// Show blr as its' own color
- if (strcmp(dis, "blr"))
+ if (opcode == "blr")
dc.SetTextForeground(wxTheColourDatabase->Find("DARK GREEN"));
else
dc.SetTextForeground(wxTheColourDatabase->Find("VIOLET"));
- dc.DrawText(StrToWxStr(dis), 17 + (m_plain ? 1*charWidth : 9*charWidth), rowY1);
+ dc.DrawText(StrToWxStr(opcode), 17 + (m_plain ? 1*charWidth : 9*charWidth), rowY1);
- if (desc[0] == 0)
+ if (desc.empty())
{
- strcpy(desc, m_debugger->GetDescription(address).c_str());
+ desc = m_debugger->GetDescription(address);
}
if (!m_plain)
@@ -545,7 +529,7 @@ void CCodeView::OnPaint(wxPaintEvent& event)
//char temp[256];
//UnDecorateSymbolName(desc,temp,255,UNDNAME_COMPLETE);
- if (strlen(desc))
+ if (!desc.empty())
{
dc.DrawText(StrToWxStr(desc), 17 + 35 * charWidth, rowY1);
}