From bd44fb1248d81c47e0029f36601f0d970b674871 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Tue, 22 Feb 2011 12:58:32 +0100
Subject: [PATCH] debugger: move gdb binary list to common options page
 (unfinished)

---
 src/plugins/debugger/commonoptionspage.cpp  | 493 ++++++++++++++++++++
 src/plugins/debugger/commonoptionspage.h    | 122 +++++
 src/plugins/debugger/debuggercore.h         |   2 +-
 src/plugins/debugger/debuggerplugin.cpp     |  18 +-
 src/plugins/debugger/debuggerrunner.cpp     |   5 +-
 src/plugins/debugger/gdb/gdbengine.cpp      |   2 +-
 src/plugins/debugger/gdb/gdboptionspage.cpp | 226 +--------
 src/plugins/debugger/gdb/gdboptionspage.h   |  10 -
 8 files changed, 632 insertions(+), 246 deletions(-)
 create mode 100644 src/plugins/debugger/commonoptionspage.cpp
 create mode 100644 src/plugins/debugger/commonoptionspage.h

diff --git a/src/plugins/debugger/commonoptionspage.cpp b/src/plugins/debugger/commonoptionspage.cpp
new file mode 100644
index 00000000000..19e2c52f2f7
--- /dev/null
+++ b/src/plugins/debugger/commonoptionspage.cpp
@@ -0,0 +1,493 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** No Commercial Usage
+**
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#include "commonoptionspage.h"
+
+#include "debuggeractions.h"
+#include "debuggerconstants.h"
+#include "debuggercore.h"
+#include "debuggerstringutils.h"
+
+#include <coreplugin/icore.h>
+#include <coreplugin/manhattanstyle.h>
+
+#include <projectexplorer/projectexplorer.h>
+#include <projectexplorer/toolchainmanager.h>
+#include <projectexplorer/abi.h>
+
+#include <QtCore/QFileInfo>
+#include <QtCore/QTextStream>
+
+using namespace Core;
+using namespace Debugger::Constants;
+using namespace ProjectExplorer;
+
+namespace Debugger {
+namespace Internal {
+
+static const char *DEBUGGER_MAPPING_ARRAY = "GdbMapping";
+static const char *DEBUGGER_ABI_KEY = "Abi";
+static const char *DEBUGGER_BINARY_KEY = "Binary";
+
+///////////////////////////////////////////////////////////////////////
+//
+// CommonOptionsPage
+//
+///////////////////////////////////////////////////////////////////////
+
+CommonOptionsPage::CommonOptionsPage()
+{
+    m_abiToDebuggerMapChanged = true;
+}
+
+QString CommonOptionsPage::id() const
+{
+    return _(DEBUGGER_COMMON_SETTINGS_ID);
+}
+
+QString CommonOptionsPage::displayName() const
+{
+    return QCoreApplication::translate("Debugger", DEBUGGER_COMMON_SETTINGS_NAME);}
+
+QString CommonOptionsPage::category() const
+{
+    return _(DEBUGGER_SETTINGS_CATEGORY);
+}
+
+QString CommonOptionsPage::displayCategory() const
+{
+    return QCoreApplication::translate("Debugger", DEBUGGER_SETTINGS_TR_CATEGORY);}
+
+QIcon CommonOptionsPage::categoryIcon() const
+{
+    return QIcon(QLatin1String(DEBUGGER_COMMON_SETTINGS_CATEGORY_ICON));
+}
+
+void CommonOptionsPage::apply()
+{
+    m_group.apply(ICore::instance()->settings());
+}
+
+void CommonOptionsPage::finish()
+{
+    m_group.finish();
+}
+
+QString CommonOptionsPage::debuggerForAbi(const QString &abi) const
+{
+    return m_abiToDebuggerMap.value(abi);
+}
+
+QWidget *CommonOptionsPage::createPage(QWidget *parent)
+{
+    QWidget *w = new QWidget(parent);
+    m_ui.setupUi(w);
+    m_group.clear();
+
+    m_group.insert(debuggerCore()->action(ListSourceFiles),
+        m_ui.checkBoxListSourceFiles);
+    m_group.insert(debuggerCore()->action(UseAlternatingRowColors),
+        m_ui.checkBoxUseAlternatingRowColors);
+    m_group.insert(debuggerCore()->action(UseToolTipsInMainEditor),
+        m_ui.checkBoxUseToolTipsInMainEditor);
+    m_group.insert(debuggerCore()->action(CloseBuffersOnExit),
+        m_ui.checkBoxCloseBuffersOnExit);
+    m_group.insert(debuggerCore()->action(SwitchModeOnExit),
+        m_ui.checkBoxSwitchModeOnExit);
+    m_group.insert(debuggerCore()->action(AutoDerefPointers), 0);
+    m_group.insert(debuggerCore()->action(UseToolTipsInLocalsView), 0);
+    m_group.insert(debuggerCore()->action(UseToolTipsInBreakpointsView), 0);
+    m_group.insert(debuggerCore()->action(UseAddressInBreakpointsView), 0);
+    m_group.insert(debuggerCore()->action(UseAddressInStackView), 0);
+    m_group.insert(debuggerCore()->action(MaximalStackDepth),
+        m_ui.spinBoxMaximalStackDepth);
+    m_group.insert(debuggerCore()->action(ShowStdNamespace), 0);
+    m_group.insert(debuggerCore()->action(ShowQtNamespace), 0);
+    m_group.insert(debuggerCore()->action(SortStructMembers), 0);
+    m_group.insert(debuggerCore()->action(LogTimeStamps), 0);
+    m_group.insert(debuggerCore()->action(VerboseLog), 0);
+    m_group.insert(debuggerCore()->action(BreakOnThrow), 0);
+    m_group.insert(debuggerCore()->action(BreakOnCatch), 0);
+#ifdef Q_OS_WIN
+    Utils::SavedAction *registerAction = debuggerCore()->action(RegisterForPostMortem);
+    m_group.insert(registerAction,
+        m_ui.checkBoxRegisterForPostMortem);
+    connect(registerAction, SIGNAL(toggled(bool)),
+            m_ui.checkBoxRegisterForPostMortem, SLOT(setChecked(bool)));
+#endif
+
+    if (m_searchKeywords.isEmpty()) {
+        QLatin1Char sep(' ');
+        QTextStream(&m_searchKeywords)
+                << sep << m_ui.checkBoxUseAlternatingRowColors->text()
+                << sep << m_ui.checkBoxUseToolTipsInMainEditor->text()
+                << sep << m_ui.checkBoxListSourceFiles->text()
+#ifdef Q_OS_WIN
+                << sep << m_ui.checkBoxRegisterForPostMortem->text()
+#endif
+                << sep << m_ui.checkBoxCloseBuffersOnExit->text()
+                << sep << m_ui.checkBoxSwitchModeOnExit->text()
+                << sep << m_ui.labelMaximalStackDepth->text()
+                   ;
+        m_searchKeywords.remove(QLatin1Char('&'));
+    }
+#ifndef Q_OS_WIN
+    m_ui.checkBoxRegisterForPostMortem->setVisible(false);
+#endif
+
+    // Tool
+    connect(ToolChainManager::instance(),
+        SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)),
+        SLOT(handleToolChainAdditions(ProjectExplorer::ToolChain*)));
+
+    connect(ToolChainManager::instance(),
+        SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)),
+        SLOT(handleToolChainRemovals(ProjectExplorer::ToolChain*)));
+
+    // Update mapping now that toolchains are available
+    QList<ToolChain *> tcs = ToolChainManager::instance()->toolChains();
+
+    QStringList abiList;
+    foreach (ToolChain *tc, tcs) {
+        const QString abi = tc->targetAbi().toString();
+        if (!abiList.contains(abi))
+            abiList.append(abi);
+        if (!m_abiToDebuggerMap.contains(abi))
+            handleToolChainAdditions(tc);
+    }
+
+    QStringList toRemove;
+    for (QMap<QString, QString>::const_iterator i = m_abiToDebuggerMap.constBegin();
+         i != m_abiToDebuggerMap.constEnd(); ++i) {
+        if (!abiList.contains(i.key()))
+            toRemove.append(i.key());
+    }
+
+    foreach (const QString &key, toRemove)
+        m_abiToDebuggerMap.remove(key);
+
+    //m_ui->gdbChooserWidget->setGdbMapping(m_abiToDebuggerMap);
+
+    return w;
+}
+
+bool CommonOptionsPage::matches(const QString &s) const
+{
+    return m_searchKeywords.contains(s, Qt::CaseInsensitive);
+}
+
+void CommonOptionsPage::readSettings() /* static */
+{
+    // FIXME: Convert old settings!
+    QSettings *settings = Core::ICore::instance()->settings();
+
+    m_abiToDebuggerMap.clear();
+
+    int size = settings->beginReadArray(DEBUGGER_MAPPING_ARRAY);
+    for (int i = 0; i < size; ++i) {
+        settings->setArrayIndex(i);
+        Abi abi(settings->value(DEBUGGER_ABI_KEY).toString());
+        if (!abi.isValid())
+            continue;
+        QString binary = settings->value(DEBUGGER_BINARY_KEY).toString();
+        if (binary.isEmpty())
+            continue;
+        m_abiToDebuggerMap.insert(abi.toString(), binary);
+    }
+    settings->endArray();
+
+    // Map old settings (pre 2.2):
+    const QChar separator = QLatin1Char(',');
+    const QString keyRoot = QLatin1String("GdbBinaries/GdbBinaries");
+    for (int i = 1; ; i++) {
+        const QString value = settings->value(keyRoot + QString::number(i)).toString();
+        if (value.isEmpty())
+            break;
+        // Split apart comma-separated binary and its numerical toolchains.
+        QStringList tokens = value.split(separator);
+        if (tokens.size() < 2)
+            break;
+
+        const QString binary = tokens.front();
+        // Skip non-existent absolute binaries allowing for upgrades by the installer.
+        // Force a rewrite of the settings file.
+        const QFileInfo binaryInfo(binary);
+        if (binaryInfo.isAbsolute() && !binaryInfo.isExecutable()) {
+            const QString msg = QString::fromLatin1("Warning: The gdb binary '%1' does not exist, skipping.\n").arg(binary);
+            qWarning("%s", qPrintable(msg));
+            continue;
+        }
+
+        // Create entries for all toolchains.
+        tokens.pop_front();
+        foreach (const QString &t, tokens) {
+            // Paranoia: Check if the there is already a binary configured for the toolchain.
+            QString abi;
+            switch (t.toInt())
+            {
+            case 0: // GCC
+            case 1: // Linux ICC
+#ifndef Q_OS_WIN
+                abi = Abi::hostAbi().toString();
+#endif
+                break;
+            case 2: // MinGW
+            case 3: // MSVC
+            case 4: // WINCE
+#ifdef Q_OS_WIN
+                abi = Abi::hostAbi().toString();
+#endif
+                break;
+            case 5: // WINSCW
+                abi = Abi(Abi::ARM, Abi::Symbian,
+                                           Abi::Symbian_emulator,
+                                           Abi::Format_ELF,
+                                           32).toString();
+                break;
+            case 6: // GCCE
+            case 7: // RVCT 2, ARM v5
+            case 8: // RVCT 2, ARM v6
+            case 11: // RVCT GNUPOC
+            case 12: // RVCT 4, ARM v5
+            case 13: // RVCT 4, ARM v6
+                abi = Abi(Abi::ARM, Abi::Symbian,
+                                           Abi::Symbian_device,
+                                           Abi::Format_ELF,
+                                           32).toString();
+                break;
+            case 9: // GCC Maemo5
+                abi = Abi(Abi::ARM, Abi::Linux,
+                                           Abi::Linux_maemo,
+                                           Abi::Format_ELF,
+                                           32).toString();
+
+                break;
+            case 14: // GCC Harmattan
+                abi = Abi(Abi::ARM, Abi::Linux,
+                                           Abi::Linux_harmattan,
+                                           Abi::Format_ELF,
+                                           32).toString();
+                break;
+            case 15: // GCC Meego
+                abi = Abi(Abi::ARM, Abi::Linux,
+                                           Abi::Linux_meego,
+                                           Abi::Format_ELF,
+                                           32).toString();
+                break;
+            default:
+                break;
+            }
+            if (abi.isEmpty() || m_abiToDebuggerMap.contains(abi))
+                continue;
+
+            m_abiToDebuggerMap.insert(abi, binary);
+        }
+    }
+
+    m_abiToDebuggerMapChanged = false;
+}
+
+void CommonOptionsPage::writeSettings() /* static */
+{
+    if (!m_abiToDebuggerMapChanged)
+        return;
+
+    QSettings *settings = Core::ICore::instance()->settings();
+
+    settings->beginWriteArray(DEBUGGER_MAPPING_ARRAY);
+
+    int index = 0;
+    for (QMap<QString, QString>::const_iterator i = m_abiToDebuggerMap.constBegin();
+         i != m_abiToDebuggerMap.constEnd(); ++i) {
+        if (i.value().isEmpty())
+            continue;
+
+        settings->setArrayIndex(index);
+        ++index;
+
+        settings->setValue(DEBUGGER_ABI_KEY, i.key());
+        settings->setValue(DEBUGGER_BINARY_KEY, i.value());
+    }
+    settings->endArray();
+
+    m_abiToDebuggerMapChanged = false;
+}
+
+void CommonOptionsPage::handleToolChainAdditions(ToolChain *tc)
+{
+    Abi tcAbi = tc->targetAbi();
+
+    if (tcAbi.binaryFormat() != Abi::Format_ELF
+            && tcAbi.binaryFormat() != Abi::Format_Mach_O
+            && !( tcAbi.os() == Abi::Windows
+                  && tcAbi.osFlavor() == Abi::Windows_msys ))
+        return;
+    if (m_abiToDebuggerMap.contains(tcAbi.toString()))
+        return;
+
+    QString binary;
+#ifdef Q_OS_UNIX
+    Abi hostAbi = Abi::hostAbi();
+    if (hostAbi == tcAbi)
+        binary = QLatin1String("gdb");
+#endif
+    m_abiToDebuggerMap.insert(tc->targetAbi().toString(), binary);
+}
+
+void CommonOptionsPage::handleToolChainRemovals(ToolChain *tc)
+{
+    QList<ToolChain *> tcs = ToolChainManager::instance()->toolChains();
+    foreach (ToolChain *current, tcs) {
+        if (current->targetAbi() == tc->targetAbi())
+            return;
+    }
+
+    m_abiToDebuggerMap.remove(tc->targetAbi().toString());
+}
+
+
+///////////////////////////////////////////////////////////////////////
+//
+// DebuggingHelperOptionPage
+//
+///////////////////////////////////////////////////////////////////////
+
+static bool oxygenStyle()
+{
+    const ManhattanStyle *ms = qobject_cast<const ManhattanStyle *>(qApp->style());
+    return ms && !qstrcmp("OxygenStyle", ms->baseStyle()->metaObject()->className());
+}
+
+QString DebuggingHelperOptionPage::id() const
+{
+    return _("Z.DebuggingHelper");
+}
+
+QString DebuggingHelperOptionPage::displayName() const
+{
+    return tr("Debugging Helper");
+}
+
+QString DebuggingHelperOptionPage::category() const
+{
+    return _(DEBUGGER_SETTINGS_CATEGORY);
+}
+
+QString DebuggingHelperOptionPage::displayCategory() const
+{
+    return QCoreApplication::translate("Debugger", DEBUGGER_SETTINGS_TR_CATEGORY);
+}
+
+QIcon DebuggingHelperOptionPage::categoryIcon() const
+{
+    return QIcon(QLatin1String(DEBUGGER_COMMON_SETTINGS_CATEGORY_ICON));
+}
+
+void DebuggingHelperOptionPage::apply()
+{
+    m_group.apply(ICore::instance()->settings());
+
+/*
+    if (!m_ui) // page never shown
+        return;
+    if (m_ui->gdbChooserWidget->isDirty()) {
+        //m_abiToDebuggerMap = m_ui->gdbChooserWidget->gdbMapping();
+        m_ui->gdbChooserWidget->setGdbMapping(m_abiToDebuggerMap);
+        gdbMappingChanged = true;
+    }
+*/
+}
+
+void DebuggingHelperOptionPage::finish()
+{
+    m_group.finish();
+}
+
+QWidget *DebuggingHelperOptionPage::createPage(QWidget *parent)
+{
+    QWidget *w = new QWidget(parent);
+    m_ui.setupUi(w);
+
+    m_ui.dumperLocationChooser->setExpectedKind(Utils::PathChooser::Command);
+    m_ui.dumperLocationChooser->setPromptDialogTitle(tr("Choose DebuggingHelper Location"));
+    m_ui.dumperLocationChooser->setInitialBrowsePathBackup(
+        ICore::instance()->resourcePath() + "../../lib");
+
+    m_group.clear();
+    m_group.insert(debuggerCore()->action(UseDebuggingHelpers),
+        m_ui.debuggingHelperGroupBox);
+    m_group.insert(debuggerCore()->action(UseCustomDebuggingHelperLocation),
+        m_ui.customLocationGroupBox);
+    // Suppress Oxygen style's giving flat group boxes bold titles.
+    if (oxygenStyle())
+        m_ui.customLocationGroupBox->setStyleSheet(_("QGroupBox::title { font: ; }"));
+
+    m_group.insert(debuggerCore()->action(CustomDebuggingHelperLocation),
+        m_ui.dumperLocationChooser);
+
+    m_group.insert(debuggerCore()->action(UseCodeModel),
+        m_ui.checkBoxUseCodeModel);
+    m_group.insert(debuggerCore()->action(ShowThreadNames),
+        m_ui.checkBoxShowThreadNames);
+
+
+#ifndef QT_DEBUG
+#if 0
+    cmd = am->registerAction(m_dumpLogAction,
+        DUMP_LOG, globalcontext);
+    //cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+D,Ctrl+L")));
+    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+F11")));
+    mdebug->addAction(cmd);
+#endif
+#endif
+
+    if (m_searchKeywords.isEmpty()) {
+        QTextStream(&m_searchKeywords)
+                << ' ' << m_ui.debuggingHelperGroupBox->title()
+                << ' ' << m_ui.customLocationGroupBox->title()
+                << ' ' << m_ui.dumperLocationLabel->text()
+                << ' ' << m_ui.checkBoxUseCodeModel->text()
+                << ' ' << m_ui.checkBoxShowThreadNames->text();
+        m_searchKeywords.remove(QLatin1Char('&'));
+    }
+    return w;
+}
+
+bool DebuggingHelperOptionPage::matches(const QString &s) const
+{
+    return m_searchKeywords.contains(s, Qt::CaseInsensitive);
+}
+
+
+} // namespace Internal
+} // namespace Debugger
diff --git a/src/plugins/debugger/commonoptionspage.h b/src/plugins/debugger/commonoptionspage.h
new file mode 100644
index 00000000000..02e159f85e9
--- /dev/null
+++ b/src/plugins/debugger/commonoptionspage.h
@@ -0,0 +1,122 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** No Commercial Usage
+**
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#ifndef DEBUGGER_COMMONOPTIONSPAGE_H
+#define DEBUGGER_COMMONOPTIONSPAGE_H
+
+#include "ui_commonoptionspage.h"
+#include "ui_dumperoptionpage.h"
+
+#include <coreplugin/dialogs/ioptionspage.h>
+#include <projectexplorer/toolchain.h>
+#include <utils/savedaction.h>
+
+
+namespace Debugger {
+namespace Internal {
+
+///////////////////////////////////////////////////////////////////////
+//
+// CommonOptionsPage
+//
+///////////////////////////////////////////////////////////////////////
+
+class CommonOptionsPage : public Core::IOptionsPage
+{
+    Q_OBJECT
+
+public:
+    CommonOptionsPage();
+
+    // IOptionsPage
+    QString id() const;
+    QString displayName() const;
+    QString category() const;
+    QString displayCategory() const;
+    QIcon categoryIcon() const;
+    QWidget *createPage(QWidget *parent);
+    void apply();
+    void finish();
+    bool matches(const QString &s) const;
+
+    void readSettings();
+    void writeSettings();
+    QString debuggerForAbi(const QString &abi) const;
+
+private slots:
+    void handleToolChainAdditions(ProjectExplorer::ToolChain *);
+    void handleToolChainRemovals(ProjectExplorer::ToolChain *);
+
+private:
+    typedef QMap<QString, QString> AbiToDebuggerMap;
+    bool m_abiToDebuggerMapChanged;
+    AbiToDebuggerMap m_abiToDebuggerMap;
+    Ui::CommonOptionsPage m_ui;
+    Utils::SavedActionSet m_group;
+    QString m_searchKeywords;
+};
+
+
+///////////////////////////////////////////////////////////////////////
+//
+// DebuggingHelperOptionPage
+//
+///////////////////////////////////////////////////////////////////////
+
+class DebuggingHelperOptionPage : public Core::IOptionsPage
+{
+public:
+    DebuggingHelperOptionPage() {}
+
+    // IOptionsPage
+    QString id() const;
+    QString displayName() const;
+    QString category() const;
+    QString displayCategory() const;
+    QIcon categoryIcon() const;
+
+    QWidget *createPage(QWidget *parent);
+    void apply();
+    void finish();
+    bool matches(const QString &s) const;
+
+private:
+    Ui::DebuggingHelperOptionPage m_ui;
+    Utils::SavedActionSet m_group;
+    QString m_searchKeywords;
+};
+
+} // namespace Internal
+} // namespace Debugger
+
+#endif // DEBUGGER_COMMONOPTIONSPAGE_H
diff --git a/src/plugins/debugger/debuggercore.h b/src/plugins/debugger/debuggercore.h
index f86d5122c38..caa23bb381e 100644
--- a/src/plugins/debugger/debuggercore.h
+++ b/src/plugins/debugger/debuggercore.h
@@ -103,7 +103,7 @@ public:
     virtual bool initialize(const QStringList &arguments, QString *errorMessage) = 0;
     virtual QWidget *mainWindow() const = 0;
     virtual bool isDockVisible(const QString &objectName) const = 0;
