From 4eb83cd8b2380c9b84e8d1b21a0a50c646f65e27 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Fri, 9 Apr 2010 14:55:09 +0200
Subject: [PATCH] debugger: basic support for address-based breakpoints

---
 src/plugins/debugger/breakhandler.cpp   | 34 +++++++++++++++++++------
 src/plugins/debugger/breakhandler.h     |  1 +
 src/plugins/debugger/debuggeragents.cpp |  1 +
 src/plugins/debugger/debuggerplugin.cpp | 15 +++++++++--
 src/plugins/debugger/gdb/gdbengine.cpp  |  3 +++
 5 files changed, 44 insertions(+), 10 deletions(-)

diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index 7b9046fa929..683117239c2 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -378,9 +378,16 @@ int BreakHandler::findBreakpoint(const BreakpointData &needle) const
 
 int BreakHandler::findBreakpoint(const QString &fileName, int lineNumber) const
 {
-    for (int index = 0; index != size(); ++index)
-        if (at(index)->isLocatedAt(fileName, lineNumber))
-            return index;
+    if (lineNumber <= 0) {
+        QByteArray address = fileName.toLatin1();
+        for (int index = 0; index != size(); ++index)
+            if (at(index)->bpAddress == address)
+                return index;
+    } else {
+        for (int index = 0; index != size(); ++index)
+            if (at(index)->isLocatedAt(fileName, lineNumber))
+                return index;
+    }
     return -1;
 }
 
@@ -710,11 +717,22 @@ void BreakHandler::setBreakpoint(const QString &fileName, int lineNumber)
     QFileInfo fi(fileName);
 
     BreakpointData *data = new BreakpointData(this);
-    data->fileName = fileName;
-    data->lineNumber = QByteArray::number(lineNumber);
-    data->pending = true;
-    data->setMarkerFileName(fileName);
-    data->setMarkerLineNumber(lineNumber);
+    if (lineNumber > 0) {
+        data->fileName = fileName;
+        data->lineNumber = QByteArray::number(lineNumber);
+        data->pending = true;
+        data->setMarkerFileName(fileName);
+        data->setMarkerLineNumber(lineNumber);
+    } else {
+        data->funcName = fileName;
+        data->lineNumber = 0;
+        data->pending = true;
+        // FIXME: Figure out in which disassembler view the Marker sits.
+        // Might be better to let the user code create the BreakpointData
+        // structure and insert it here.
+        data->setMarkerFileName(QString());
+        data->setMarkerLineNumber(0);
+    }
     append(data);
     emit layoutChanged();
     saveBreakpoints();
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index c9d476657bb..de7b751e701 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -140,6 +140,7 @@ public:
     void removeAt(int index); // This also deletes the marker.
     void clear(); // This also deletes all the marker.
     int indexOf(BreakpointData *data) { return m_bp.indexOf(data); }
+    // If lineNumber < 0, interpret fileName as address.
     int findBreakpoint(const QString &fileName, int lineNumber) const;
     int findBreakpoint(const BreakpointData &data) const; // Returns index.
     BreakpointData *findBreakpoint(int bpNumber) const;
diff --git a/src/plugins/debugger/debuggeragents.cpp b/src/plugins/debugger/debuggeragents.cpp
index b18ce8916d6..2258c66083f 100644
--- a/src/plugins/debugger/debuggeragents.cpp
+++ b/src/plugins/debugger/debuggeragents.cpp
@@ -287,6 +287,7 @@ void DisassemblerViewAgent::setContents(const QString &contents)
                 Core::Constants::K_DEFAULT_TEXT_EDITOR_ID,
                 &titlePattern));
         d->editor->setProperty("OpenedByDebugger", true);
+        d->editor->setProperty("DisassemblerView", true);
         QTC_ASSERT(d->editor, return);
         if ((plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget())))
             (void) new DisassemblerHighlighter(plainTextEdit);
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index aa7f479ddcb..2eb7529fd50 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1128,8 +1128,19 @@ void DebuggerPlugin::requestContextMenu(TextEditor::ITextEditor *editor,
 {
     if (!isDebuggable(editor))
         return;
-    QString fileName = editor->file()->fileName();
-    QString position = fileName + QString(":%1").arg(lineNumber);
+
+    QString fileName, position;
+    if (editor->property("DisassemblerView").toBool()) {
+        QString fileName = editor->file()->fileName();
+        QString line = editor->contents()
+            .section('\n', lineNumber - 1, lineNumber - 1);
+        fileName = line.left(line.indexOf(QLatin1Char(' ')));
+        lineNumber = -1;
+        position = _("*") + fileName;
+    } else {
+        fileName = editor->file()->fileName();
+        position = fileName + QString(":%1").arg(lineNumber);
+    }
     BreakpointData *data = m_manager->findBreakpoint(fileName, lineNumber);
 
     if (data) {
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index ae66cde0853..5a8d8679215 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -2150,6 +2150,9 @@ QByteArray GdbEngine::breakpointLocation(int index)
     const BreakpointData *data = manager()->breakHandler()->at(index);
     if (!data->funcName.isEmpty())
         return data->funcName.toLatin1();
+    // In this case, data->funcName is something like '*0xdeadbeef'
+    if (data->lineNumber.toInt() == 0)
+        return data->funcName.toLatin1();
     QString loc = data->useFullPath ? data->fileName : breakLocation(data->fileName);
     // The argument is simply a C-quoted version of the argument to the
     // non-MI "break" command, including the "original" quoting it wants.
-- 
GitLab