diff options
author | hjk <qtc-committer@nokia.com> | 2011-04-12 17:32:41 +0200 |
---|---|---|
committer | hjk <qtc-committer@nokia.com> | 2011-04-12 17:33:08 +0200 |
commit | 82f3e788f626c3dfa7673adf4074bc30add994b0 (patch) | |
tree | ad2508840468b979621f9a77f61ad3a74d3f5e86 /src/plugins/debugger/disassemblerlines.cpp | |
parent | ffd5d69e76fe22e5db5ed1f59504c3b645ddfebf (diff) | |
download | qt-creator-82f3e788f626c3dfa7673adf4074bc30add994b0.tar.gz |
debugger: re-work DisassemblerLine structure
Diffstat (limited to 'src/plugins/debugger/disassemblerlines.cpp')
-rw-r--r-- | src/plugins/debugger/disassemblerlines.cpp | 85 |
1 files changed, 78 insertions, 7 deletions
diff --git a/src/plugins/debugger/disassemblerlines.cpp b/src/plugins/debugger/disassemblerlines.cpp index db1e2f421c..c9cba4f896 100644 --- a/src/plugins/debugger/disassemblerlines.cpp +++ b/src/plugins/debugger/disassemblerlines.cpp @@ -32,6 +32,7 @@ **************************************************************************/ #include "disassemblerlines.h" +#include "debuggerstringutils.h" #include <QtCore/QDebug> #include <QtCore/QRegExp> @@ -39,7 +40,7 @@ namespace Debugger { namespace Internal { -DisassemblerLine::DisassemblerLine(const QString &unparsed) +void DisassemblerLine::fromString(const QString &unparsed) { int pos = -1; for (int i = 0; i != unparsed.size(); ++i) { @@ -71,6 +72,13 @@ DisassemblerLine::DisassemblerLine(const QString &unparsed) data = unparsed; } +quint64 DisassemblerLine::addressFromDisassemblyLine(const QString &line) +{ + DisassemblerLine l; + l.fromString(line); + return l.address; +} + int DisassemblerLines::lineForAddress(quint64 address) const { return m_rowCache.value(address); @@ -81,17 +89,80 @@ bool DisassemblerLines::coversAddress(quint64 address) const return m_rowCache.value(address) != 0; } -void DisassemblerLines::appendComment(const QString &comment) +void DisassemblerLines::appendLine(const DisassemblerLine &dl) { - DisassemblerLine dl; - dl.data = comment; m_data.append(dl); + m_rowCache[dl.address] = m_data.size(); } -void DisassemblerLines::appendLine(const DisassemblerLine &dl) +void DisassemblerLines::appendUnparsed(const QString &unparsed) { - m_data.append(dl); - m_rowCache[dl.address] = m_data.size(); + QString line = unparsed.trimmed(); + if (line.isEmpty()) + return; + if (line.startsWith("Current language:")) + return; + if (line.startsWith("Dump of assembler")) { + m_lastFunction.clear(); + return; + } + if (line.startsWith("The current source")) + return; + if (line.startsWith("End of assembler")) { + m_lastFunction.clear(); + return; + } + if (line.startsWith("=> ")) + line = line.mid(3); + 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; + } + //line.replace(pos1, pos2 - pos1, ""); + } + 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 { + // Comment line. + DisassemblerLine dl; + dl.data = line; + m_data.append(dl); + } +} + +QString DisassemblerLine::toString() const +{ + const QString someSpace = _(" "); + QString str; + if (isAssembler()) { + if (address) + str += _("0x%1 ").arg(address, 0, 16); + if (offset) + str += _("<+0x%1> ").arg(offset, 4, 10, QLatin1Char('0')); + str += _(" "); + str += data; + } else if (isCode()) { + str += someSpace; + str += data; + } else { + str += someSpace; + str += data; + } + return str; } } // namespace Internal |