File indexing completed on 2024-05-12 04:39:46
0001 /* 0002 SPDX-FileCopyrightText: 1999 John Birch <jbb@kdevelop.org> 0003 SPDX-FileCopyrightText: 2007 Hamish Rodda <rodda@kde.org> 0004 SPDX-FileCopyrightText: 2013 Vlas Puhov <vlas.puhov@mail.ru> 0005 0006 SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #ifndef _DISASSEMBLEWIDGET_H_ 0010 #define _DISASSEMBLEWIDGET_H_ 0011 0012 #include "mi/mi.h" 0013 0014 #include <QActionGroup> 0015 #include <QTreeWidget> 0016 #include <QUrl> 0017 0018 #include <KConfigGroup> 0019 0020 #include "ui_selectaddressdialog.h" 0021 0022 /***************************************************************************/ 0023 /***************************************************************************/ 0024 /***************************************************************************/ 0025 0026 class QSplitter; 0027 0028 namespace KDevelop { 0029 class IDebugSession; 0030 } 0031 0032 namespace KDevMI { 0033 0034 class RegistersManager; 0035 0036 class SelectAddressDialog : public QDialog 0037 { 0038 Q_OBJECT 0039 public: 0040 explicit SelectAddressDialog(QWidget *parent = nullptr); 0041 0042 QString address() const; 0043 void setAddress(const QString& address); 0044 bool hasValidAddress() const; 0045 void updateOkState(); 0046 0047 private Q_SLOTS: 0048 void validateInput(); 0049 void itemSelected(); 0050 0051 private: 0052 Ui::SelectAddressDialog m_ui; 0053 }; 0054 0055 class DisassembleWidget; 0056 0057 enum DisassemblyFlavor { 0058 DisassemblyFlavorUnknown = -1, 0059 DisassemblyFlavorATT = 0, 0060 DisassemblyFlavorIntel, 0061 }; 0062 0063 class DisassembleWindow : public QTreeWidget 0064 { 0065 Q_OBJECT 0066 0067 public: 0068 DisassembleWindow(QWidget *parent, DisassembleWidget* widget); 0069 0070 void setDisassemblyFlavor(DisassemblyFlavor flavor); 0071 0072 protected: 0073 void contextMenuEvent(QContextMenuEvent *e) override; 0074 0075 private: 0076 QAction* m_selectAddrAction; 0077 QAction* m_jumpToLocation; 0078 QAction* m_runUntilCursor; 0079 QAction* m_disassemblyFlavorAtt; 0080 QAction* m_disassemblyFlavorIntel; 0081 QActionGroup* m_disassemblyFlavorActionGroup; 0082 }; 0083 0084 class MIDebuggerPlugin; 0085 0086 0087 class DisassembleWidget : public QWidget 0088 { 0089 Q_OBJECT 0090 0091 public: 0092 enum Columns { 0093 Icon, 0094 Address, 0095 Function, 0096 Instruction, 0097 ColumnCount 0098 }; 0099 0100 explicit DisassembleWidget( MIDebuggerPlugin* plugin, QWidget *parent=nullptr ); 0101 ~DisassembleWidget() override; 0102 0103 Q_SIGNALS: 0104 void requestRaise(); 0105 0106 public Q_SLOTS: 0107 void slotActivate(bool activate); 0108 void slotDeactivate(); 0109 void slotShowStepInSource(const QUrl &fileName, int lineNum, const QString &address); 0110 void slotChangeAddress(); 0111 ///Disassembles code at @p address and updates registers 0112 void update(const QString &address); 0113 void jumpToCursor(); 0114 void runToCursor(); 0115 void setDisassemblyFlavor(QAction* action); 0116 0117 private Q_SLOTS: 0118 void currentSessionChanged(KDevelop::IDebugSession* session); 0119 0120 protected: 0121 void showEvent(QShowEvent*) override; 0122 void hideEvent(QHideEvent*) override; 0123 void enableControls(bool enabled); 0124 0125 private: 0126 bool displayCurrent(); 0127 void updateDisassemblyFlavor(); 0128 0129 /// Disassembles memory region from..to 0130 /// if from is empty current execution position is used 0131 /// if to is empty, 256 bytes range is taken 0132 void disassembleMemoryRegion(const QString& from=QString(), 0133 const QString& to=QString() ); 0134 0135 /// callbacks for GDBCommands 0136 void disassembleMemoryHandler(const MI::ResultRecord& r); 0137 void updateExecutionAddressHandler(const MI::ResultRecord& r); 0138 void setDisassemblyFlavorHandler(const MI::ResultRecord& r); 0139 void showDisassemblyFlavorHandler(const MI::ResultRecord& r); 0140 0141 //for str to uint conversion. 0142 bool ok; 0143 bool active_; 0144 unsigned long lower_; 0145 unsigned long upper_; 0146 unsigned long address_; 0147 0148 RegistersManager* m_registersManager ; 0149 0150 DisassembleWindow * m_disassembleWindow; 0151 0152 SelectAddressDialog* m_dlg; 0153 0154 KConfigGroup m_config; 0155 QSplitter *m_splitter; 0156 }; 0157 0158 } // end of namespace KDevMI 0159 0160 #endif