-    virtual QString gdbBinaryForAbi(const ProjectExplorer::Abi &abi) const = 0;
+    virtual QString debuggerForAbi(const ProjectExplorer::Abi &abi) const = 0;
     virtual void showModuleSymbols(const QString &moduleName,
         const QVector<Symbol> &symbols) = 0;
     virtual void openMemoryEditor() = 0;
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index c85528ba931..d02641baf03 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -66,7 +66,6 @@
 #include "snapshothandler.h"
 #include "threadshandler.h"
 #include "commonoptionspage.h"
-#include "gdb/gdboptionspage.h"
 
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/actionmanager/actioncontainer.h>
@@ -594,7 +593,7 @@ public slots:
     {
         m_debuggerSettings->writeSettings();
         m_mainWindow->writeSettings();
-        GdbOptionsPage::writeGdbSettings();
+        m_commonOptionsPage->writeSettings();
     }
 
     void selectThread(int index)
@@ -721,7 +720,7 @@ public slots:
     void runControlStarted(DebuggerEngine *engine);
     void runControlFinished(DebuggerEngine *engine);
     DebuggerLanguages activeLanguages() const;
-    QString gdbBinaryForAbi(const Abi &abi) const;
+    QString debuggerForAbi(const Abi &abi) const;
     void remoteCommand(const QStringList &options, const QStringList &);
 
     bool isReverseDebugging() const;
