Hi Liam

Please test the attached patch. My 3.2 head was 
37f92acccb08a6c4b2ec1c0841952a3c2a42efbd but it should patch against any 
recent 3.2 branch.

Thanks
Tim
>From 0118adcc8b647b10c04f144ac8227c3b7d4cd442 Mon Sep 17 00:00:00 2001
From: Tim Sander <[email protected]>
Date: Wed, 23 Jul 2014 09:11:51 +0200
Subject: [PATCH] baremetal: add extended-remote option and device handling

Change-Id: I0f783aed83214d8c122f0a9d8fb9abd47dda07c4
---
 src/plugins/baremetal/baremetaldevice.cpp          |    4 ++++
 src/plugins/baremetal/baremetaldevice.h            |    4 ++++
 .../baremetaldeviceconfigurationwidget.cpp         |   14 ++++++++++++++
 .../baremetal/baremetaldeviceconfigurationwidget.h |    4 +++-
 .../baremetaldeviceconfigurationwizard.cpp         |    1 +
 .../baremetaldeviceconfigurationwizardpages.cpp    |   10 +++++++++-
 .../baremetaldeviceconfigurationwizardpages.h      |    3 +++
 .../baremetal/baremetalruncontrolfactory.cpp       |    4 +++-
 src/plugins/debugger/debuggerstartparameters.h     |    2 ++
 .../debugger/gdb/remotegdbserveradapter.cpp        |    9 ++++++---
 10 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp
index 8a0ab72..c569b44 100644
--- a/src/plugins/baremetal/baremetaldevice.cpp
+++ b/src/plugins/baremetal/baremetaldevice.cpp
@@ -40,6 +40,7 @@ namespace Internal {
 
 const char GdbResetKey[] = "GdbResetCommand";
 const char GdbCommandsKey[] = "GdbCommands";
+const char GdbExtendedRemoteKey[] = "GdbExtendedRemote";
 
 BareMetalDevice::Ptr BareMetalDevice::create()
 {
@@ -61,6 +62,7 @@ void BareMetalDevice::fromMap(const QVariantMap &map)
     IDevice::fromMap(map);
     setGdbResetCommands(map.value(QLatin1String(GdbResetKey)).toString());
     setGdbInitCommands(map.value(QLatin1String(GdbCommandsKey)).toString());
+    setGdbExtendedRemote(map.value(QLatin1String(GdbExtendedRemoteKey)).toBool());
 }
 
 QVariantMap BareMetalDevice::toMap() const
@@ -68,6 +70,7 @@ QVariantMap BareMetalDevice::toMap() const
     QVariantMap map = IDevice::toMap();
     map.insert(QLatin1String(GdbResetKey), gdbResetCommands());
     map.insert(QLatin1String(GdbCommandsKey), gdbInitCommands());
+    map.insert(QLatin1String(GdbExtendedRemoteKey), gdbExtendedRemote());
     return map;
 }
 
@@ -119,6 +122,7 @@ BareMetalDevice::BareMetalDevice(const BareMetalDevice &other)
 {
     setGdbResetCommands(other.gdbResetCommands());
     setGdbInitCommands(other.gdbInitCommands());
+    setGdbExtendedRemote(other.gdbExtendedRemote());
 }
 
 QString BareMetalDevice::exampleString()
diff --git a/src/plugins/baremetal/baremetaldevice.h b/src/plugins/baremetal/baremetaldevice.h
index 375fcf4..727f36a 100644
--- a/src/plugins/baremetal/baremetaldevice.h
+++ b/src/plugins/baremetal/baremetaldevice.h
@@ -61,6 +61,9 @@ public:
     QString gdbInitCommands() const { return m_gdbInitCommands; }
     void setGdbInitCommands(const QString &gdbCommands) { m_gdbInitCommands=gdbCommands; }
 
+    bool gdbExtendedRemote() const { return m_gdbExtendedRemote;}
+    void setGdbExtendedRemote(bool extendedRemoteTarget) { m_gdbExtendedRemote = extendedRemoteTarget; }
+
     virtual void fromMap(const QVariantMap &map);
     virtual QVariantMap toMap() const;
 
