<rdar://problem/10449092> Adding a new uppercase hex format specifier. This commit...
authorEnrico Granata <egranata@apple.com>
Thu, 9 Aug 2012 19:33:34 +0000 (19:33 +0000)
committerEnrico Granata <egranata@apple.com>
Thu, 9 Aug 2012 19:33:34 +0000 (19:33 +0000)
llvm-svn: 161606

lldb/include/lldb/lldb-enumerations.h
lldb/source/Commands/CommandObjectMemory.cpp
lldb/source/Core/DataExtractor.cpp
lldb/source/Core/FormatManager.cpp
lldb/source/Core/ValueObject.cpp
lldb/source/Symbol/ClangASTType.cpp
lldb/test/functionalities/data-formatter/rdar-10449092/Makefile [new file with mode: 0644]
lldb/test/functionalities/data-formatter/rdar-10449092/Test-rdar-10449092.py [new file with mode: 0644]
lldb/test/functionalities/data-formatter/rdar-10449092/main.cpp [new file with mode: 0644]

index 0ed17c6..e8a9e9b 100644 (file)
@@ -100,6 +100,7 @@ namespace lldb {
         eFormatDecimal,
         eFormatEnum,
         eFormatHex,
+        eFormatHexUppercase,
         eFormatFloat,
         eFormatOctal,
         eFormatOSType,          // OS character codes encoded into an integer 'PICT' 'text' etc...
index 7152230..6d9035a 100644 (file)
@@ -1116,6 +1116,7 @@ protected:
             case eFormatDefault:
             case eFormatBytes:
             case eFormatHex:
+            case eFormatHexUppercase:
             case eFormatPointer:
                 
                 // Decode hex bytes
index 24d1dc1..7cfe169 100644 (file)
@@ -1675,27 +1675,31 @@ DataExtractor::Dump (Stream *s,
         default:
         case eFormatDefault:
         case eFormatHex:
-            if (item_byte_size <= 8)
-            {
-                s->Printf("0x%*.*llx", 2 * item_byte_size, 2 * item_byte_size, GetMaxU64Bitfield(&offset, item_byte_size, item_bit_size, item_bit_offset));
-            }
-            else
+        case eFormatHexUppercase:
             {
-                assert (item_bit_size == 0 && item_bit_offset == 0);
-                s->PutCString("0x");
-                const uint8_t *bytes = (const uint8_t* )GetData(&offset, item_byte_size);
-                if (bytes)
+                bool wantsuppercase  = (item_format == eFormatHexUppercase);
+                if (item_byte_size <= 8)
                 {
-                    uint32_t idx;
-                    if (m_byte_order == eByteOrderBig)
-                    {
-                        for (idx = 0; idx < item_byte_size; ++idx)
-                            s->Printf("%2.2x", bytes[idx]);
-                    }
-                    else
+                    s->Printf(wantsuppercase ? "0x%*.*llX" : "0x%*.*llx", 2 * item_byte_size, 2 * item_byte_size, GetMaxU64Bitfield(&offset, item_byte_size, item_bit_size, item_bit_offset));
+                }
+                else
+                {
+                    assert (item_bit_size == 0 && item_bit_offset == 0);
+                    s->PutCString("0x");
+                    const uint8_t *bytes = (const uint8_t* )GetData(&offset, item_byte_size);
+                    if (bytes)
                     {
-                        for (idx = 0; idx < item_byte_size; ++idx)
-                            s->Printf("%2.2x", bytes[item_byte_size - 1 - idx]);
+                        uint32_t idx;
+                        if (m_byte_order == eByteOrderBig)
+                        {
+                            for (idx = 0; idx < item_byte_size; ++idx)
+                                s->Printf(wantsuppercase ? "%2.2X" : "%2.2x", bytes[idx]);
+                        }
+                        else
+                        {
+                            for (idx = 0; idx < item_byte_size; ++idx)
+                                s->Printf(wantsuppercase ? "%2.2X" : "%2.2x", bytes[item_byte_size - 1 - idx]);
+                        }
                     }
                 }
             }
index f9509cb..c35c0b3 100644 (file)
@@ -42,6 +42,7 @@ g_format_infos[] =
     { eFormatDecimal        , 'd'   , "decimal"             },
     { eFormatEnum           , 'E'   , "enumeration"         },
     { eFormatHex            , 'x'   , "hex"                 },
+    { eFormatHexUppercase   , 'X'   , "uppercase hex"       },
     { eFormatFloat          , 'f'   , "float"               },
     { eFormatOctal          , 'o'   , "octal"               },
     { eFormatOSType         , 'O'   , "OSType"              },
@@ -64,7 +65,7 @@ g_format_infos[] =
     { eFormatComplexInteger , 'I'   , "complex integer"     },
     { eFormatCharArray      , 'a'   , "character array"     },
     { eFormatAddressInfo    , 'A'   , "address"             },
-    { eFormatHexFloat       , 'X'   , "hex float"           },
+    { eFormatHexFloat       , '\0'  , "hex float"           },
     { eFormatInstruction    , 'i'   , "instruction"         },
     { eFormatVoid           , 'v'   , "void"                }
 };
index 127152e..8016bab 100644 (file)
@@ -1426,6 +1426,7 @@ ValueObject::DumpPrintableRepresentation(Stream& s,
                 (custom_format == eFormatComplexFloat) ||
                 (custom_format == eFormatDecimal) ||
                 (custom_format == eFormatHex) ||
+                (custom_format == eFormatHexUppercase) ||
                 (custom_format == eFormatFloat) ||
                 (custom_format == eFormatOctal) ||
                 (custom_format == eFormatOSType) ||
index 9e62271..6429361 100644 (file)
@@ -1030,6 +1030,7 @@ ClangASTType::DumpTypeValue (clang::ASTContext *ast_context,
                     case eFormatDecimal:
                     case eFormatEnum:
                     case eFormatHex:
+                    case eFormatHexUppercase:
                     case eFormatFloat:
                     case eFormatOctal:
                     case eFormatOSType:
diff --git a/lldb/test/functionalities/data-formatter/rdar-10449092/Makefile b/lldb/test/functionalities/data-formatter/rdar-10449092/Makefile
new file mode 100644 (file)
index 0000000..314f1cb
--- /dev/null
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/test/functionalities/data-formatter/rdar-10449092/Test-rdar-10449092.py b/lldb/test/functionalities/data-formatter/rdar-10449092/Test-rdar-10449092.py
new file mode 100644 (file)
index 0000000..63c0796
--- /dev/null
@@ -0,0 +1,99 @@
+"""
+Test lldb data formatter subsystem.
+"""
+
+import os, time
+import unittest2
+import lldb
+from lldbtest import *
+
+class Radar10449092DataFormatterTestCase(TestBase):
+
+    # test for rdar://problem/10449092 ()
+    mydir = os.path.join("functionalities", "data-formatter", "rdar-10449092")
+
+    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
+    @dsym_test
+    def test_with_dsym_and_run_command(self):
+        """Test data formatter commands."""
+        self.buildDsym()
+        self.data_formatter_commands()
+
+    @dwarf_test
+    def test_with_dwarf_and_run_command(self):
+        """Test data formatter commands."""
+        self.buildDwarf()
+        self.data_formatter_commands()
+
+    def setUp(self):
+        # Call super's setUp().
+        TestBase.setUp(self)
+        # Find the line number to break at.
+        self.line = line_number('main.cpp', '// Set break point at this line.')
+
+    def data_formatter_commands(self):
+        """Test that that file and class static variables display correctly."""
+        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+        self.expect("breakpoint set -f main.cpp -l %d" % self.line,
+                    BREAKPOINT_CREATED,
+            startstr = "Breakpoint created: 1: file ='main.cpp', line = %d, locations = 1" %
+                        self.line)
+
+        self.runCmd("run", RUN_SUCCEEDED)
+
+        # The stop reason of the thread should be breakpoint.
+        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+            substrs = ['stopped',
+                       'stop reason = breakpoint'])
+
+        # This is the function to remove the custom formats in order to have a
+        # clean slate for the next test case.
+        def cleanup():
+            self.runCmd('type format delete hex', check=False)
+            self.runCmd('type summary clear', check=False)
+
+        # Execute the cleanup function during test case tear down.
+        self.addTearDownHook(cleanup)
+
+        self.runCmd("type format add -f uppercase int")
+     
+        self.expect('frame variable mine',
+            substrs = ['mine = ',
+                       'first = 0x001122AA', 'second = 0x1122BB44'])
+
+        self.runCmd("type format add -f hex int")
+
+        self.expect('frame variable mine',
+            substrs = ['mine = ',
+                       'first = 0x001122aa', 'second = 0x1122bb44'])
+
+        self.runCmd("type format delete int")
+
+        self.runCmd("type summary add -s \"${var.first%X} and ${var.second%x}\" foo")
+
+        self.expect('frame variable mine',
+                    substrs = ['(foo) mine = 0x001122AA and 0x1122bb44'])
+
+        self.runCmd("type summary add -s \"${var.first%X} and ${var.second%X}\" foo")
+        self.runCmd("next")
+        self.expect('frame variable mine',
+                    substrs = ['(foo) mine = 0xAABBCCDD and 0x1122BB44'])
+
+        self.runCmd("type summary add -s \"${var.first%x} and ${var.second%X}\" foo")
+        self.expect('frame variable mine',
+                    substrs = ['(foo) mine = 0xaabbccdd and 0x1122BB44'])
+        self.runCmd("next")
+        self.runCmd("type summary add -s \"${var.first%x} and ${var.second%x}\" foo")
+        self.expect('frame variable mine',
+                    substrs = ['(foo) mine = 0xaabbccdd and 0xff00ff00'])
+        self.runCmd("type summary add -s \"${var.first%X} and ${var.second%X}\" foo")
+        self.expect('frame variable mine',
+                    substrs = ['(foo) mine = 0xAABBCCDD and 0xFF00FF00'])
+
+
+if __name__ == '__main__':
+    import atexit
+    lldb.SBDebugger.Initialize()
+    atexit.register(lambda: lldb.SBDebugger.Terminate())
+    unittest2.main()
diff --git a/lldb/test/functionalities/data-formatter/rdar-10449092/main.cpp b/lldb/test/functionalities/data-formatter/rdar-10449092/main.cpp
new file mode 100644 (file)
index 0000000..9780420
--- /dev/null
@@ -0,0 +1,25 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+struct foo
+{
+    int first;
+    int second;
+};
+
+int main ()
+{
+    struct foo mine = {0x001122AA, 0x1122BB44};
+       mine.first = 0xAABBCCDD; // Set break point at this line.
+       mine.second = 0xFF00FF00;
+    return 0;
+}
+