@@ -1054,6 +1053,7 @@ public:
     uint m_cmdLineEnabledEngines;
     QStringList m_arguments;
     DebuggerToolTipManager *m_toolTipManager;
+    CommonOptionsPage *m_commonOptionsPage;
 };
 
 DebuggerPluginPrivate::DebuggerPluginPrivate(DebuggerPlugin *plugin) :
@@ -1105,6 +1105,8 @@ DebuggerPluginPrivate::DebuggerPluginPrivate(DebuggerPlugin *plugin) :
     m_attachCoreAction = 0;
     m_attachTcfAction = 0;
     m_detachAction = 0;
+
+    m_commonOptionsPage = 0;
 }
 
 DebuggerPluginPrivate::~DebuggerPluginPrivate()
@@ -2359,9 +2361,9 @@ void DebuggerPluginPrivate::remoteCommand(const QStringList &options,
     runScheduled();
 }
 
-QString DebuggerPluginPrivate::gdbBinaryForAbi(const Abi &abi) const
+QString DebuggerPluginPrivate::debuggerForAbi(const Abi &abi) const
 {
-    return GdbOptionsPage::abiToGdbMap.value(abi.toString());
+    return m_commonOptionsPage->debuggerForAbi(abi.toString());
 }
 
 DebuggerLanguages DebuggerPluginPrivate::activeLanguages() const
