summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinQt/Debugger/JITWidget.h
blob: 02fd50134829b2d9c85a2d9bf98ea852caec1c9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Copyright 2018 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include <QDockWidget>

#include "Common/CommonTypes.h"

class BreakpointWidget;
class ClickableStatusBar;
class CodeWidget;
namespace Core
{
enum class State;
class System;
}  // namespace Core
struct JitBlock;
class JitBlockProxyModel;
class JitBlockTableModel;
namespace JitBlockTableModelColumn
{
enum EnumType : int;
}
namespace JitBlockTableModelUserRole
{
enum EnumType : int;
}
class MemoryWidget;
class QCloseEvent;
class QFont;
class QLineEdit;
class QMenu;
class QPlainTextEdit;
class QPushButton;
class QShowEvent;
class QSplitter;
class QTableView;

class JITWidget final : public QDockWidget
{
  Q_OBJECT

  using Column = JitBlockTableModelColumn::EnumType;
  using UserRole = JitBlockTableModelUserRole::EnumType;

signals:
  void HideSignal();
  void ShowSignal();
  void SetCodeAddress(u32 address);

public:
  explicit JITWidget(Core::System& system, QWidget* parent = nullptr);
  ~JITWidget() override;

  JITWidget(const JITWidget&) = delete;
  JITWidget(JITWidget&&) = delete;
  JITWidget& operator=(const JITWidget&) = delete;
  JITWidget& operator=(JITWidget&&) = delete;

  // Always connected slots (external signals)
  void OnRequestPPCComparison(u32 address, bool translate_address);

private:
  void closeEvent(QCloseEvent* event) override;
  void showEvent(QShowEvent* event) override;
  void hideEvent(QHideEvent* event) override;

  void UpdateProfilingButton();
  void UpdateOtherButtons(Core::State state);
  void UpdateDebugFont(const QFont& font);
  void ClearDisassembly();
  void ShowFreeMemoryStatus();
  void UpdateContent(Core::State state);
  void CrossDisassemble(const JitBlock& block);
  void CrossDisassemble(const QModelIndex& index);
  void CrossDisassemble();
  void TableEraseBlocks();

  // Setup and teardown
  void LoadQSettings();
  void SaveQSettings() const;
  void ConnectSlots();
  void DisconnectSlots();
  void Show();
  void Hide();

  // Always connected slots (external signals)
  void OnVisibilityToggled(bool visible);
  void OnDebugModeToggled(bool visible);

  // Always connected slots (internal signals)
  void OnToggleProfiling(bool enabled);
  void OnClearCache();
  void OnWipeProfiling();
  void OnTableCurrentChanged(const QModelIndex& current, const QModelIndex& previous);
  void OnTableDoubleClicked(const QModelIndex& index);
  void OnTableContextMenu(const QPoint& pos);
  void OnTableHeaderContextMenu(const QPoint& pos);
  void OnTableMenuViewCode();
  void OnTableMenuEraseBlocks();
  void OnStatusBarPressed();

  // Conditionally connected slots (external signals)
  void OnJitCacheInvalidation();
  void OnUpdateDisasmDialog();
  void OnPPCSymbolsUpdated();
  void OnPPCBreakpointsChanged();
  void OnConfigChanged();
  void OnDebugFontChanged(const QFont& font);
  void OnEmulationStateChanged(Core::State state);

  Core::System& m_system;

  QLineEdit* m_pm_address_covered_line_edit;
  QPushButton* m_clear_cache_button;
  QPushButton* m_toggle_profiling_button;
  QPushButton* m_wipe_profiling_button;
  QTableView* m_table_view;
  JitBlockProxyModel* m_table_proxy;
  JitBlockTableModel* m_table_model;
  QPlainTextEdit* m_ppc_asm_widget;
  QPlainTextEdit* m_host_near_asm_widget;
  QPlainTextEdit* m_host_far_asm_widget;
  QSplitter* m_table_splitter;
  QSplitter* m_disasm_splitter;
  ClickableStatusBar* m_status_bar;

  QMenu* m_table_context_menu;
  QMenu* m_column_visibility_menu;
};