@@ -79,6 +82,7 @@ private:
     BareMetalDevice &operator=(const BareMetalDevice &);
     QString m_gdbResetCommands;
     QString m_gdbInitCommands;
+    bool m_gdbExtendedRemote;
 };
 
 } //namespace Internal
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp
index 0431977..e551fbb 100644
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp
+++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp
@@ -35,6 +35,7 @@
 #include <ssh/sshconnection.h>
 #include <utils/qtcassert.h>
 
+#include <QCheckBox>
 #include <QFormLayout>
 #include <QLabel>
 #include <QLineEdit>
@@ -55,6 +56,9 @@ BareMetalDeviceConfigurationWidget::BareMetalDeviceConfigurationWidget(
     QSharedPointer<BareMetalDevice> p = qSharedPointerCast<BareMetalDevice>(device());
     QTC_ASSERT(!p.isNull(), return);
 
+    m_gdbExtendedRemote = new QCheckBox(this);
+    m_gdbExtendedRemote->setChecked(p->gdbExtendedRemote());
+
     m_gdbHostLineEdit = new QLineEdit(this);
     m_gdbHostLineEdit->setText(sshParams.host);
     m_gdbHostLineEdit->setToolTip(BareMetalDevice::hostLineToolTip());
@@ -73,6 +77,7 @@ BareMetalDeviceConfigurationWidget::BareMetalDeviceConfigurationWidget(
 
     QFormLayout *formLayout = new QFormLayout(this);
     formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
+    formLayout->addRow(tr("GDB ext-remote:"), m_gdbExtendedRemote);
     formLayout->addRow(tr("GDB host:"), m_gdbHostLineEdit);
     formLayout->addRow(tr("GDB port:"), m_gdbPortSpinBox);
     formLayout->addRow(tr("Init commands:"), m_gdbInitCommandsTextEdit);
@@ -82,12 +87,20 @@ BareMetalDeviceConfigurationWidget::BareMetalDeviceConfigurationWidget(
     VariableChooser::addVariableSupport(m_gdbInitCommandsTextEdit);
     (void)new VariableChooser(this);
 
+    connect(m_gdbExtendedRemote, SIGNAL(toggled(bool)), SLOT(extendedRemoteChanged()));
     connect(m_gdbHostLineEdit, SIGNAL(editingFinished()), SLOT(hostnameChanged()));
     connect(m_gdbPortSpinBox, SIGNAL(valueChanged(int)), SLOT(portChanged()));
     connect(m_gdbResetCommandsTextEdit, SIGNAL(textChanged()),SLOT(gdbResetCommandsChanged()));
     connect(m_gdbInitCommandsTextEdit, SIGNAL(textChanged()), SLOT(gdbInitCommandsChanged()));
 }
 
+void BareMetalDeviceConfigurationWidget::extendedRemoteChanged()
+{
+    QSharedPointer<BareMetalDevice> p = qSharedPointerCast<BareMetalDevice>(device());
+    QTC_ASSERT(!p.isNull(), return);
+    p->setGdbExtendedRemote(m_gdbExtendedRemote->isChecked());
+}
+
 void BareMetalDeviceConfigurationWidget::hostnameChanged()
 {
     SshConnectionParameters sshParams = device()->sshParameters();
@@ -118,6 +131,7 @@ void BareMetalDeviceConfigurationWidget::gdbInitCommandsChanged()
 
 void BareMetalDeviceConfigurationWidget::updateDeviceFromUi()
 {
+    extendedRemoteChanged();
     hostnameChanged();
     portChanged();
     gdbResetCommandsChanged();
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h
index fb1dc29..e66cc7a 100644
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h
+++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h
@@ -36,6 +36,7 @@ QT_BEGIN_NAMESPACE
 class QLineEdit;
 class QSpinBox;
 class QPlainTextEdit;
+class QCheckBox;
 QT_END_NAMESPACE
 
 namespace BareMetal {
@@ -51,6 +52,7 @@ public:
         const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent = 0);
 
 private slots:
+    void extendedRemoteChanged();
     void hostnameChanged();
     void portChanged();
     void gdbResetCommandsChanged();
@@ -59,7 +61,7 @@ private slots:
 private:
     void updateDeviceFromUi();
     void initGui();
-
+    QCheckBox *m_gdbExtendedRemote;
     QLineEdit *m_gdbHostLineEdit;
     QSpinBox *m_gdbPortSpinBox;
     QPlainTextEdit *m_gdbResetCommandsTextEdit;
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp
index e2396fb..81d5215 100644
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp
+++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp
@@ -59,6 +59,7 @@ IDevice::Ptr BareMetalDeviceConfigurationWizard::device() const
                                                           Constants::BareMetalOsType,
                                                           IDevice::Hardware);
     device->setSshParameters(sshParams);
+    device->setGdbExtendedRemote(m_setupPage->gdbExtendedRemote());
     device->setGdbResetCommands(m_setupPage->gdbResetCommands());
     device->setGdbInitCommands(m_setupPage->gdbInitCommands());
     return device;
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp
index 90ef922..5cc6953 100644
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp
+++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp
@@ -37,6 +37,7 @@
 #include <QLineEdit>
 #include <QPlainTextEdit>
 #include <QSpinBox>
+#include <QCheckBox>
 
 using namespace Core;
 
@@ -50,6 +51,7 @@ BareMetalDeviceConfigurationWizardSetupPage::BareMetalDeviceConfigurationWizardS
 
     m_nameLineEdit = new QLineEdit(this);
 
+    m_extendedRemote = new QCheckBox(this);
     m_hostNameLineEdit = new QLineEdit(this);
     m_hostNameLineEdit->setToolTip(BareMetalDevice::hostLineToolTip());
     m_hostNameLineEdit->setText(QLatin1String(
@@ -76,7 +78,8 @@ BareMetalDeviceConfigurationWizardSetupPage::BareMetalDeviceConfigurationWizardS
     QFormLayout *formLayout = new QFormLayout(this);
     formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
     formLayout->addRow(tr("Name:"), m_nameLineEdit);
-    formLayout->addRow(tr("GDB host:"), m_hostNameLineEdit);
+    formLayout->addRow(tr("GDB ext-remote:"), m_extendedRemote),
+    formLayout->addRow(tr("GDB host:"), m_hostNameLineEdit),
     formLayout->addRow(tr("GDB port:"), m_portSpinBox);
     formLayout->addRow(tr("Init commands:"), m_gdbInitCommandsPlainTextEdit);
     formLayout->addRow(tr("Reset commands:"), m_gdbResetCommandsTextEdit);
@@ -107,6 +110,11 @@ QString BareMetalDeviceConfigurationWizardSetupPage::configurationName() const
     return m_nameLineEdit->text().trimmed();
 }
 
+bool BareMetalDeviceConfigurationWizardSetupPage::gdbExtendedRemote() const
+{
+    return m_extendedRemote->isChecked();
+}
+
 QString BareMetalDeviceConfigurationWizardSetupPage::gdbHostname() const
 {
     return m_hostNameLineEdit->text().trimmed();
diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h
index 16096a1..93580ef 100644
--- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h
+++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h
@@ -36,6 +36,7 @@ QT_BEGIN_NAMESPACE
 class QLineEdit;
 class QSpinBox;
 class QPlainTextEdit;
+class QCheckBox;
 QT_END_NAMESPACE
 
 namespace BareMetal {
@@ -49,6 +50,7 @@ public:
     void initializePage();
     bool isComplete() const;
     QString configurationName() const;
+    bool    gdbExtendedRemote() const;
     QString gdbHostname() const;
     quint16 gdbPort() const;
     QString gdbResetCommands() const;
@@ -59,6 +61,7 @@ public:
 private:
     QLineEdit *m_nameLineEdit;
     QLineEdit *m_hostNameLineEdit;
+    QCheckBox *m_extendedRemote;
     QSpinBox *m_portSpinBox;
     QPlainTextEdit *m_gdbResetCommandsTextEdit;
     QPlainTextEdit *m_gdbInitCommandsPlainTextEdit;
diff --git a/src/plugins/baremetal/baremetalruncontrolfactory.cpp b/src/plugins/baremetal/baremetalruncontrolfactory.cpp
index b79cfb9..79a1662 100644
--- a/src/plugins/baremetal/baremetalruncontrolfactory.cpp
+++ b/src/plugins/baremetal/baremetalruncontrolfactory.cpp
@@ -97,11 +97,13 @@ DebuggerStartParameters BareMetalRunControlFactory::startParameters(const BareMe
             params.projectBuildDirectory = buildConfig->buildDirectory().toString();
         params.projectSourceFiles = project->files(Project::ExcludeGeneratedFiles);
     }
-    if (device->sshParameters().host.startsWith(QLatin1Char('|'))) //gdb pipe mode enabled
+    if (device->sshParameters().host.startsWith(QLatin1Char('|'))
+            || device->sshParameters().host.startsWith(QLatin1Char('/'))) //gdb pipe mode enabled
         params.remoteChannel = device->sshParameters().host;
     else
         params.remoteChannel = device->sshParameters().host + QLatin1String(":") + QString::number(device->sshParameters().port);
     params.remoteSetupNeeded = false; // qml stuff, not needed
+    params.useExtendedRemote = device->gdbExtendedRemote();
     params.commandsAfterConnect = device->gdbInitCommands().toLatin1();
     params.commandsForReset = device->gdbResetCommands().toLatin1();
     BuildConfiguration *bc = target->activeBuildConfiguration();
diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h
index 4f8ffe7..216e0a4 100644
--- a/src/plugins/debugger/debuggerstartparameters.h
+++ b/src/plugins/debugger/debuggerstartparameters.h
@@ -71,6 +71,7 @@ public:
         qmlServerPort(Constants::QML_DEFAULT_DEBUG_SERVER_PORT),
         remoteSetupNeeded(false),
         useContinueInsteadOfRun(false),
+        useExtendedRemote(false),
         startMode(NoStartMode),
         closeMode(KillAtClose),
         useCtrlCStub(false),
@@ -133,6 +134,7 @@ public:
     // Used by baremetal plugin
     QByteArray commandsForReset; // commands used for resetting the inferior
     bool useContinueInsteadOfRun; // if connected to a hw debugger run is not possible but continue is used
+    bool useExtendedRemote;        // use target extended-remote instead of remote
     QByteArray commandsAfterConnect; // additional commands to post after connection to debug target
 
     QStringList solibSearchPath;
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
index ca6e957..bcb866b 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
@@ -60,7 +60,7 @@ namespace Internal {
 GdbRemoteServerEngine::GdbRemoteServerEngine(const DebuggerStartParameters &startParameters)
     : GdbEngine(startParameters)
 {
-    m_isMulti = false;
+    m_isMulti = false || startParameters.useExtendedRemote;
     m_targetPid = -1;
     if (Utils::HostOsInfo::isWindowsHost())
         m_gdbProc->setUseCtrlCStub(startParameters.useCtrlCStub); // This is only set for QNX/BlackBerry
@@ -252,7 +252,7 @@ void GdbRemoteServerEngine::callTargetRemote()
     // Don't touch channels with explicitly set protocols.
     if (!channel.startsWith("tcp:") && !channel.startsWith("udp:")
             && !channel.startsWith("file:") && channel.contains(':')
-            && !channel.startsWith('|'))
+            && !channel.startsWith('|') && !channel.startsWith('/'))
     {
         // "Fix" the IPv6 case with host names without '['...']'
         if (!channel.startsWith('[') && channel.count(':') >= 2) {
@@ -265,8 +265,11 @@ void GdbRemoteServerEngine::callTargetRemote()
     if (m_isQnxGdb)
         postCommand("target qnx " + channel, CB(handleTargetQnx));
     else if (m_isMulti)
+    {
+        if (m_serverChannel.length() == 0) //fallback: startParameters.useExtendedRemote
+            m_serverChannel = channel;
         postCommand("target extended-remote " + m_serverChannel, CB(handleTargetExtendedRemote));
-    else
+    } else
         postCommand("target remote " + channel, CB(handleTargetRemote), 10);
 }
 
-- 
1.7.9.5

_______________________________________________
Qt-creator mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/qt-creator

Reply via email to