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