@@ -2581,8 +2583,11 @@ void DebuggerPluginPrivate::extensionsInitialized()
     dock = m_mainWindow->createDockWidget(CppLanguage, localsAndWatchers);
     dock->setProperty(DOCKWIDGET_DEFAULT_AREA, Qt::RightDockWidgetArea);
 
+    m_commonOptionsPage = new CommonOptionsPage;
+    m_plugin->addAutoReleasedObject(m_commonOptionsPage);
+
     m_debuggerSettings->readSettings();
-    GdbOptionsPage::readGdbSettings();
+    m_commonOptionsPage->readSettings();
 
     // Do not fail to load the whole plugin if something goes wrong here.
     QString errorMessage;
@@ -2833,7 +2838,6 @@ void DebuggerPluginPrivate::extensionsInitialized()
         cmd->setAttribute(Command::CA_NonConfigurable); // ADD_TO_WATCH1 is enough.
     }
 
-    m_plugin->addAutoReleasedObject(new CommonOptionsPage);
     QList<Core::IOptionsPage *> engineOptionPages;
     if (m_cmdLineEnabledEngines & GdbEngineType)
         addGdbOptionPages(&engineOptionPages);
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index 512ffb3534c..b0e278f1842 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -41,7 +41,6 @@
 #include "debuggerplugin.h"
 #include "debuggerstringutils.h"
 #include "debuggerstartparameters.h"
