diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index 953b5d55c0aeceaa99c8378ba5e1d8ae10428782..35b5b9841d4e44b64632a9aed29c8319f52ffa5e 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -96,6 +96,7 @@ class CdbExceptionLoggerEventCallback; class GdbEngine; class CdbDebugEngine; class CdbDebugEnginePrivate; +class TrkGdbAdapter; } // namespace Internal class DEBUGGER_EXPORT DebuggerStartParameters @@ -171,6 +172,7 @@ public: friend class Internal::ScriptEngine; friend class Internal::CdbDebugEngine; friend class Internal::CdbDebugEnginePrivate; + friend class Internal::TrkGdbAdapter; DebuggerState state() const; QList<Core::IOptionsPage*> initializeEngines(unsigned enabledTypeFlags); diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h index c36be546841efe4f92e94d730e2eea836cff0a42..fe418d7976ccea72882c2de4b671f169b3b04d0d 100644 --- a/src/plugins/debugger/gdb/abstractgdbadapter.h +++ b/src/plugins/debugger/gdb/abstractgdbadapter.h @@ -57,7 +57,8 @@ public: virtual ~AbstractGdbAdapter(); virtual void write(const QByteArray &data); - virtual bool isTrkAdapter() const; // isUtterlyBrokenAdapter + virtual bool isTrkAdapter() const; + virtual void trkReloadRegisters() {} virtual void startAdapter() = 0; virtual void startInferior() = 0; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 8a5f61ed16bfbe432dad0b30cff9b6be3b1498ef..4354b63e4725830247aca4cc5194d4fc642c0d61 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2805,11 +2805,7 @@ void GdbEngine::reloadRegisters() } if (m_gdbAdapter->isTrkAdapter()) { - // FIXME: remove that special case. This is only to prevent - // gdb from asking for the values of the fixed point registers - postCommand("-data-list-register-values x 0 1 2 3 4 5 6 7 8 9 " - "10 11 12 13 14 15 25", - Discardable, CB(handleRegisterListValues)); + m_gdbAdapter->trkReloadRegisters(); } else { postCommand("-data-list-register-values x", Discardable, CB(handleRegisterListValues)); diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp index a94ca2d29fe9199708eaee8540bd0405d356eb84..46106d43529bed21d81c703d207abeca35a65c57 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp @@ -28,12 +28,14 @@ **************************************************************************/ #include "trkgdbadapter.h" + #include "launcher.h" #include "trkoptions.h" #include "trkoptionspage.h" #include "s60debuggerbluetoothstarter.h" #include "bluetoothlistener_gui.h" +#include "registerhandler.h" #include "debuggeractions.h" #include "debuggerstringutils.h" #ifndef STANDALONE_RUNNER @@ -695,7 +697,6 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd) sendGdbServerAck(); int pos = cmd.indexOf(','); //qDebug() << "SAL: " << cmd << cmd.mid(3, pos - 3) << cmd.mid(pos + 1); - bool ok = false; m_snapshot.lineFromAddress = cmd.mid(3, pos - 3).toUInt(0, 16); m_snapshot.lineToAddress = cmd.mid(pos + 1).toUInt(0, 16); //qDebug() << "SAL: " << hexxNumber(m_snapshot.lineFromAddress) @@ -2112,5 +2113,28 @@ void TrkGdbAdapter::shutdown() cleanup(); } +void TrkGdbAdapter::trkReloadRegisters() +{ + // Take advantage of direct access to cached register values. + QTC_ASSERT(m_snapshot.registerValid, /**/); + RegisterHandler *handler = m_engine->manager()->registerHandler(); + QList<Register> registers = handler->registers(); + QTC_ASSERT(registers.size() >= 25, return); + for (int i = 0; i < 16; ++i) { + Register ® = registers[i]; + QString value = hexxNumber(m_snapshot.registers[i]); + reg.changed = (value != reg.value); + if (reg.changed) + reg.value = value; + } + Register ® = registers[24]; + QString value = hexxNumber(m_snapshot.registers[16]); + reg.changed = (value != reg.value); + if (reg.changed) + reg.value = value; + handler->setRegisters(registers); +} + + } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h index 2c88eb36b2b2041792e5e85671b1ea083aeb9461..2ddb6093ef43a250e28868d9b853f4bd06bda2c1 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.h +++ b/src/plugins/debugger/gdb/trkgdbadapter.h @@ -145,6 +145,7 @@ public: void setVerbose(int verbose); void setBufferedMemoryRead(bool b) { m_bufferedMemoryRead = b; } trk::Session &session() { return m_session; } + void trkReloadRegisters(); signals: void output(const QString &msg);