From b51524c5c18e7790e7a436e159c1107a4b88d413 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 8 Sep 2011 17:38:47 +0200
Subject: [PATCH] debugger: take care of unknown instructions in arm
 disassembler output

Change-Id: Ibeb8992856e8c5031e21925316c3fb0f9d7764e1
Reviewed-on: http://codereview.qt-project.org/4479
Reviewed-by: hjk <qthjk@ovi.com>
---
 src/plugins/debugger/disassemblerlines.cpp | 37 ++++++++++++++--------
 1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/src/plugins/debugger/disassemblerlines.cpp b/src/plugins/debugger/disassemblerlines.cpp
index b3f98bea53a..1126758db24 100644
--- a/src/plugins/debugger/disassemblerlines.cpp
+++ b/src/plugins/debugger/disassemblerlines.cpp
@@ -168,22 +168,31 @@ void DisassemblerLines::appendUnparsed(const QString &unparsed)
     if (line.startsWith("0x")) {
         // Address line.
         int pos1 = line.indexOf('<') + 1;
-        int pos2 = line.indexOf('+', pos1);
-        int pos3 = line.indexOf('>', pos1);
-        if (pos1 < pos2 && pos2 < pos3) {
-            QString function = line.mid(pos1, pos2 - pos1);
-            if (function != m_lastFunction) {
-                DisassemblerLine dl;
-                dl.data = _("Function: ") + function;
-                m_data.append(dl);
-                m_lastFunction = function;
+        int posc = line.indexOf(':');
+        DisassemblerLine dl;
+        if (pos1 && line.indexOf("<UNDEFINED> instruction:") == -1) {
+            int pos2 = line.indexOf('+', pos1);
+            int pos3 = line.indexOf('>', pos1);
+            if (pos1 < pos2 && pos2 < pos3) {
+                QString function = line.mid(pos1, pos2 - pos1);
+                if (function != m_lastFunction) {
+                    DisassemblerLine dl;
+                    dl.data = _("Function: ") + function;
+                    m_data.append(dl);
+                    m_lastFunction = function;
+                }
             }
+            dl.address = line.left(pos1 - 1).toULongLong(0, 0);
+            dl.function = m_lastFunction;
+            dl.offset = line.mid(pos2, pos3 - pos2).toUInt();
+            dl.data = line.mid(pos3 + 3).trimmed();
+        } else {
+            // Plain data like "0x0000cd64:\tadd\tlr, pc, lr\n"
+            dl.address = line.left(posc).toULongLong(0, 0);
+            dl.function = m_lastFunction;
+            dl.offset = 0;
+            dl.data = line.mid(posc + 1).trimmed();
         }
-        DisassemblerLine dl;
-        dl.address = line.left(pos1 - 1).toULongLong(0, 0);
-        dl.function = m_lastFunction;
-        dl.offset = line.mid(pos2, pos3 - pos2).toUInt();
-        dl.data = line.mid(pos3 + 3).trimmed();
         m_rowCache[dl.address] = m_data.size() + 1;
         m_data.append(dl);
     } else {
-- 
GitLab