diff options
| -rw-r--r-- | lldb/include/lldb/lldb-enumerations.h | 1 | ||||
| -rw-r--r-- | lldb/source/Commands/CommandObjectMemory.cpp | 1 | ||||
| -rw-r--r-- | lldb/source/Core/DataExtractor.cpp | 40 | ||||
| -rw-r--r-- | lldb/source/Core/FormatManager.cpp | 3 | ||||
| -rw-r--r-- | lldb/source/Core/ValueObject.cpp | 1 | ||||
| -rw-r--r-- | lldb/source/Symbol/ClangASTType.cpp | 1 | ||||
| -rw-r--r-- | lldb/test/functionalities/data-formatter/rdar-10449092/Makefile | 5 | ||||
| -rw-r--r-- | lldb/test/functionalities/data-formatter/rdar-10449092/Test-rdar-10449092.py | 99 | ||||
| -rw-r--r-- | lldb/test/functionalities/data-formatter/rdar-10449092/main.cpp | 25 |
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; +} + |

