From c717c1f9c70fe9b5308f13f0b614de37bf1aa4da Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Mon, 25 Oct 2010 15:21:36 +0200
Subject: [PATCH] Debugger: Suppress inconsistencies in gdb binary settings.

caused by the merging of global settings.
Terminate list of binaries by an empty element to prevent
accidental reading of consecutive keys.
Add Linux-ICC to list of toolchains for gdb.

Acked-by: hjk
Reviewed-by: Daniel Molkentin <daniel.molkentin@nokia.com>
Task-number: QTCREATORBUG-2848
---
 src/plugins/debugger/debuggeractions.cpp      | 22 +++++++++++++++++--
 src/plugins/debugger/gdb/gdbchooserwidget.cpp |  2 ++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp
index 3774c37793f..b75a5a356d8 100644
--- a/src/plugins/debugger/debuggeractions.cpp
+++ b/src/plugins/debugger/debuggeractions.cpp
@@ -101,14 +101,28 @@ void DebuggerSettings::readSettings(QSettings *settings)
             break;
         const QString binary = tokens.front();
         tokens.pop_front();
-        foreach(const QString &t, tokens)
-            m_gdbBinaryToolChainMap.insert(binary, t.toInt());
+        foreach(const QString &t, tokens) {
+            // Paranoia: Check if the there is already a binary configured for the toolchain.
+            const int toolChain = t.toInt();
+            const QString predefinedGdb = m_gdbBinaryToolChainMap.key(toolChain);
+            if (predefinedGdb.isEmpty()) {
+                m_gdbBinaryToolChainMap.insert(binary, toolChain);
+            } else {
+                const QString toolChainName = ProjectExplorer::ToolChain::toolChainName(static_cast<ProjectExplorer::ToolChain::ToolChainType>(toolChain));
+                const QString msg =
+                        QString::fromLatin1("An inconsistency has been encountered in the Ini-file '%1':\n"
+                                            "Skipping gdb binary '%2' for toolchain '%3' as '%4' is already configured for it.").
+                        arg(settings->fileName(), binary, toolChainName, predefinedGdb);
+                qWarning("%s", qPrintable(msg));
+            }
+        }
     }
     // Linux defaults
 #ifdef Q_OS_UNIX
     if (m_gdbBinaryToolChainMap.isEmpty()) {
         const QString gdb = QLatin1String("gdb");
         m_gdbBinaryToolChainMap.insert(gdb, ProjectExplorer::ToolChain::GCC);
+        m_gdbBinaryToolChainMap.insert(gdb, ProjectExplorer::ToolChain::LINUX_ICC);
         m_gdbBinaryToolChainMap.insert(gdb, ProjectExplorer::ToolChain::OTHER);
         m_gdbBinaryToolChainMap.insert(gdb, ProjectExplorer::ToolChain::UNKNOWN);
     }
@@ -133,6 +147,10 @@ void DebuggerSettings::writeSettings(QSettings *settings) const
         settingsList.back().append(separator); // Append toolchain to last binary
         settingsList.back().append(QString::number(it.value()));
     }
+    // Terminate settings list by an empty element such that consecutive keys resulting
+    // from ini-file merging are suppressed while reading.
+    settingsList.push_back(QString());
+    // Write out list
     settings->beginGroup(QLatin1String(gdbBinariesSettingsGroupC));
     settings->remove(QString()); // remove all keys in group.
     const int count = settingsList.size();
diff --git a/src/plugins/debugger/gdb/gdbchooserwidget.cpp b/src/plugins/debugger/gdb/gdbchooserwidget.cpp
index 7c937575cba..ec666e5ddf2 100644
--- a/src/plugins/debugger/gdb/gdbchooserwidget.cpp
+++ b/src/plugins/debugger/gdb/gdbchooserwidget.cpp
@@ -68,6 +68,7 @@ static QList<int> allGdbToolChains()
     rc
 #ifdef Q_OS_UNIX
        << ProjectExplorer::ToolChain::GCC
+       << ProjectExplorer::ToolChain::LINUX_ICC
 #endif
 #ifdef Q_OS_WIN
        << ProjectExplorer::ToolChain::MinGW
@@ -424,6 +425,7 @@ ToolChainSelectorWidget::ToolChainSelectorWidget(QWidget *parent) :
     foreach(int tc, allGdbToolChains()) {
         switch (tc) {
         case ProjectExplorer::ToolChain::GCC:
+        case ProjectExplorer::ToolChain::LINUX_ICC:
         case ProjectExplorer::ToolChain::MinGW:
         case ProjectExplorer::ToolChain::OTHER:
         case ProjectExplorer::ToolChain::UNKNOWN:
-- 
GitLab