19b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata""" 29b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico GranataTest lldb data formatter subsystem. 39b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata""" 49b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 59b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granataimport os, time 69b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granataimport unittest2 79b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granataimport lldb 89b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granatafrom lldbtest import * 9431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldbutil 109b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1192f75728050db93bfaf3e73d86a4a8a3a75dad8aJohnny Chenclass CppDataFormatterTestCase(TestBase): 129b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 139b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata mydir = os.path.join("functionalities", "data-formatter", "data-formatter-cpp") 149b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 159b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 16a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen @dsym_test 179b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata def test_with_dsym_and_run_command(self): 189b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata """Test data formatter commands.""" 199b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.buildDsym() 209b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.data_formatter_commands() 219b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 22a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen @dwarf_test 239b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata def test_with_dwarf_and_run_command(self): 249b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata """Test data formatter commands.""" 259b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.buildDwarf() 269b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.data_formatter_commands() 279b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 289b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata def setUp(self): 299b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata # Call super's setUp(). 309b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata TestBase.setUp(self) 319b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata # Find the line number to break at. 329b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.line = line_number('main.cpp', '// Set break point at this line.') 339b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 349b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata def data_formatter_commands(self): 359b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata """Test that that file and class static variables display correctly.""" 369b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) 379b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 38431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True) 399b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 409b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd("run", RUN_SUCCEEDED) 419b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 429b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata # The stop reason of the thread should be breakpoint. 439b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 449b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['stopped', 459b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 'stop reason = breakpoint']) 469b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 479b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable", 489b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['(Speed) SPILookHex = 5.55' # Speed by default is 5.55. 499b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata ]); 509b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 519b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata # This is the function to remove the custom formats in order to have a 529b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata # clean slate for the next test case. 539b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata def cleanup(): 549b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd('type format clear', check=False) 559b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd('type summary clear', check=False) 569b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 579b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata # Execute the cleanup function during test case tear down. 589b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.addTearDownHook(cleanup) 599b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 609b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd("type format add -C yes -f x Speed BitField") 619b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd("type format add -C no -f c RealNumber") 629b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd("type format add -C no -f x Type2") 639b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd("type format add -C yes -f c Type1") 649b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 659b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata # The type format list should show our custom formats. 669b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("type format list", 679b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['RealNumber', 689b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 'Speed', 699b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 'BitField', 709b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 'Type1', 719b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 'Type2']) 729b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 739b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable", 749b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata patterns = ['\(Speed\) SPILookHex = 0x[0-9a-f]+' # Speed should look hex-ish now. 759b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata ]); 761a102087f54079c25c8827afac6153a44ca535daEnrico Granata 771a102087f54079c25c8827afac6153a44ca535daEnrico Granata # gcc4.2 on Mac OS X skips typedef chains in the DWARF output 781a102087f54079c25c8827afac6153a44ca535daEnrico Granata if self.getCompiler() in ['clang', 'llvm-gcc']: 791a102087f54079c25c8827afac6153a44ca535daEnrico Granata self.expect("frame variable", 801a102087f54079c25c8827afac6153a44ca535daEnrico Granata patterns = ['\(SignalMask\) SMILookHex = 0x[0-9a-f]+' # SignalMask should look hex-ish now. 811a102087f54079c25c8827afac6153a44ca535daEnrico Granata ]); 821a102087f54079c25c8827afac6153a44ca535daEnrico Granata self.expect("frame variable", matching=False, 831a102087f54079c25c8827afac6153a44ca535daEnrico Granata patterns = ['\(Type4\) T4ILookChar = 0x[0-9a-f]+' # Type4 should NOT look hex-ish now. 841a102087f54079c25c8827afac6153a44ca535daEnrico Granata ]); 851a102087f54079c25c8827afac6153a44ca535daEnrico Granata 869b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata # Now let's delete the 'Speed' custom format. 879b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd("type format delete Speed") 889b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 899b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata # The type format list should not show 'Speed' at this point. 909b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("type format list", matching=False, 919b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['Speed']) 929b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 939b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata # Delete type format for 'Speed', we should expect an error message. 949b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("type format delete Speed", error=True, 959b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['no custom format for Speed']) 969b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 97242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"arr = ${var%s}\" -x \"char \\[[0-9]+\\]\" -v") 981a102087f54079c25c8827afac6153a44ca535daEnrico Granata 991a102087f54079c25c8827afac6153a44ca535daEnrico Granata self.expect("frame variable strarr", 10086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata substrs = ['arr = "Hello world!"']) 1011a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1021a102087f54079c25c8827afac6153a44ca535daEnrico Granata self.runCmd("type summary clear") 1031a102087f54079c25c8827afac6153a44ca535daEnrico Granata 104242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"ptr = ${var%s}\" \"char *\" -v") 1051a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1061a102087f54079c25c8827afac6153a44ca535daEnrico Granata self.expect("frame variable strptr", 1071a102087f54079c25c8827afac6153a44ca535daEnrico Granata substrs = ['ptr = "Hello world!"']) 1081a102087f54079c25c8827afac6153a44ca535daEnrico Granata 109242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"arr = ${var%s}\" -x \"char \\[[0-9]+\\]\" -v") 1101a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1111a102087f54079c25c8827afac6153a44ca535daEnrico Granata self.expect("frame variable strarr", 11286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata substrs = ['arr = "Hello world!']) 113915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 114915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata # check that rdar://problem/10011145 (Standard summary format for char[] doesn't work as the result of "expr".) is solved 115915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata self.expect("p strarr", 116915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata substrs = ['arr = "Hello world!']) 117915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 1181a102087f54079c25c8827afac6153a44ca535daEnrico Granata self.expect("frame variable strptr", 1191a102087f54079c25c8827afac6153a44ca535daEnrico Granata substrs = ['ptr = "Hello world!"']) 1201a102087f54079c25c8827afac6153a44ca535daEnrico Granata 121915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata self.expect("p strptr", 122915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata substrs = ['ptr = "Hello world!"']) 123915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 124915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata self.expect("p (char*)\"1234567890123456789012345678901234567890123456789012345678901234ABC\"", 125915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata substrs = ['(char *) $', ' = ptr = ', ' "1234567890123456789012345678901234567890123456789012345678901234ABC"']) 126915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 1279b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd("type summary add -c Point") 1289b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1299b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable iAmSomewhere", 130cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata substrs = ['x = 4', 131cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 'y = 6']) 1329b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1339b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("type summary list", 1349b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['Point', 1359b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 'one-line']) 1369b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 137242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"y=${var.y%x}\" Point") 1389b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1399b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable iAmSomewhere", 1409b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['y=0x']) 141ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 142242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"y=${var.y},x=${var.x}\" Point") 143ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 144ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata self.expect("frame variable iAmSomewhere", 145ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata substrs = ['y=6', 146ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 'x=4']) 1479b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 148242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"hello\" Point -e") 1499b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1509b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("type summary list", 1519b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['Point', 1529b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 'show children']) 1539b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1549b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable iAmSomewhere", 1559b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['hello', 1569b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 'x = 4', 1579b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata '}']) 1589b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 159242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"Sign: ${var[31]%B} Exponent: ${var[23-30]%x} Mantissa: ${var[0-22]%u}\" ShowMyGuts") 1609b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1619b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable cool_pointer->floating", 1629b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['Sign: true', 1639b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 'Exponent: 0x', 1649b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata '80']) 1659b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 166242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"a test\" i_am_cool") 1679b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1689b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable cool_pointer", 1699b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['a test']) 1709b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 171242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"a test\" i_am_cool --skip-pointers") 1729b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1739b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable cool_pointer", 1749b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['a test'], 1759b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata matching = False) 1769b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 177242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"${var[1-3]}\" \"int [5]\"") 1789b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1799b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable int_array", 1809b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['2', 1819b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata '3', 1829b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata '4']) 1839b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1849b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.runCmd("type summary clear") 1859b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 186242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"${var[0-2].integer}\" \"i_am_cool *\"") 187242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"${var[2-4].integer}\" \"i_am_cool [5]\"") 1889b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1899b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable cool_array", 1909b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['1,1,6']) 1919b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 1929b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata self.expect("frame variable cool_pointer", 1939b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata substrs = ['3,0,0']) 1949b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 195e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata # test special symbols for formatting variables into summaries 196242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"cool object @ ${var%L}\" i_am_cool") 197e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata self.runCmd("type summary delete \"i_am_cool [5]\"") 1989b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 199e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata # this test might fail if the compiler tries to store 200e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata # these values into registers.. hopefully this is not 201e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata # going to be the case 202e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata self.expect("frame variable cool_array", 203e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata substrs = ['[0] = cool object @ 0x', 204e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata '[1] = cool object @ 0x', 205e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata '[2] = cool object @ 0x', 206e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata '[3] = cool object @ 0x', 207e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata '[4] = cool object @ 0x']) 2086f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 2096f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata # test getting similar output by exploiting ${var} = 'type @ location' for aggregates 210242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"${var}\" i_am_cool") 2116f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 2126f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata # this test might fail if the compiler tries to store 2136f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata # these values into registers.. hopefully this is not 2146f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata # going to be the case 2156f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata self.expect("frame variable cool_array", 2166f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata substrs = ['[0] = i_am_cool @ 0x', 2176f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata '[1] = i_am_cool @ 0x', 2186f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata '[2] = i_am_cool @ 0x', 2196f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata '[3] = i_am_cool @ 0x', 2206f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata '[4] = i_am_cool @ 0x']) 2216f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 222e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2236f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata # test getting same output by exploiting %T and %L together for aggregates 224242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"${var%T} @ ${var%L}\" i_am_cool") 2256f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 2266f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata # this test might fail if the compiler tries to store 2276f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata # these values into registers.. hopefully this is not 2286f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata # going to be the case 2296f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata self.expect("frame variable cool_array", 2306f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata substrs = ['[0] = i_am_cool @ 0x', 2316f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata '[1] = i_am_cool @ 0x', 2326f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata '[2] = i_am_cool @ 0x', 2336f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata '[3] = i_am_cool @ 0x', 2346f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata '[4] = i_am_cool @ 0x']) 2356f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 236242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"goofy\" i_am_cool") 237242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"${var.second_cool%S}\" i_am_cooler") 238e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 239e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata self.expect("frame variable the_coolest_guy", 240e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata substrs = ['(i_am_cooler) the_coolest_guy = goofy']) 2419b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata 242d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata # check that unwanted type specifiers are removed 243d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata self.runCmd("type summary delete i_am_cool") 244242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"goofy\" \"class i_am_cool\"") 245d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata self.expect("frame variable the_coolest_guy", 246d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata substrs = ['(i_am_cooler) the_coolest_guy = goofy']) 247d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata 248d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata self.runCmd("type summary delete i_am_cool") 249242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"goofy\" \"enum i_am_cool\"") 250d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata self.expect("frame variable the_coolest_guy", 251d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata substrs = ['(i_am_cooler) the_coolest_guy = goofy']) 252d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata 253d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata self.runCmd("type summary delete i_am_cool") 254242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"goofy\" \"struct i_am_cool\"") 255d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata self.expect("frame variable the_coolest_guy", 256d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata substrs = ['(i_am_cooler) the_coolest_guy = goofy']) 257d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata 2582f2c6fb9e61dadd9296948cb358680172b30232eEnrico Granata # many spaces, but we still do the right thing 259d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata self.runCmd("type summary delete i_am_cool") 260242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"goofy\" \"union i_am_cool\"") 261d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata self.expect("frame variable the_coolest_guy", 262d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata substrs = ['(i_am_cooler) the_coolest_guy = goofy']) 263d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata 264d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata # but that not *every* specifier is removed 265d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata self.runCmd("type summary delete i_am_cool") 266242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata self.runCmd("type summary add --summary-string \"goofy\" \"wrong i_am_cool\"") 267d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata self.expect("frame variable the_coolest_guy", matching=False, 268d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata substrs = ['(i_am_cooler) the_coolest_guy = goofy']) 269d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata 2703069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata # check that formats are not sticking since that is the behavior we want 2713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata self.expect("frame variable iAmInt --format hex", substrs = ['(int) iAmInt = 0x00000001']) 2723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata self.expect("frame variable iAmInt", matching=False, substrs = ['(int) iAmInt = 0x00000001']) 2733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata self.expect("frame variable iAmInt", substrs = ['(int) iAmInt = 1']) 274d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata 2759b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granataif __name__ == '__main__': 2769b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata import atexit 2779b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata lldb.SBDebugger.Initialize() 2789b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata atexit.register(lambda: lldb.SBDebugger.Terminate()) 2799b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata unittest2.main() 280