Group registers by type to make them easier to follow

These days the ISAs are adding more and more registers, which sometimes
are quite hard to follow. For instance if you're interested only in float
or only in system/CSRs registers you have to scroll down quite a lot for
monitor them.

Grouping them by thier type, it makes it much easier to follow each
register type.

Change-Id: I268626b3fe71aa8fa54be0999836caf03e8780ca
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
BogDan Vatra
2021-01-21 12:21:03 +02:00
committed by BogDan Vatra
parent f1f3881cdb
commit 111624970d
3 changed files with 139 additions and 38 deletions

View File

@@ -3020,9 +3020,9 @@ void GdbEngine::reloadRegisters()
if (!m_registerNamesListed) {
// The MI version does not give register size.
// runCommand("-data-list-register-names", CB(handleRegisterListNames));
runCommand({"maintenance print raw-registers",
CB(handleRegisterListing)});
m_registerNamesListed = true;
runCommand({"maintenance print register-groups",
CB(handleRegisterListing)});
}
// Can cause i386-linux-nat.c:571: internal-error: Got request
// for bad register number 41.\nA problem internal to GDB has been detected.
@@ -3151,11 +3151,12 @@ void GdbEngine::handleRegisterListing(const DebuggerResponse &response)
}
// &"maintenance print raw-registers\n"
// >~" Name Nr Rel Offset Size Type Raw value\n"
// >~" rax 0 0 0 8 int64_t 0x0000000000000005\n"
// >~" rip 16 16 128 8 *1 0x000000000040232a\n"
// >~" '' 145 145 536 0 int0_t <invalid>\n"
// >~" Name Nr Rel Offset Size Type Groups\n"
// >~" rax 0 0 0 8 int64_t general,all,save,restore\n"
// >~" rip 16 16 128 8 *1 general,all,save,restore\n"
// >~" fop 39 39 272 4 int float,all,save,restore\n"
// >~" xmm0 40 40 276 16 vec128 sse,all,save,restore,vector\n"
// >~" '' 145 145 536 0 int0_t general\n"
m_registers.clear();
QStringList lines = response.consoleStreamOutput.split('\n');
for (int i = 1; i < lines.size(); ++i) {
@@ -3167,6 +3168,7 @@ void GdbEngine::handleRegisterListing(const DebuggerResponse &response)
reg.name = parts.at(0);
reg.size = parts.at(4).toInt();
reg.reportedType = parts.at(5);
reg.groups = parts.at(6).split(',').toSet();
m_registers[gdbRegisterNumber] = reg;
}
}
@@ -3180,10 +3182,12 @@ void GdbEngine::handleRegisterListValues(const DebuggerResponse &response)
// 24^done,register-values=[{number="0",value="0xf423f"},...]
for (const GdbMi &item : response.data["register-values"]) {
const int number = item["number"].toInt();
Register reg = m_registers[number];
auto reg = m_registers.find(number);
if (reg == m_registers.end())
continue;
QString data = item["value"].data();
if (data.startsWith("0x")) {
reg.value.fromString(data, HexadecimalFormat);
reg->value.fromString(data, HexadecimalFormat);
} else if (data == "<error reading variable>") {
// Nothing. See QTCREATORBUG-14029.
} else {
@@ -3217,9 +3221,9 @@ void GdbEngine::handleRegisterListValues(const DebuggerResponse &response)
QTC_ASSERT(chunk.size() == 8, continue);
result.append(chunk);
}
reg.value.fromString(result, HexadecimalFormat);
reg->value.fromString(result, HexadecimalFormat);
}
handler->updateRegister(reg);
handler->updateRegister(*reg);
}
handler->commitUpdates();
}