summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/lldb-enumerations.h1
-rw-r--r--lldb/source/Commands/CommandObjectMemory.cpp1
-rw-r--r--lldb/source/Core/DataExtractor.cpp40
-rw-r--r--lldb/source/Core/FormatManager.cpp3
-rw-r--r--lldb/source/Core/ValueObject.cpp1
-rw-r--r--lldb/source/Symbol/ClangASTType.cpp1
-rw-r--r--lldb/test/functionalities/data-formatter/rdar-10449092/Makefile5
-rw-r--r--lldb/test/functionalities/data-formatter/rdar-10449092/Test-rdar-10449092.py99
-rw-r--r--lldb/test/functionalities/data-formatter/rdar-10449092/main.cpp25
9 files changed, 157 insertions, 19 deletions
diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h
index 0ed17c69c77..e8a9e9b6eaa 100644
--- a/lldb/include/lldb/lldb-enumerations.h
+++ b/lldb/include/lldb/lldb-enumerations.h
@@ -100,6 +100,7 @@ namespace lldb {
eFormatDecimal,
eFormatEnum,
eFormatHex,
+ eFormatHexUppercase,
eFormatFloat,
eFormatOctal,
eFormatOSType, // OS character codes encoded into an integer 'PICT' 'text' etc...
diff --git a/lldb/source/Commands/CommandObjectMemory.cpp b/lldb/source/Commands/CommandObjectMemory.cpp
index 71522308389..6d9035a7887 100644
--- a/lldb/source/Commands/CommandObjectMemory.cpp
+++ b/lldb/source/Commands/CommandObjectMemory.cpp
@@ -1116,6 +1116,7 @@ protected:
case eFormatDefault:
case eFormatBytes:
case eFormatHex:
+ case eFormatHexUppercase:
case eFormatPointer:
// Decode hex bytes
diff --git a/lldb/source/Core/DataExtractor.cpp b/lldb/source/Core/DataExtractor.cpp
index 24d1dc12c27..7cfe16991df 100644
--- a/lldb/source/Core/DataExtractor.cpp
+++ b/lldb/source/Core/DataExtractor.cpp
@@ -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]);
+ }
}
}
}
diff --git a/lldb/source/Core/FormatManager.cpp b/lldb/source/Core/FormatManager.cpp
index f9509cb01e7..c35c0b3cd26 100644
--- a/lldb/source/Core/FormatManager.cpp
+++ b/lldb/source/Core/FormatManager.cpp
@@ -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" }
};
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp
index 127152e3bb4..8016bab3d2e 100644
--- a/lldb/source/Core/ValueObject.cpp
+++ b/lldb/source/Core/ValueObject.cpp
@@ -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) ||
diff --git a/lldb/source/Symbol/ClangASTType.cpp b/lldb/source/Symbol/ClangASTType.cpp
index 9e622717e34..642936106ee 100644
--- a/lldb/source/Symbol/ClangASTType.cpp
+++ b/lldb/source/Symbol/ClangASTType.cpp
@@ -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
index 00000000000..314f1cb2f07
--- /dev/null
+++ b/lldb/test/functionalities/data-formatter/rdar-10449092/Makefile
@@ -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
index 00000000000..63c0796e512
--- /dev/null
+++ b/lldb/test/functionalities/data-formatter/rdar-10449092/Test-rdar-10449092.py
@@ -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
index 00000000000..97804202639
--- /dev/null
+++ b/lldb/test/functionalities/data-formatter/rdar-10449092/main.cpp
@@ -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;
+}
+
OpenPOWER on IntegriCloud