[Lldb-commits] [lldb] r293002 - Jim unintentionally had the gdb-format specifiers falling through

Jason Molenda via lldb-commits lldb-commits at lists.llvm.org
Tue Jan 24 17:41:48 PST 2017


Author: jmolenda
Date: Tue Jan 24 19:41:48 2017
New Revision: 293002

URL: http://llvm.org/viewvc/llvm-project?rev=293002&view=rev
Log:
Jim unintentionally had the gdb-format specifiers falling through
after r276132 so that 'x/4b' would print out a series of 4 8-byte
quantities.  Fix that, add a test case.

<rdar://problem/29930833> 

Modified:
    lldb/trunk/packages/Python/lldbsuite/test/functionalities/memory/read/TestMemoryRead.py
    lldb/trunk/packages/Python/lldbsuite/test/functionalities/memory/read/main.cpp
    lldb/trunk/source/Interpreter/OptionGroupFormat.cpp

Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/memory/read/TestMemoryRead.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/memory/read/TestMemoryRead.py?rev=293002&r1=293001&r2=293002&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/memory/read/TestMemoryRead.py (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/memory/read/TestMemoryRead.py Tue Jan 24 19:41:48 2017
@@ -118,3 +118,20 @@ class MemoryReadTestCase(TestBase):
                 '16',
                 '18',
                 '20'])
+
+        # the gdb format specifier and the size in characters for
+        # the returned values including the 0x prefix.
+        variations = [['b', 4], ['h', 6], ['w', 10], ['g', 18]]
+        for v in variations:
+          formatter = v[0]
+          expected_object_length = v[1]
+          self.runCmd(
+              "memory read --gdb-format 4%s &my_uint64s" % formatter)
+          lines = self.res.GetOutput().splitlines()
+          objects_read = []
+          for l in lines:
+              objects_read.extend(l.split(':')[1].split())
+          # Check that we got back 4 0x0000 etc bytes
+          for o in objects_read:
+              self.assertTrue (len(o) == expected_object_length)
+          self.assertTrue(len(objects_read) == 4)

Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/memory/read/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/memory/read/main.cpp?rev=293002&r1=293001&r2=293002&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/memory/read/main.cpp (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/memory/read/main.cpp Tue Jan 24 19:41:48 2017
@@ -7,12 +7,14 @@
 //
 //===----------------------------------------------------------------------===//
 #include <stdio.h>
+#include <stdint.h>
 
 int main (int argc, char const *argv[])
 {
     char my_string[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 0};
     double my_double = 1234.5678;
     int my_ints[] = {2,4,6,8,10,12,14,16,18,20,22};
+    uint64_t my_uint64s[] = {0, 1, 2, 3, 4, 5, 6, 7};
     printf("my_string=%s\n", my_string); // Set break point at this line.
     printf("my_double=%g\n", my_double);
     return 0;

Modified: lldb/trunk/source/Interpreter/OptionGroupFormat.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionGroupFormat.cpp?rev=293002&r1=293001&r2=293002&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/OptionGroupFormat.cpp (original)
+++ lldb/trunk/source/Interpreter/OptionGroupFormat.cpp Tue Jan 24 19:41:48 2017
@@ -235,32 +235,36 @@ bool OptionGroupFormat::ParserGDBFormatL
     m_prev_gdb_format = format_letter;
     return true;
 
-  // Size isn't used for printing instructions, so if a size is specified, and
-  // the previous format was
-  // 'i', then we should reset it to the default ('x').  Otherwise we'll
-  // continue to print as instructions,
-  // which isn't expected.
   case 'b':
-    byte_size = 1;
-    LLVM_FALLTHROUGH;
   case 'h':
-    byte_size = 2;
-    LLVM_FALLTHROUGH;
   case 'w':
-    byte_size = 4;
-    LLVM_FALLTHROUGH;
   case 'g':
-    byte_size = 8;
-
-    m_prev_gdb_size = format_letter;
-    if (m_prev_gdb_format == 'i')
-      m_prev_gdb_format = 'x';
-    return true;
+    {
+      // Size isn't used for printing instructions, so if a size is specified, and
+      // the previous format was
+      // 'i', then we should reset it to the default ('x').  Otherwise we'll
+      // continue to print as instructions,
+      // which isn't expected.
+      if (format_letter == 'b')
+          byte_size = 1;
+      else if (format_letter == 'h')
+          byte_size = 2;
+      else if (format_letter == 'w')
+          byte_size = 4;
+      else if (format_letter == 'g')
+          byte_size = 8;
 
+        m_prev_gdb_size = format_letter;
+        if (m_prev_gdb_format == 'i')
+          m_prev_gdb_format = 'x';
+        return true;
+    }
     break;
   default:
     break;
   }
+
+
   return false;
 }
 




More information about the lldb-commits mailing list