-#include "gdb/gdboptionspage.h"
 #include "lldb/lldbenginehost.h"
 #include "debuggertooltipmanager.h"
 
@@ -382,10 +381,10 @@ ConfigurationCheck checkDebugConfiguration(const ProjectExplorer::Abi &abi)
     if (abi.binaryFormat() == Abi::Format_ELF ||
             abi.binaryFormat() == Abi::Format_Mach_O ||
             (abi.binaryFormat() == Abi::Format_PE && abi.osFlavor() == Abi::Windows_msys)) {
-        if (debuggerCore()->gdbBinaryForAbi(abi).isEmpty()) {
+        if (debuggerCore()->debuggerForAbi(abi).isEmpty()) {
             result.errorMessage = msgNoBinaryForToolChain(abi);
             result.errorMessage += QLatin1Char(' ') + msgEngineNotAvailable("Gdb");
-            result.settingsPage = GdbOptionsPage::settingsId();
+            //result.settingsPage = GdbOptionsPage::settingsId();
         }
     } else if (abi.binaryFormat() == Abi::Format_PE && abi.osFlavor() != Abi::Windows_msys) {
         result = checkCdbConfiguration(abi);
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index c9030ece635..c410146dfbd 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -4213,7 +4213,7 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb,
     const DebuggerStartParameters &sp = startParameters();
     m_gdb = QString::fromLocal8Bit(qgetenv("QTC_DEBUGGER_PATH"));
     if (m_gdb.isEmpty() && sp.startMode != StartRemoteGdb)
-        m_gdb = debuggerCore()->gdbBinaryForAbi(startParameters().toolChainAbi);
+        m_gdb = debuggerCore()->debuggerForAbi(startParameters().toolChainAbi);
     if (m_gdb.isEmpty())
         m_gdb = gdb;
     if (m_gdb.isEmpty()) {
diff --git a/src/plugins/debugger/gdb/gdboptionspage.cpp b/src/plugins/debugger/gdb/gdboptionspage.cpp
index 8193ec36f6e..49ab398e468 100644
--- a/src/plugins/debugger/gdb/gdboptionspage.cpp
+++ b/src/plugins/debugger/gdb/gdboptionspage.cpp
@@ -37,163 +37,15 @@
 
 #include <coreplugin/icore.h>
 #include <projectexplorer/projectexplorer.h>
-#include <projectexplorer/toolchainmanager.h>
-#include <projectexplorer/abi.h>
 
 #include <QtCore/QCoreApplication>
 #include <QtCore/QDebug>
 #include <QtCore/QTextStream>
-#include <QtCore/QFileInfo>
 
-using namespace ProjectExplorer;
 
 namespace Debugger {
 namespace Internal {
 
-static const char *GDB_MAPPING_ARRAY = "GdbMapping";
-static const char *GDB_ABI_KEY = "Abi";
-static const char *GDB_BINARY_KEY = "Binary";
-
-GdbOptionsPage::GdbBinaryToolChainMap GdbOptionsPage::abiToGdbMap;
-bool GdbOptionsPage::gdbMappingChanged = true;
-
-void GdbOptionsPage::readGdbSettings() /* static */
-{
-    // FIXME: Convert old settings!
-    QSettings *settings = Core::ICore::instance()->settings();
-
-    abiToGdbMap.clear();
-
-    int size = settings->beginReadArray(GDB_MAPPING_ARRAY);
-    for (int i = 0; i < size; ++i) {
-        settings->setArrayIndex(i);
-        Abi abi(settings->value(GDB_ABI_KEY).toString());
-        if (!abi.isValid())
-            continue;
-        QString binary = settings->value(GDB_BINARY_KEY).toString();
-        if (binary.isEmpty())
-            continue;
-        abiToGdbMap.insert(abi.toString(), binary);
-    }
-    settings->endArray();
-
-    // Map old settings (pre 2.2):
-    const QChar separator = QLatin1Char(',');
-    const QString keyRoot = QLatin1String("GdbBinaries/GdbBinaries");
-    for (int i = 1; ; i++) {
-        const QString value = settings->value(keyRoot + QString::number(i)).toString();
-        if (value.isEmpty())
-            break;
-        // Split apart comma-separated binary and its numerical toolchains.
-        QStringList tokens = value.split(separator);
-        if (tokens.size() < 2)
-            break;
-
-        const QString binary = tokens.front();
-        // Skip non-existent absolute binaries allowing for upgrades by the installer.
-        // Force a rewrite of the settings file.
-        const QFileInfo binaryInfo(binary);
-        if (binaryInfo.isAbsolute() && !binaryInfo.isExecutable()) {
-            const QString msg = QString::fromLatin1("Warning: The gdb binary '%1' does not exist, skipping.\n").arg(binary);
-            qWarning("%s", qPrintable(msg));
-            continue;
-        }
-
-        // Create entries for all toolchains.
-        tokens.pop_front();
-        foreach (const QString &t, tokens) {
-            // Paranoia: Check if the there is already a binary configured for the toolchain.
-            QString abi;
-            switch (t.toInt())
-            {
-            case 0: // GCC
-            case 1: // Linux ICC
-#ifndef Q_OS_WIN
-                abi = Abi::hostAbi().toString();
-#endif
-                break;
-            case 2: // MinGW
-            case 3: // MSVC
-            case 4: // WINCE
-#ifdef Q_OS_WIN
-                abi = Abi::hostAbi().toString();
-#endif
-                break;
-            case 5: // WINSCW
-                abi = Abi(Abi::ARM, Abi::Symbian,
-                                           Abi::Symbian_emulator,
-                                           Abi::Format_ELF,
-                                           32).toString();
-                break;
-            case 6: // GCCE
-            case 7: // RVCT 2, ARM v5
-            case 8: // RVCT 2, ARM v6
-            case 11: // RVCT GNUPOC
-            case 12: // RVCT 4, ARM v5
-            case 13: // RVCT 4, ARM v6
-                abi = Abi(Abi::ARM, Abi::Symbian,
-                                           Abi::Symbian_device,
-                                           Abi::Format_ELF,
-                                           32).toString();
-                break;
-            case 9: // GCC Maemo5
-                abi = Abi(Abi::ARM, Abi::Linux,
-                                           Abi::Linux_maemo,
-                                           Abi::Format_ELF,
-                                           32).toString();
-
-                break;
-            case 14: // GCC Harmattan
-                abi = Abi(Abi::ARM, Abi::Linux,
-                                           Abi::Linux_harmattan,
-                                           Abi::Format_ELF,
-                                           32).toString();
-                break;
-            case 15: // GCC Meego
-                abi = Abi(Abi::ARM, Abi::Linux,
-                                           Abi::Linux_meego,
-                                           Abi::Format_ELF,
-                                           32).toString();
-                break;
-            default:
-                break;
-            }
-            if (abi.isEmpty() || abiToGdbMap.contains(abi))
-                continue;
-
-            abiToGdbMap.insert(abi, binary);
-        }
-    }
-
-    gdbMappingChanged = false;
-}
-
-void GdbOptionsPage::writeGdbSettings() /* static */
-{
-    if (!gdbMappingChanged)
-        return;
-
-    QSettings *settings = Core::ICore::instance()->settings();
-
-    settings->beginWriteArray(GDB_MAPPING_ARRAY);
-
-    int index = 0;
-    for (QMap<QString, QString>::const_iterator i = abiToGdbMap.constBegin();
-         i != abiToGdbMap.constEnd(); ++i) {
-        if (i.value().isEmpty())
-            continue;
-
-        settings->setArrayIndex(index);
-        ++index;
-
-        settings->setValue(GDB_ABI_KEY, i.key());
-        settings->setValue(GDB_BINARY_KEY, i.value());
-    }
-    settings->endArray();
-
-    gdbMappingChanged = false;
-}
-
 GdbOptionsPage::GdbOptionsPage()
     : m_ui(0)
 { }
@@ -225,43 +77,13 @@ QIcon GdbOptionsPage::categoryIcon() const
 
 QWidget *GdbOptionsPage::createPage(QWidget *parent)
 {
-    // Fix up abi mapping now that the ToolChainManager is available:
-    connect(ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)),
-            this, SLOT(handleToolChainAdditions(ProjectExplorer::ToolChain*)));
-    connect(ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)),
-            this, SLOT(handleToolChainRemovals(ProjectExplorer::ToolChain*)));
-
-    // Update mapping now that toolchains are available
-    QList<ToolChain *> tcs =
-            ToolChainManager::instance()->toolChains();
-
-    QStringList abiList;
-    foreach (ToolChain *tc, tcs) {
-        const QString abi = tc->targetAbi().toString();
-        if (!abiList.contains(abi))
-            abiList.append(abi);
-        if (!abiToGdbMap.contains(abi))
-            handleToolChainAdditions(tc);
-    }
-
-    QStringList toRemove;
-    for (QMap<QString, QString>::const_iterator i = abiToGdbMap.constBegin();
-         i != abiToGdbMap.constEnd(); ++i) {
-        if (!abiList.contains(i.key()))
-            toRemove.append(i.key());
-    }
-
-    foreach (const QString &key, toRemove)
-        abiToGdbMap.remove(key);
-
-    // Actual page setup:
     QWidget *w = new QWidget(parent);
     m_ui = new Ui::GdbOptionsPage;
     m_ui->setupUi(w);
-    m_ui->gdbChooserWidget->setGdbMapping(abiToGdbMap);
 
     m_ui->scriptFileChooser->setExpectedKind(Utils::PathChooser::File);
-    m_ui->scriptFileChooser->setPromptDialogTitle(tr("Choose Location of Startup Script File"));
+    m_ui->scriptFileChooser->setPromptDialogTitle(
+        tr("Choose Location of Startup Script File"));
 
     m_group.clear();
     m_group.insert(debuggerCore()->action(GdbScriptFile),
@@ -315,23 +137,11 @@ QWidget *GdbOptionsPage::createPage(QWidget *parent)
 
 void GdbOptionsPage::apply()
 {
-    if (!m_ui) // page never shown
-        return;
-
     m_group.apply(Core::ICore::instance()->settings());
-    if (m_ui->gdbChooserWidget->isDirty()) {
-        abiToGdbMap = m_ui->gdbChooserWidget->gdbMapping();
-        m_ui->gdbChooserWidget->setGdbMapping(abiToGdbMap);
-        gdbMappingChanged = true;
-    }
 }
 
 void GdbOptionsPage::finish()
 {
-    if (!m_ui) // page never shown
-        return;
-    delete m_ui;
-    m_ui = 0;
     m_group.finish();
 }
 
@@ -340,37 +150,5 @@ bool GdbOptionsPage::matches(const QString &s) const
     return m_searchKeywords.contains(s, Qt::CaseInsensitive);
 }
 
-void GdbOptionsPage::handleToolChainAdditions(ToolChain *tc)
-{
-    Abi tcAbi = tc->targetAbi();
-
-    if (tcAbi.binaryFormat() != Abi::Format_ELF
-            && tcAbi.binaryFormat() != Abi::Format_Mach_O
-            && !( tcAbi.os() == Abi::Windows
-                  && tcAbi.osFlavor() == Abi::Windows_msys ))
-        return;
-    if (abiToGdbMap.contains(tcAbi.toString()))
-        return;
-
-    QString binary;
-#ifdef Q_OS_UNIX
-    Abi hostAbi = Abi::hostAbi();
-    if (hostAbi == tcAbi)
-        binary = QLatin1String("gdb");
-#endif
-    abiToGdbMap.insert(tc->targetAbi().toString(), binary);
-}
-
-void GdbOptionsPage::handleToolChainRemovals(ToolChain *tc)
-{
-    QList<ToolChain *> tcs = ToolChainManager::instance()->toolChains();
-    foreach (ToolChain *current, tcs) {
-        if (current->targetAbi() == tc->targetAbi())
-            return;
-    }
-
-    abiToGdbMap.remove(tc->targetAbi().toString());
-}
-
 } // namespace Internal
 } // namespace Debugger
diff --git a/src/plugins/debugger/gdb/gdboptionspage.h b/src/plugins/debugger/gdb/gdboptionspage.h
index 3a7c9a2c741..91a7845e23c 100644
--- a/src/plugins/debugger/gdb/gdboptionspage.h
+++ b/src/plugins/debugger/gdb/gdboptionspage.h
@@ -65,16 +65,6 @@ public:
 
     static QString settingsId();
 
-    typedef QMap<QString, QString> GdbBinaryToolChainMap;
-    static GdbBinaryToolChainMap abiToGdbMap;
-    static bool gdbMappingChanged;
-    static void readGdbSettings();
-    static void writeGdbSettings();
-
-private slots:
-    static void handleToolChainAdditions(ProjectExplorer::ToolChain *);
-    static void handleToolChainRemovals(ProjectExplorer::ToolChain *);
-
 private:
     Ui::GdbOptionsPage *m_ui;
     Utils::SavedActionSet m_group;
-- 
GitLab