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