199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest lldb data formatter subsystem. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport lldb 899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprechtclass CppDataFormatterTestCase(TestBase): 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht def setUp(self): 1699451b44SJordan Rupprecht # Call super's setUp(). 1799451b44SJordan Rupprecht TestBase.setUp(self) 1899451b44SJordan Rupprecht # Find the line number to break at. 1999451b44SJordan Rupprecht self.line = line_number('main.cpp', '// Set break point at this line.') 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht def test_with_run_command(self): 2299451b44SJordan Rupprecht """Test that that file and class static variables display correctly.""" 2399451b44SJordan Rupprecht self.build() 2499451b44SJordan Rupprecht self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 2799451b44SJordan Rupprecht self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True) 2899451b44SJordan Rupprecht 2999451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 3299451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 3399451b44SJordan Rupprecht substrs=['stopped', 3499451b44SJordan Rupprecht 'stop reason = breakpoint']) 3599451b44SJordan Rupprecht 3699451b44SJordan Rupprecht self.expect("frame variable", 3799451b44SJordan Rupprecht substrs=['(Speed) SPILookHex = 5.55' # Speed by default is 5.55. 3899451b44SJordan Rupprecht ]) 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht # This is the function to remove the custom formats in order to have a 4199451b44SJordan Rupprecht # clean slate for the next test case. 4299451b44SJordan Rupprecht def cleanup(): 4399451b44SJordan Rupprecht self.runCmd('type format clear', check=False) 4499451b44SJordan Rupprecht self.runCmd('type summary clear', check=False) 4599451b44SJordan Rupprecht 4699451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 4799451b44SJordan Rupprecht self.addTearDownHook(cleanup) 4899451b44SJordan Rupprecht 4999451b44SJordan Rupprecht self.runCmd("type format add -C yes -f x Speed BitField") 5099451b44SJordan Rupprecht self.runCmd("type format add -C no -f c RealNumber") 5199451b44SJordan Rupprecht self.runCmd("type format add -C no -f x Type2") 5299451b44SJordan Rupprecht self.runCmd("type format add -C yes -f c Type1") 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht # The type format list should show our custom formats. 5599451b44SJordan Rupprecht self.expect( 5699451b44SJordan Rupprecht "type format list", 5799451b44SJordan Rupprecht substrs=['Speed', 'BitField', 'RealNumber', 'Type2', 'Type1']) 5899451b44SJordan Rupprecht 5999451b44SJordan Rupprecht self.expect("frame variable", 6099451b44SJordan Rupprecht patterns=['\(Speed\) SPILookHex = 0x[0-9a-f]+' # Speed should look hex-ish now. 6199451b44SJordan Rupprecht ]) 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht # gcc4.2 on Mac OS X skips typedef chains in the DWARF output 6499451b44SJordan Rupprecht if self.getCompiler() in ['clang', 'llvm-gcc']: 6599451b44SJordan Rupprecht self.expect("frame variable", 6699451b44SJordan Rupprecht patterns=['\(SignalMask\) SMILookHex = 0x[0-9a-f]+' # SignalMask should look hex-ish now. 6799451b44SJordan Rupprecht ]) 6899451b44SJordan Rupprecht self.expect("frame variable", matching=False, 6999451b44SJordan Rupprecht patterns=['\(Type4\) T4ILookChar = 0x[0-9a-f]+' # Type4 should NOT look hex-ish now. 7099451b44SJordan Rupprecht ]) 7199451b44SJordan Rupprecht 7299451b44SJordan Rupprecht # Now let's delete the 'Speed' custom format. 7399451b44SJordan Rupprecht self.runCmd("type format delete Speed") 7499451b44SJordan Rupprecht 7599451b44SJordan Rupprecht # The type format list should not show 'Speed' at this point. 7699451b44SJordan Rupprecht self.expect("type format list", matching=False, 7799451b44SJordan Rupprecht substrs=['Speed']) 7899451b44SJordan Rupprecht 7999451b44SJordan Rupprecht # Delete type format for 'Speed', we should expect an error message. 8099451b44SJordan Rupprecht self.expect("type format delete Speed", error=True, 8199451b44SJordan Rupprecht substrs=['no custom formatter for Speed']) 8299451b44SJordan Rupprecht 8399451b44SJordan Rupprecht self.runCmd( 8499451b44SJordan Rupprecht "type summary add --summary-string \"arr = ${var%s}\" -x \"char\\[[0-9]+\\]\" -v") 8599451b44SJordan Rupprecht 8699451b44SJordan Rupprecht self.expect("frame variable strarr", 8799451b44SJordan Rupprecht substrs=['arr = "Hello world!"']) 8899451b44SJordan Rupprecht 8999451b44SJordan Rupprecht self.runCmd("type summary clear") 9099451b44SJordan Rupprecht 9199451b44SJordan Rupprecht self.runCmd( 9299451b44SJordan Rupprecht "type summary add --summary-string \"ptr = ${var%s}\" \"char *\" -v") 9399451b44SJordan Rupprecht 9499451b44SJordan Rupprecht self.expect("frame variable strptr", 9599451b44SJordan Rupprecht substrs=['ptr = "Hello world!"']) 9699451b44SJordan Rupprecht 9799451b44SJordan Rupprecht self.runCmd( 9899451b44SJordan Rupprecht "type summary add --summary-string \"arr = ${var%s}\" -x \"char\\[[0-9]+\\]\" -v") 9999451b44SJordan Rupprecht 10099451b44SJordan Rupprecht self.expect("frame variable strarr", 10199451b44SJordan Rupprecht substrs=['arr = "Hello world!']) 10299451b44SJordan Rupprecht 10399451b44SJordan Rupprecht # check that rdar://problem/10011145 (Standard summary format for 10499451b44SJordan Rupprecht # char[] doesn't work as the result of "expr".) is solved 10599451b44SJordan Rupprecht self.expect("p strarr", 10699451b44SJordan Rupprecht substrs=['arr = "Hello world!']) 10799451b44SJordan Rupprecht 10899451b44SJordan Rupprecht self.expect("frame variable strptr", 10999451b44SJordan Rupprecht substrs=['ptr = "Hello world!"']) 11099451b44SJordan Rupprecht 11199451b44SJordan Rupprecht self.expect("p strptr", 11299451b44SJordan Rupprecht substrs=['ptr = "Hello world!"']) 11399451b44SJordan Rupprecht 11499451b44SJordan Rupprecht self.expect( 11599451b44SJordan Rupprecht "p (char*)\"1234567890123456789012345678901234567890123456789012345678901234ABC\"", 11699451b44SJordan Rupprecht substrs=[ 11799451b44SJordan Rupprecht '(char *) $', 11899451b44SJordan Rupprecht ' = ptr = ', 11999451b44SJordan Rupprecht ' "1234567890123456789012345678901234567890123456789012345678901234ABC"']) 12099451b44SJordan Rupprecht 121*ac7c8808SRaphael Isemann self.runCmd("type summary add -c TestPoint") 12299451b44SJordan Rupprecht 12399451b44SJordan Rupprecht self.expect("frame variable iAmSomewhere", 12499451b44SJordan Rupprecht substrs=['x = 4', 12599451b44SJordan Rupprecht 'y = 6']) 12699451b44SJordan Rupprecht 12799451b44SJordan Rupprecht self.expect("type summary list", 128*ac7c8808SRaphael Isemann substrs=['TestPoint', 12999451b44SJordan Rupprecht 'one-line']) 13099451b44SJordan Rupprecht 131*ac7c8808SRaphael Isemann self.runCmd("type summary add --summary-string \"y=${var.y%x}\" TestPoint") 13299451b44SJordan Rupprecht 13399451b44SJordan Rupprecht self.expect("frame variable iAmSomewhere", 13499451b44SJordan Rupprecht substrs=['y=0x']) 13599451b44SJordan Rupprecht 13699451b44SJordan Rupprecht self.runCmd( 137*ac7c8808SRaphael Isemann "type summary add --summary-string \"y=${var.y},x=${var.x}\" TestPoint") 13899451b44SJordan Rupprecht 13999451b44SJordan Rupprecht self.expect("frame variable iAmSomewhere", 14099451b44SJordan Rupprecht substrs=['y=6', 14199451b44SJordan Rupprecht 'x=4']) 14299451b44SJordan Rupprecht 143*ac7c8808SRaphael Isemann self.runCmd("type summary add --summary-string \"hello\" TestPoint -e") 14499451b44SJordan Rupprecht 14599451b44SJordan Rupprecht self.expect("type summary list", 146*ac7c8808SRaphael Isemann substrs=['TestPoint', 14799451b44SJordan Rupprecht 'show children']) 14899451b44SJordan Rupprecht 14999451b44SJordan Rupprecht self.expect("frame variable iAmSomewhere", 15099451b44SJordan Rupprecht substrs=['hello', 15199451b44SJordan Rupprecht 'x = 4', 15299451b44SJordan Rupprecht '}']) 15399451b44SJordan Rupprecht 15499451b44SJordan Rupprecht self.runCmd( 15599451b44SJordan Rupprecht "type summary add --summary-string \"Sign: ${var[31]%B} Exponent: ${var[23-30]%x} Mantissa: ${var[0-22]%u}\" ShowMyGuts") 15699451b44SJordan Rupprecht 15799451b44SJordan Rupprecht self.expect("frame variable cool_pointer->floating", 15899451b44SJordan Rupprecht substrs=['Sign: true', 15999451b44SJordan Rupprecht 'Exponent: 0x', 16099451b44SJordan Rupprecht '80']) 16199451b44SJordan Rupprecht 16299451b44SJordan Rupprecht self.runCmd("type summary add --summary-string \"a test\" i_am_cool") 16399451b44SJordan Rupprecht 16499451b44SJordan Rupprecht self.expect("frame variable cool_pointer", 16599451b44SJordan Rupprecht substrs=['a test']) 16699451b44SJordan Rupprecht 16799451b44SJordan Rupprecht self.runCmd( 16899451b44SJordan Rupprecht "type summary add --summary-string \"a test\" i_am_cool --skip-pointers") 16999451b44SJordan Rupprecht 17099451b44SJordan Rupprecht self.expect("frame variable cool_pointer", 17199451b44SJordan Rupprecht substrs=['a test'], 17299451b44SJordan Rupprecht matching=False) 17399451b44SJordan Rupprecht 17499451b44SJordan Rupprecht self.runCmd( 17599451b44SJordan Rupprecht "type summary add --summary-string \"${var[1-3]}\" \"int[5]\"") 17699451b44SJordan Rupprecht 17799451b44SJordan Rupprecht self.expect("frame variable int_array", 17899451b44SJordan Rupprecht substrs=['2', 17999451b44SJordan Rupprecht '3', 18099451b44SJordan Rupprecht '4']) 18199451b44SJordan Rupprecht 18299451b44SJordan Rupprecht self.runCmd("type summary clear") 18399451b44SJordan Rupprecht 18499451b44SJordan Rupprecht self.runCmd( 18599451b44SJordan Rupprecht "type summary add --summary-string \"${var[0-2].integer}\" \"i_am_cool *\"") 18699451b44SJordan Rupprecht self.runCmd( 18799451b44SJordan Rupprecht "type summary add --summary-string \"${var[2-4].integer}\" \"i_am_cool[5]\"") 18899451b44SJordan Rupprecht 18999451b44SJordan Rupprecht self.expect("frame variable cool_array", 19099451b44SJordan Rupprecht substrs=['1,1,6']) 19199451b44SJordan Rupprecht 19299451b44SJordan Rupprecht self.expect("frame variable cool_pointer", 19399451b44SJordan Rupprecht substrs=['3,0,0']) 19499451b44SJordan Rupprecht 19599451b44SJordan Rupprecht # test special symbols for formatting variables into summaries 19699451b44SJordan Rupprecht self.runCmd( 19799451b44SJordan Rupprecht "type summary add --summary-string \"cool object @ ${var%L}\" i_am_cool") 19899451b44SJordan Rupprecht self.runCmd("type summary delete \"i_am_cool[5]\"") 19999451b44SJordan Rupprecht 20099451b44SJordan Rupprecht # this test might fail if the compiler tries to store 20199451b44SJordan Rupprecht # these values into registers.. hopefully this is not 20299451b44SJordan Rupprecht # going to be the case 20399451b44SJordan Rupprecht self.expect("frame variable cool_array", 20499451b44SJordan Rupprecht substrs=['[0] = cool object @ 0x', 20599451b44SJordan Rupprecht '[1] = cool object @ 0x', 20699451b44SJordan Rupprecht '[2] = cool object @ 0x', 20799451b44SJordan Rupprecht '[3] = cool object @ 0x', 20899451b44SJordan Rupprecht '[4] = cool object @ 0x']) 20999451b44SJordan Rupprecht 21099451b44SJordan Rupprecht # test getting similar output by exploiting ${var} = 'type @ location' 21199451b44SJordan Rupprecht # for aggregates 21299451b44SJordan Rupprecht self.runCmd("type summary add --summary-string \"${var}\" i_am_cool") 21399451b44SJordan Rupprecht 21499451b44SJordan Rupprecht # this test might fail if the compiler tries to store 21599451b44SJordan Rupprecht # these values into registers.. hopefully this is not 21699451b44SJordan Rupprecht # going to be the case 21799451b44SJordan Rupprecht self.expect("frame variable cool_array", 21899451b44SJordan Rupprecht substrs=['[0] = i_am_cool @ 0x', 21999451b44SJordan Rupprecht '[1] = i_am_cool @ 0x', 22099451b44SJordan Rupprecht '[2] = i_am_cool @ 0x', 22199451b44SJordan Rupprecht '[3] = i_am_cool @ 0x', 22299451b44SJordan Rupprecht '[4] = i_am_cool @ 0x']) 22399451b44SJordan Rupprecht 22499451b44SJordan Rupprecht # test getting same output by exploiting %T and %L together for 22599451b44SJordan Rupprecht # aggregates 22699451b44SJordan Rupprecht self.runCmd( 22799451b44SJordan Rupprecht "type summary add --summary-string \"${var%T} @ ${var%L}\" i_am_cool") 22899451b44SJordan Rupprecht 22999451b44SJordan Rupprecht # this test might fail if the compiler tries to store 23099451b44SJordan Rupprecht # these values into registers.. hopefully this is not 23199451b44SJordan Rupprecht # going to be the case 23299451b44SJordan Rupprecht self.expect("frame variable cool_array", 23399451b44SJordan Rupprecht substrs=['[0] = i_am_cool @ 0x', 23499451b44SJordan Rupprecht '[1] = i_am_cool @ 0x', 23599451b44SJordan Rupprecht '[2] = i_am_cool @ 0x', 23699451b44SJordan Rupprecht '[3] = i_am_cool @ 0x', 23799451b44SJordan Rupprecht '[4] = i_am_cool @ 0x']) 23899451b44SJordan Rupprecht 23999451b44SJordan Rupprecht self.runCmd("type summary add --summary-string \"goofy\" i_am_cool") 24099451b44SJordan Rupprecht self.runCmd( 24199451b44SJordan Rupprecht "type summary add --summary-string \"${var.second_cool%S}\" i_am_cooler") 24299451b44SJordan Rupprecht 24399451b44SJordan Rupprecht self.expect("frame variable the_coolest_guy", 24499451b44SJordan Rupprecht substrs=['(i_am_cooler) the_coolest_guy = goofy']) 24599451b44SJordan Rupprecht 24699451b44SJordan Rupprecht # check that unwanted type specifiers are removed 24799451b44SJordan Rupprecht self.runCmd("type summary delete i_am_cool") 24899451b44SJordan Rupprecht self.runCmd( 24999451b44SJordan Rupprecht "type summary add --summary-string \"goofy\" \"class i_am_cool\"") 25099451b44SJordan Rupprecht self.expect("frame variable the_coolest_guy", 25199451b44SJordan Rupprecht substrs=['(i_am_cooler) the_coolest_guy = goofy']) 25299451b44SJordan Rupprecht 25399451b44SJordan Rupprecht self.runCmd("type summary delete i_am_cool") 25499451b44SJordan Rupprecht self.runCmd( 25599451b44SJordan Rupprecht "type summary add --summary-string \"goofy\" \"enum i_am_cool\"") 25699451b44SJordan Rupprecht self.expect("frame variable the_coolest_guy", 25799451b44SJordan Rupprecht substrs=['(i_am_cooler) the_coolest_guy = goofy']) 25899451b44SJordan Rupprecht 25999451b44SJordan Rupprecht self.runCmd("type summary delete i_am_cool") 26099451b44SJordan Rupprecht self.runCmd( 26199451b44SJordan Rupprecht "type summary add --summary-string \"goofy\" \"struct i_am_cool\"") 26299451b44SJordan Rupprecht self.expect("frame variable the_coolest_guy", 26399451b44SJordan Rupprecht substrs=['(i_am_cooler) the_coolest_guy = goofy']) 26499451b44SJordan Rupprecht 26599451b44SJordan Rupprecht # many spaces, but we still do the right thing 26699451b44SJordan Rupprecht self.runCmd("type summary delete i_am_cool") 26799451b44SJordan Rupprecht self.runCmd( 26899451b44SJordan Rupprecht "type summary add --summary-string \"goofy\" \"union i_am_cool\"") 26999451b44SJordan Rupprecht self.expect("frame variable the_coolest_guy", 27099451b44SJordan Rupprecht substrs=['(i_am_cooler) the_coolest_guy = goofy']) 27199451b44SJordan Rupprecht 27299451b44SJordan Rupprecht # but that not *every* specifier is removed 27399451b44SJordan Rupprecht self.runCmd("type summary delete i_am_cool") 27499451b44SJordan Rupprecht self.runCmd( 27599451b44SJordan Rupprecht "type summary add --summary-string \"goofy\" \"wrong i_am_cool\"") 27699451b44SJordan Rupprecht self.expect("frame variable the_coolest_guy", matching=False, 27799451b44SJordan Rupprecht substrs=['(i_am_cooler) the_coolest_guy = goofy']) 27899451b44SJordan Rupprecht 27999451b44SJordan Rupprecht # check that formats are not sticking since that is the behavior we 28099451b44SJordan Rupprecht # want 28199451b44SJordan Rupprecht self.expect("frame variable iAmInt --format hex", 28299451b44SJordan Rupprecht substrs=['(int) iAmInt = 0x00000001']) 28399451b44SJordan Rupprecht self.expect( 28499451b44SJordan Rupprecht "frame variable iAmInt", 28599451b44SJordan Rupprecht matching=False, 28699451b44SJordan Rupprecht substrs=['(int) iAmInt = 0x00000001']) 28799451b44SJordan Rupprecht self.expect("frame variable iAmInt", substrs=['(int) iAmInt = 1']) 288