[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