[Lldb-commits] [lldb] r210963 - Added gdb-remote expedited register dupe check.
Todd Fiala
todd.fiala at gmail.com
Fri Jun 13 20:03:24 PDT 2014
Author: tfiala
Date: Fri Jun 13 22:03:23 2014
New Revision: 210963
URL: http://llvm.org/viewvc/llvm-project?rev=210963&view=rev
Log:
Added gdb-remote expedited register dupe check.
The llgs branch had a bug where register sets were not terminated with
LLDB_INVALID_REGNUM so the expedite register loop was issuing duplicate
registers. This test was added to catch the problem.
Enhanced the key-val collection method to optionally (and by default)
support capturing duplicate values for a given key. When that happens
and if permitted, it promotes a single key to a list and appends values
to it.
Modified:
lldb/trunk/test/tools/lldb-gdbserver/TestGdbRemoteExpeditedRegisters.py
lldb/trunk/test/tools/lldb-gdbserver/gdbremote_testcase.py
Modified: lldb/trunk/test/tools/lldb-gdbserver/TestGdbRemoteExpeditedRegisters.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-gdbserver/TestGdbRemoteExpeditedRegisters.py?rev=210963&r1=210962&r2=210963&view=diff
==============================================================================
--- lldb/trunk/test/tools/lldb-gdbserver/TestGdbRemoteExpeditedRegisters.py (original)
+++ lldb/trunk/test/tools/lldb-gdbserver/TestGdbRemoteExpeditedRegisters.py Fri Jun 13 22:03:23 2014
@@ -32,6 +32,8 @@ class TestGdbRemoteExpeditedRegisters(gd
def stop_notification_contains_generic_register(self, generic_register_name):
# Generate a stop reply, parse out expedited registers from stop notification.
expedited_registers = self.gather_expedited_registers()
+ self.assertIsNotNone(expedited_registers)
+ self.assertTrue(len(expedited_registers) > 0)
# Gather target register infos.
reg_infos = self.gather_register_infos()
@@ -67,6 +69,31 @@ class TestGdbRemoteExpeditedRegisters(gd
self.set_inferior_startup_launch()
self.stop_notification_contains_any_registers()
+ def stop_notification_contains_no_duplicate_registers(self):
+ # Generate a stop reply, parse out expedited registers from stop notification.
+ expedited_registers = self.gather_expedited_registers()
+ # Verify no expedited register was specified multiple times.
+ for (reg_num, value) in expedited_registers.items():
+ if (type(value) == list) and (len(value) > 0):
+ self.fail("expedited register number {} specified more than once ({} times)".format(reg_num, len(value)))
+
+ @debugserver_test
+ @dsym_test
+ def test_stop_notification_contains_no_duplicate_registers_debugserver_dsym(self):
+ self.init_debugserver_test()
+ self.buildDsym()
+ self.set_inferior_startup_launch()
+ self.stop_notification_contains_no_duplicate_registers()
+
+ @llgs_test
+ @dwarf_test
+ @unittest2.expectedFailure()
+ def test_stop_notification_contains_no_duplicate_registers_llgs_dwarf(self):
+ self.init_llgs_test()
+ self.buildDwarf()
+ self.set_inferior_startup_launch()
+ self.stop_notification_contains_no_duplicate_registers()
+
def stop_notification_contains_pc_register(self):
self.stop_notification_contains_generic_register("pc")
Modified: lldb/trunk/test/tools/lldb-gdbserver/gdbremote_testcase.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-gdbserver/gdbremote_testcase.py?rev=210963&r1=210962&r2=210963&view=diff
==============================================================================
--- lldb/trunk/test/tools/lldb-gdbserver/gdbremote_testcase.py (original)
+++ lldb/trunk/test/tools/lldb-gdbserver/gdbremote_testcase.py Fri Jun 13 22:03:23 2014
@@ -345,11 +345,23 @@ class GdbRemoteTestCaseBase(TestBase):
{"direction":"send", "regex":r"^\$(.+)#[0-9a-fA-F]{2}$", "capture":{1:"memory_region_response"} }],
True)
- def parse_key_val_dict(self, key_val_text):
+ def parse_key_val_dict(self, key_val_text, allow_dupes=True):
self.assertIsNotNone(key_val_text)
kv_dict = {}
for match in re.finditer(r";?([^:]+):([^;]+)", key_val_text):
- kv_dict[match.group(1)] = match.group(2)
+ key = match.group(1)
+ val = match.group(2)
+ if key in kv_dict:
+ if allow_dupes:
+ if type(kv_dict[key]) == list:
+ kv_dict[key].append(val)
+ else:
+ # Promote to list
+ kv_dict[key] = [kv_dict[key], val]
+ else:
+ self.fail("key '{}' already present when attempting to add value '{}' (text='{}', dict={})".format(key, val, key_val_text, kv_dict))
+ else:
+ kv_dict[key] = val
return kv_dict
def parse_memory_region_packet(self, context):
More information about the lldb-commits
mailing list