diff options
| author | hrydgard <hrydgard@gmail.com> | 2008-08-21 17:22:55 +0000 |
|---|---|---|
| committer | hrydgard <hrydgard@gmail.com> | 2008-08-21 17:22:55 +0000 |
| commit | 5e4da92d428adbaed6f82d20bacd54965aceb717 (patch) | |
| tree | efe7b2c0f84db55e0691a058df303640b832f5df /Source/Core/DebuggerWX/src | |
| parent | 4e9b5a40fde8d8043e4b7f39fc8f862103c52b8e (diff) | |
Very basic JIT results viewer.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@254 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DebuggerWX/src')
| -rw-r--r-- | Source/Core/DebuggerWX/src/CodeView.cpp | 24 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/src/CodeWindow.cpp | 17 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/src/CodeWindow.h | 2 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/src/JitWindow.cpp | 211 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/src/JitWindow.h | 81 |
5 files changed, 312 insertions, 23 deletions
diff --git a/Source/Core/DebuggerWX/src/CodeView.cpp b/Source/Core/DebuggerWX/src/CodeView.cpp index 42c6f6d938..e31a3ab9e7 100644 --- a/Source/Core/DebuggerWX/src/CodeView.cpp +++ b/Source/Core/DebuggerWX/src/CodeView.cpp @@ -19,6 +19,8 @@ #include "Common.h"
#include "CodeView.h"
+#include "JitWindow.h"
+
#include <wx/event.h>
#include <wx/clipbrd.h>
@@ -31,7 +33,7 @@ enum IDM_COPYCODE,
IDM_INSERTBLR,
IDM_RUNTOHERE,
- IDM_DYNARECRESULTS,
+ IDM_JITRESULTS,
};
@@ -158,9 +160,7 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event) #if wxUSE_CLIPBOARD
case IDM_COPYADDRESS:
- {
wxTheClipboard->SetData(new wxTextDataObject(wxString::Format(_T("%08x"), selection)));
- }
break;
case IDM_COPYCODE:
@@ -168,35 +168,27 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event) break;
case IDM_COPYHEX:
- {
+ {
char temp[24];
sprintf(temp, "%08x", debugger->readMemory(selection));
wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(temp)));
- }
+ }
break;
#endif
case IDM_RUNTOHERE:
- {
debugger->setBreakpoint(selection);
debugger->runToBreakpoint();
redraw();
- }
break;
case IDM_INSERTBLR:
- {
debugger->insertBLR(selection);
redraw();
break;
- }
- case IDM_DYNARECRESULTS:
- {
-// CDynaViewDlg::ViewAddr(selection);
-// CDynaViewDlg::Show(TRUE);
-// MessageBox(NULL, "not impl", "CtrlDisAsmView", MB_OK);
- }
+ case IDM_JITRESULTS:
+ CJitWindow::ViewAddr(selection);
break;
}
@@ -219,7 +211,7 @@ void CCodeView::OnMouseUpR(wxMouseEvent& event) #endif
menu.Append(IDM_RUNTOHERE, _T("&Run To Here"));
menu.Append(IDM_INSERTBLR, wxString::FromAscii("Insert &blr"));
- //menu.Append(IDM_DYNARECRESULTS, "Copy &address");
+ menu.Append(IDM_JITRESULTS, wxString::FromAscii("PPC vs X86"));
PopupMenu(&menu);
event.Skip(true);
}
diff --git a/Source/Core/DebuggerWX/src/CodeWindow.cpp b/Source/Core/DebuggerWX/src/CodeWindow.cpp index 544175552d..79b66300eb 100644 --- a/Source/Core/DebuggerWX/src/CodeWindow.cpp +++ b/Source/Core/DebuggerWX/src/CodeWindow.cpp @@ -15,13 +15,16 @@ // Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
+#include "IniFile.h"
+#include "Host.h"
+
#include "Debugger.h"
#include "RegisterWindow.h"
#include "LogWindow.h"
#include "BreakpointWindow.h"
#include "MemoryWindow.h"
-#include "IniFile.h"
+#include "JitWindow.h"
#include "wx/button.h"
#include "wx/textctrl.h"
@@ -32,20 +35,17 @@ #include "CodeWindow.h"
#include "CodeView.h"
+
+#include "Core.h"
+#include "LogManager.h"
#include "HW/CPU.h"
#include "PowerPC/PowerPC.h"
-#include "Host.h"
-
-
#include "Debugger/PPCDebugInterface.h"
#include "Debugger/Debugger_SymbolMap.h"
#include "PowerPC/PPCAnalyst.h"
#include "PowerPC/Jit64/Jit.h"
#include "PowerPC/Jit64/JitCache.h"
-#include "Core.h"
-#include "LogManager.h"
-
// ugly that this lib included code from the main
#include "../../DolphinWX/src/Globals.h"
@@ -194,6 +194,9 @@ void CCodeWindow::CreateGUIControls(const SCoreStartupParameter& _LocalCoreStart m_MemoryWindow = new CMemoryWindow(this);
m_MemoryWindow->Show(true);
+
+ m_JitWindow = new CJitWindow(this);
+ m_JitWindow->Show(true);
}
diff --git a/Source/Core/DebuggerWX/src/CodeWindow.h b/Source/Core/DebuggerWX/src/CodeWindow.h index 8d8684f736..d56038a54e 100644 --- a/Source/Core/DebuggerWX/src/CodeWindow.h +++ b/Source/Core/DebuggerWX/src/CodeWindow.h @@ -31,6 +31,7 @@ class CRegisterWindow; class CLogWindow;
class CBreakPointWindow;
class CMemoryWindow;
+class CJitWindow;
class CCodeView;
class IniFile;
@@ -101,6 +102,7 @@ class CCodeWindow CRegisterWindow* m_RegisterWindow;
CBreakPointWindow* m_BreakpointWindow;
CMemoryWindow* m_MemoryWindow;
+ CJitWindow* m_JitWindow;
CCodeView* codeview;
wxListBox* callstack;
diff --git a/Source/Core/DebuggerWX/src/JitWindow.cpp b/Source/Core/DebuggerWX/src/JitWindow.cpp new file mode 100644 index 0000000000..53c496ede3 --- /dev/null +++ b/Source/Core/DebuggerWX/src/JitWindow.cpp @@ -0,0 +1,211 @@ +// Copyright (C) 2003-2008 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include "Debugger.h"
+
+#include "IniFile.h"
+
+#include "wx/button.h"
+#include "wx/textctrl.h"
+#include "wx/listctrl.h"
+#include "wx/thread.h"
+#include "wx/listctrl.h"
+#include "JitWindow.h"
+#include "HW/CPU.h"
+#include "PowerPC/PowerPC.h"
+#include "PowerPC/Jit64/Jit.h"
+#include "PowerPC/Jit64/JitCache.h"
+#include "Host.h"
+#include "disasm.h"
+
+#include "Debugger/PPCDebugInterface.h"
+#include "Debugger/Debugger_SymbolMap.h"
+
+#include "Core.h"
+#include "StringUtil.h"
+#include "LogManager.h"
+
+// ugly that this lib included code from the main
+#include "../../DolphinWX/src/Globals.h"
+
+// UGLY
+namespace {
+CJitWindow *the_jit_window;
+}
+
+enum
+{
+ IDM_REFRESH_LIST = 33350,
+ IDM_PPC_BOX,
+ IDM_X86_BOX,
+ IDM_NEXT,
+ IDM_PREV,
+ IDM_BLOCKLIST,
+};
+
+BEGIN_EVENT_TABLE(CJitWindow, wxFrame)
+// EVT_TEXT(IDM_ADDRBOX, CJitWindow::OnAddrBoxChange)
+ // EVT_LISTBOX(IDM_SYMBOLLIST, CJitWindow::OnSymbolListChange)
+ //EVT_HOST_COMMAND(wxID_ANY, CJitWindow::OnHostMessage)
+ EVT_BUTTON(IDM_REFRESH_LIST, CJitWindow::OnRefresh)
+END_EVENT_TABLE()
+
+
+CJitWindow::CJitWindow(wxWindow* parent, wxWindowID id,
+ const wxString& title, const wxPoint& pos, const wxSize& size, long style)
+ : wxFrame(parent, id, title, pos, size, style)
+{
+ the_jit_window = this;
+ wxBoxSizer* sizerBig = new wxBoxSizer(wxVERTICAL);
+ wxBoxSizer* sizerSplit = new wxBoxSizer(wxHORIZONTAL);
+ sizerSplit->Add(ppc_box = new wxTextCtrl(this, IDM_PPC_BOX, "(ppc)", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE), 1, wxEXPAND);
+ sizerSplit->Add(x86_box = new wxTextCtrl(this, IDM_X86_BOX, "(x86)", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE), 1, wxEXPAND);
+ sizerBig->Add(block_list = new JitBlockList(this, IDM_BLOCKLIST,
+ wxDefaultPosition, wxSize(100, 140),
+ wxLC_REPORT | wxSUNKEN_BORDER | wxLC_ALIGN_LEFT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING), 0, wxEXPAND);
+ sizerBig->Add(sizerSplit, 2, wxEXPAND);
+// sizerBig->Add(memview, 5, wxEXPAND);
+// sizerBig->Add(sizerRight, 0, wxEXPAND | wxALL, 3);
+ sizerBig->Add(button_refresh = new wxButton(this, IDM_REFRESH_LIST, _T("&Refresh")));
+// sizerRight->Add(addrbox = new wxTextCtrl(this, IDM_ADDRBOX, _T("")));
+// sizerRight->Add(new wxButton(this, IDM_SETPC, _T("S&et PC")));
+
+ SetSizer(sizerBig);
+
+ sizerSplit->SetSizeHints(this);
+ sizerSplit->Fit(this);
+ sizerBig->SetSizeHints(this);
+ sizerBig->Fit(this);
+}
+
+
+CJitWindow::~CJitWindow()
+{
+}
+
+
+void CJitWindow::Save(IniFile& _IniFile) const
+{
+ _IniFile.Set("JitWindow", "x", GetPosition().x);
+ _IniFile.Set("JitWindow", "y", GetPosition().y);
+ _IniFile.Set("JitWindow", "w", GetSize().GetWidth());
+ _IniFile.Set("JitWindow", "h", GetSize().GetHeight());
+}
+
+
+void CJitWindow::Load(IniFile& _IniFile)
+{
+ int x,y,w,h;
+ _IniFile.Get("JitWindow", "x", &x, GetPosition().x);
+ _IniFile.Get("JitWindow", "y", &y, GetPosition().y);
+ _IniFile.Get("JitWindow", "w", &w, GetSize().GetWidth());
+ _IniFile.Get("JitWindow", "h", &h, GetSize().GetHeight());
+ SetSize(x, y, w, h);
+}
+
+void CJitWindow::OnRefresh(wxCommandEvent& /*event*/) {
+ block_list->Update();
+}
+
+void CJitWindow::ViewAddr(u32 em_address)
+{
+ the_jit_window->Compare(em_address);
+}
+
+void CJitWindow::Compare(u32 em_address)
+{
+ u8 *xDis = new u8[65536];
+ memset(xDis, 0, 65536);
+
+ disassembler x64disasm;
+ x64disasm.set_syntax_intel();
+
+ int block_num = Jit64::GetBlockNumberFromAddress(em_address);
+ if (block_num < 0)
+ {
+ ppc_box->SetValue(wxString(StringFromFormat("(non-code address: %08x)", em_address).c_str()));
+ x86_box->SetValue(wxString(StringFromFormat("(no translation)").c_str()));
+ return;
+ }
+ Jit64::JitBlock *block = Jit64::GetBlock(block_num);
+ const u8 *code = (const u8 *)Jit64::GetCompiledCodeFromBlock(block_num);
+ u64 disasmPtr = (u64)code;
+ int size = block->codeSize;
+ const u8 *end = code + size;
+ char *sptr = (char*)xDis;
+
+ while ((u8*)disasmPtr < end)
+ {
+ disasmPtr += x64disasm.disasm64(disasmPtr, disasmPtr, (u8*)disasmPtr, sptr);
+ sptr += strlen(sptr);
+ *sptr++ = 13;
+ *sptr++ = 10;
+ }
+ x86_box->SetValue(wxString((char*)xDis));
+ delete [] xDis;
+}
+
+void CJitWindow::Update()
+{
+
+}
+
+void CJitWindow::OnHostMessage(wxCommandEvent& event)
+{
+ switch (event.GetId())
+ {
+ case IDM_NOTIFYMAPLOADED:
+ //NotifyMapLoaded();
+ break;
+ }
+}
+
+
+
+// JitBlockList
+//================
+
+enum {
+ COLUMN_ADDRESS,
+ COLUMN_PPCSIZE,
+ COLUMN_X86SIZE,
+ COLUMN_NAME,
+ COLUMN_FLAGS,
+ COLUMN_NUMEXEC,
+ COLUMN_COST, // (estimated as x86size * numexec)
+};
+
+JitBlockList::JitBlockList(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
+ : wxListCtrl(parent, id, pos, size, style) // | wxLC_VIRTUAL)
+{
+ Init();
+}
+
+void JitBlockList::Init()
+{
+ InsertColumn(COLUMN_ADDRESS, "Address");
+ InsertColumn(COLUMN_PPCSIZE, "PPC Size");
+ InsertColumn(COLUMN_X86SIZE, "x86 Size");
+ InsertColumn(COLUMN_NAME, "Symbol");
+ InsertColumn(COLUMN_FLAGS, "Flags");
+ InsertColumn(COLUMN_NUMEXEC, "NumExec");
+ InsertColumn(COLUMN_COST, "Cost");
+}
+
+void JitBlockList::Update()
+{
+}
diff --git a/Source/Core/DebuggerWX/src/JitWindow.h b/Source/Core/DebuggerWX/src/JitWindow.h new file mode 100644 index 0000000000..4b8d0c0b15 --- /dev/null +++ b/Source/Core/DebuggerWX/src/JitWindow.h @@ -0,0 +1,81 @@ +// Copyright (C) 2003-2008 Dolphin Project.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 2.0.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#ifndef JITWINDOW_H_
+#define JITWINDOW_H_
+
+#include <vector>
+
+#include "wx/dialog.h"
+#include "wx/textctrl.h"
+#include "wx/listctrl.h"
+#include "wx/listbox.h"
+#include "Debugger.h"
+#include "MemoryView.h"
+#include "Thread.h"
+#include "IniFile.h"
+
+#include "CoreParameter.h"
+
+
+class JitBlockList : public wxListCtrl
+{
+ std::vector<int> block_ranking;
+public:
+ JitBlockList(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style);
+ void Init();
+ void Update();
+};
+
+
+class CJitWindow : public wxFrame
+{
+public:
+ CJitWindow(wxWindow* parent,
+ wxWindowID id = wxID_ANY,
+ const wxString& title = _T("JIT block viewer"),
+ const wxPoint& pos = wxPoint(950, 100),
+ const wxSize& size = wxSize(400, 500),
+ long style = wxDEFAULT_FRAME_STYLE | wxCLIP_CHILDREN | wxNO_FULL_REPAINT_ON_RESIZE);
+
+ ~CJitWindow();
+
+ void Save(IniFile& _IniFile) const;
+ void Load(IniFile& _IniFile);
+
+ static void ViewAddr(u32 em_address);
+ void Update();
+
+private:
+ void OnRefresh(wxCommandEvent& /*event*/);
+ void Compare(u32 em_address);
+
+ JitBlockList* block_list;
+ wxButton* button_refresh;
+ wxTextCtrl* ppc_box;
+ wxTextCtrl* x86_box;
+ wxListBox* top_instructions;
+
+ DECLARE_EVENT_TABLE()
+
+ void OnSymbolListChange(wxCommandEvent& event);
+ void OnCallstackListChange(wxCommandEvent& event);
+ void OnAddrBoxChange(wxCommandEvent& event);
+ void OnHostMessage(wxCommandEvent& event);
+};
+
+#endif /*MEMORYWINDOW_*/
|
