From: Enrico Granata Date: Thu, 9 Aug 2012 19:33:34 +0000 (+0000) Subject: Adding a new uppercase hex format specifier. This commit... X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7ec18e3d10aeded985ab2fcb0781d17a80ad0df5;p=platform%2Fupstream%2Fllvm.git Adding a new uppercase hex format specifier. This commit also changes the short names for formats so that uppercase hex can be 'X', which was previously assigned to hex float. hex float now has no short name. llvm-svn: 161606 --- diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h index 0ed17c6..e8a9e9b 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 7152230..6d9035a 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 24d1dc1..7cfe169 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 f9509cb..c35c0b3 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 127152e..8016bab 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 9e62271..6429361 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 0000000..314f1cb --- /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 0000000..63c0796 --- /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 0000000..9780420 --- /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 + +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; +} +