199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest lldb data formatter subsystem. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport lldb 899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 999451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass AdvDataFormatterTestCase(TestBase): 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprecht def setUp(self): 1599451b44SJordan Rupprecht # Call super's setUp(). 1699451b44SJordan Rupprecht TestBase.setUp(self) 1799451b44SJordan Rupprecht # Find the line number to break at. 1899451b44SJordan Rupprecht self.line = line_number('main.cpp', '// Set break point at this line.') 1999451b44SJordan Rupprecht 2099451b44SJordan Rupprecht def test_with_run_command(self): 2199451b44SJordan Rupprecht """Test that that file and class static variables display correctly.""" 2299451b44SJordan Rupprecht self.build() 2399451b44SJordan Rupprecht self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 2699451b44SJordan Rupprecht self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True) 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 2999451b44SJordan Rupprecht 3099451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 3199451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 3299451b44SJordan Rupprecht substrs=['stopped', 3399451b44SJordan Rupprecht 'stop reason = breakpoint']) 3499451b44SJordan Rupprecht 3599451b44SJordan Rupprecht # This is the function to remove the custom formats in order to have a 3699451b44SJordan Rupprecht # clean slate for the next test case. 3799451b44SJordan Rupprecht def cleanup(): 3899451b44SJordan Rupprecht self.runCmd('type format clear', check=False) 3999451b44SJordan Rupprecht self.runCmd('type summary clear', check=False) 4099451b44SJordan Rupprecht self.runCmd( 4199451b44SJordan Rupprecht "settings set target.max-children-count 256", 4299451b44SJordan Rupprecht check=False) 4399451b44SJordan Rupprecht 4499451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 4599451b44SJordan Rupprecht self.addTearDownHook(cleanup) 4699451b44SJordan Rupprecht 4799451b44SJordan Rupprecht self.runCmd("type summary add --summary-string \"pippo\" \"i_am_cool\"") 4899451b44SJordan Rupprecht 4999451b44SJordan Rupprecht self.runCmd( 5099451b44SJordan Rupprecht "type summary add --summary-string \"pluto\" -x \"i_am_cool[a-z]*\"") 5199451b44SJordan Rupprecht 5299451b44SJordan Rupprecht self.expect("frame variable cool_boy", 5399451b44SJordan Rupprecht substrs=['pippo']) 5499451b44SJordan Rupprecht 5599451b44SJordan Rupprecht self.expect("frame variable cooler_boy", 5699451b44SJordan Rupprecht substrs=['pluto']) 5799451b44SJordan Rupprecht 5899451b44SJordan Rupprecht self.runCmd("type summary delete i_am_cool") 5999451b44SJordan Rupprecht 6099451b44SJordan Rupprecht self.expect("frame variable cool_boy", 6199451b44SJordan Rupprecht substrs=['pluto']) 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht self.runCmd("type summary clear") 6499451b44SJordan Rupprecht 6599451b44SJordan Rupprecht self.runCmd( 66*3abd063fSPavel Labath "type summary add --summary-string \"${var[]}\" -x \"^int\\[[0-9]\\]") 6799451b44SJordan Rupprecht 6899451b44SJordan Rupprecht self.expect("frame variable int_array", 6999451b44SJordan Rupprecht substrs=['1,2,3,4,5']) 70*3abd063fSPavel Labath self.expect("frame variable const_int_array", 71*3abd063fSPavel Labath substrs=['11,12,13,14,15']) 7299451b44SJordan Rupprecht 7399451b44SJordan Rupprecht # this will fail if we don't do [] as regex correctly 7499451b44SJordan Rupprecht self.runCmd( 7599451b44SJordan Rupprecht 'type summary add --summary-string "${var[].integer}" "i_am_cool[]') 7699451b44SJordan Rupprecht 7799451b44SJordan Rupprecht self.expect("frame variable cool_array", 7899451b44SJordan Rupprecht substrs=['1,1,1,1,6']) 7999451b44SJordan Rupprecht 8099451b44SJordan Rupprecht self.runCmd("type summary clear") 8199451b44SJordan Rupprecht 8299451b44SJordan Rupprecht self.runCmd( 8399451b44SJordan Rupprecht "type summary add --summary-string \"${var[1-0]%x}\" \"int\"") 8499451b44SJordan Rupprecht 8599451b44SJordan Rupprecht self.expect("frame variable iAmInt", 8699451b44SJordan Rupprecht substrs=['01']) 8799451b44SJordan Rupprecht 8899451b44SJordan Rupprecht self.runCmd( 8999451b44SJordan Rupprecht "type summary add --summary-string \"${var[0-1]%x}\" \"int\"") 9099451b44SJordan Rupprecht 9199451b44SJordan Rupprecht self.expect("frame variable iAmInt", 9299451b44SJordan Rupprecht substrs=['01']) 9399451b44SJordan Rupprecht 9499451b44SJordan Rupprecht self.runCmd("type summary clear") 9599451b44SJordan Rupprecht 9699451b44SJordan Rupprecht self.runCmd("type summary add --summary-string \"${var[0-1]%x}\" int") 9799451b44SJordan Rupprecht self.runCmd( 9899451b44SJordan Rupprecht "type summary add --summary-string \"${var[0-31]%x}\" float") 9999451b44SJordan Rupprecht 10099451b44SJordan Rupprecht self.expect("frame variable *pointer", 10199451b44SJordan Rupprecht substrs=['0x', 10299451b44SJordan Rupprecht '2']) 10399451b44SJordan Rupprecht 10499451b44SJordan Rupprecht # check fix for <rdar://problem/11338654> LLDB crashes when using a 10599451b44SJordan Rupprecht # "type summary" that uses bitfields with no format 10699451b44SJordan Rupprecht self.runCmd("type summary add --summary-string \"${var[0-1]}\" int") 10799451b44SJordan Rupprecht self.expect("frame variable iAmInt", 10899451b44SJordan Rupprecht substrs=['9 1']) 10999451b44SJordan Rupprecht 11099451b44SJordan Rupprecht self.expect("frame variable cool_array[3].floating", 11199451b44SJordan Rupprecht substrs=['0x']) 11299451b44SJordan Rupprecht 11399451b44SJordan Rupprecht self.runCmd( 11499451b44SJordan Rupprecht "type summary add --summary-string \"low bits are ${*var[0-1]} tgt is ${*var}\" \"int *\"") 11599451b44SJordan Rupprecht 11699451b44SJordan Rupprecht self.expect("frame variable pointer", 11799451b44SJordan Rupprecht substrs=['low bits are', 11899451b44SJordan Rupprecht 'tgt is 6']) 11999451b44SJordan Rupprecht 12099451b44SJordan Rupprecht self.expect( 12199451b44SJordan Rupprecht "frame variable int_array --summary-string \"${*var[0-1]}\"", 12299451b44SJordan Rupprecht substrs=['3']) 12399451b44SJordan Rupprecht 12499451b44SJordan Rupprecht self.runCmd("type summary clear") 12599451b44SJordan Rupprecht 12699451b44SJordan Rupprecht self.runCmd( 12799451b44SJordan Rupprecht 'type summary add --summary-string \"${var[0-1]}\" -x \"int\[[0-9]\]\"') 12899451b44SJordan Rupprecht 12999451b44SJordan Rupprecht self.expect("frame variable int_array", 13099451b44SJordan Rupprecht substrs=['1,2']) 13199451b44SJordan Rupprecht 13299451b44SJordan Rupprecht self.runCmd( 13399451b44SJordan Rupprecht 'type summary add --summary-string \"${var[0-1]}\" "int[]"') 13499451b44SJordan Rupprecht 13599451b44SJordan Rupprecht self.expect("frame variable int_array", 13699451b44SJordan Rupprecht substrs=['1,2']) 13799451b44SJordan Rupprecht 13899451b44SJordan Rupprecht # Test the patterns are matched in reverse-chronological order. 13999451b44SJordan Rupprecht self.runCmd( 14099451b44SJordan Rupprecht 'type summary add --summary-string \"${var[2-3]}\" "int[]"') 14199451b44SJordan Rupprecht 14299451b44SJordan Rupprecht self.expect("frame variable int_array", 14399451b44SJordan Rupprecht substrs=['3,4']) 14499451b44SJordan Rupprecht 14599451b44SJordan Rupprecht self.runCmd("type summary clear") 14699451b44SJordan Rupprecht 14799451b44SJordan Rupprecht self.runCmd("type summary add -c -x \"i_am_cool\[[0-9]\]\"") 14899451b44SJordan Rupprecht self.runCmd("type summary add -c i_am_cool") 14999451b44SJordan Rupprecht 15099451b44SJordan Rupprecht self.expect( 15199451b44SJordan Rupprecht "frame variable cool_array", 15299451b44SJordan Rupprecht substrs=[ 15399451b44SJordan Rupprecht '[0]', 15499451b44SJordan Rupprecht 'integer', 15599451b44SJordan Rupprecht 'floating', 15699451b44SJordan Rupprecht 'character', 15799451b44SJordan Rupprecht '[1]', 15899451b44SJordan Rupprecht 'integer', 15999451b44SJordan Rupprecht 'floating', 16099451b44SJordan Rupprecht 'character', 16199451b44SJordan Rupprecht '[2]', 16299451b44SJordan Rupprecht 'integer', 16399451b44SJordan Rupprecht 'floating', 16499451b44SJordan Rupprecht 'character', 16599451b44SJordan Rupprecht '[3]', 16699451b44SJordan Rupprecht 'integer', 16799451b44SJordan Rupprecht 'floating', 16899451b44SJordan Rupprecht 'character', 16999451b44SJordan Rupprecht '[4]', 17099451b44SJordan Rupprecht 'integer', 17199451b44SJordan Rupprecht 'floating', 17299451b44SJordan Rupprecht 'character', 17399451b44SJordan Rupprecht ]) 17499451b44SJordan Rupprecht 17599451b44SJordan Rupprecht self.runCmd( 17699451b44SJordan Rupprecht "type summary add --summary-string \"int = ${*var.int_pointer}, float = ${*var.float_pointer}\" IWrapPointers") 17799451b44SJordan Rupprecht 17899451b44SJordan Rupprecht self.expect("frame variable wrapper", 17999451b44SJordan Rupprecht substrs=['int = 4', 18099451b44SJordan Rupprecht 'float = 1.1']) 18199451b44SJordan Rupprecht 18299451b44SJordan Rupprecht self.runCmd( 18399451b44SJordan Rupprecht "type summary add --summary-string \"low bits = ${*var.int_pointer[2]}\" IWrapPointers -p") 18499451b44SJordan Rupprecht 18599451b44SJordan Rupprecht self.expect("frame variable wrapper", 18699451b44SJordan Rupprecht substrs=['low bits = 1']) 18799451b44SJordan Rupprecht 18899451b44SJordan Rupprecht self.expect("frame variable *wrap_pointer", 18999451b44SJordan Rupprecht substrs=['low bits = 1']) 19099451b44SJordan Rupprecht 19199451b44SJordan Rupprecht self.runCmd("type summary clear") 19299451b44SJordan Rupprecht 19399451b44SJordan Rupprecht self.expect( 19499451b44SJordan Rupprecht "frame variable int_array --summary-string \"${var[0][0-2]%hex}\"", 19599451b44SJordan Rupprecht substrs=[ 19699451b44SJordan Rupprecht '0x', 19799451b44SJordan Rupprecht '7']) 19899451b44SJordan Rupprecht 19999451b44SJordan Rupprecht self.runCmd("type summary clear") 20099451b44SJordan Rupprecht 20199451b44SJordan Rupprecht self.runCmd( 20299451b44SJordan Rupprecht "type summary add --summary-string \"${*var[].x[0-3]%hex} is a bitfield on a set of integers\" -x \"SimpleWithPointers\[[0-9]\]\"") 20399451b44SJordan Rupprecht 20499451b44SJordan Rupprecht self.expect( 20599451b44SJordan Rupprecht "frame variable couple --summary-string \"${*var.sp.x[0-2]} are low bits of integer ${*var.sp.x}. If I pretend it is an array I get ${var.sp.x[0-5]}\"", 20699451b44SJordan Rupprecht substrs=[ 20799451b44SJordan Rupprecht '1 are low bits of integer 9.', 20899451b44SJordan Rupprecht 'If I pretend it is an array I get [9,']) 20999451b44SJordan Rupprecht 21099451b44SJordan Rupprecht # if the summary has an error, we still display the value 21199451b44SJordan Rupprecht self.expect( 21299451b44SJordan Rupprecht "frame variable couple --summary-string \"${*var.sp.foo[0-2]\"", 21399451b44SJordan Rupprecht substrs=[ 21499451b44SJordan Rupprecht '(Couple) couple = {', 21599451b44SJordan Rupprecht 'x = 0x', 21699451b44SJordan Rupprecht 'y = 0x', 21799451b44SJordan Rupprecht 'z = 0x', 21899451b44SJordan Rupprecht 's = 0x']) 21999451b44SJordan Rupprecht 22099451b44SJordan Rupprecht self.runCmd( 22199451b44SJordan Rupprecht "type summary add --summary-string \"${*var.sp.x[0-2]} are low bits of integer ${*var.sp.x}. If I pretend it is an array I get ${var.sp.x[0-5]}\" Couple") 22299451b44SJordan Rupprecht 22399451b44SJordan Rupprecht self.expect("frame variable sparray", 22499451b44SJordan Rupprecht substrs=['[0x0000000f,0x0000000c,0x00000009]']) 22599451b44SJordan Rupprecht 22699451b44SJordan Rupprecht # check that we can format a variable in a summary even if a format is 22799451b44SJordan Rupprecht # defined for its datatype 22899451b44SJordan Rupprecht self.runCmd("type format add -f hex int") 22999451b44SJordan Rupprecht self.runCmd( 23099451b44SJordan Rupprecht "type summary add --summary-string \"x=${var.x%d}\" Simple") 23199451b44SJordan Rupprecht 23299451b44SJordan Rupprecht self.expect("frame variable a_simple_object", 23399451b44SJordan Rupprecht substrs=['x=3']) 23499451b44SJordan Rupprecht 23599451b44SJordan Rupprecht self.expect("frame variable a_simple_object", matching=False, 23699451b44SJordan Rupprecht substrs=['0x0']) 23799451b44SJordan Rupprecht 23899451b44SJordan Rupprecht # now check that the default is applied if we do not hand out a format 23999451b44SJordan Rupprecht self.runCmd("type summary add --summary-string \"x=${var.x}\" Simple") 24099451b44SJordan Rupprecht 24199451b44SJordan Rupprecht self.expect("frame variable a_simple_object", matching=False, 24299451b44SJordan Rupprecht substrs=['x=3']) 24399451b44SJordan Rupprecht 24499451b44SJordan Rupprecht self.expect("frame variable a_simple_object", matching=True, 24599451b44SJordan Rupprecht substrs=['x=0x00000003']) 24699451b44SJordan Rupprecht 24779ac5bbbSShafik Yaghmour self.expect_var_path("constInt", value='0x0000002a') 24879ac5bbbSShafik Yaghmour 24979ac5bbbSShafik Yaghmour self.expect_var_path("volatileInt", value='0x0000002b') 25079ac5bbbSShafik Yaghmour 25179ac5bbbSShafik Yaghmour self.expect_var_path("constVolatileInt", value='0x0000002c') 25279ac5bbbSShafik Yaghmour 25399451b44SJordan Rupprecht # check that we can correctly cap the number of children shown 25499451b44SJordan Rupprecht self.runCmd("settings set target.max-children-count 5") 25599451b44SJordan Rupprecht 25699451b44SJordan Rupprecht self.expect('frame variable a_long_guy', matching=True, 25799451b44SJordan Rupprecht substrs=['a_1', 25899451b44SJordan Rupprecht 'b_1', 25999451b44SJordan Rupprecht 'c_1', 26099451b44SJordan Rupprecht 'd_1', 26199451b44SJordan Rupprecht 'e_1', 26299451b44SJordan Rupprecht '...']) 26399451b44SJordan Rupprecht 26499451b44SJordan Rupprecht # check that no further stuff is printed (not ALL values are checked!) 26599451b44SJordan Rupprecht self.expect('frame variable a_long_guy', matching=False, 26699451b44SJordan Rupprecht substrs=['f_1', 26799451b44SJordan Rupprecht 'g_1', 26899451b44SJordan Rupprecht 'h_1', 26999451b44SJordan Rupprecht 'i_1', 27099451b44SJordan Rupprecht 'j_1', 27199451b44SJordan Rupprecht 'q_1', 27299451b44SJordan Rupprecht 'a_2', 27399451b44SJordan Rupprecht 'f_2', 27499451b44SJordan Rupprecht 't_2', 27599451b44SJordan Rupprecht 'w_2']) 27699451b44SJordan Rupprecht 27799451b44SJordan Rupprecht self.runCmd("settings set target.max-children-count 1") 27899451b44SJordan Rupprecht self.expect('frame variable a_long_guy', matching=True, 27999451b44SJordan Rupprecht substrs=['a_1', 28099451b44SJordan Rupprecht '...']) 28199451b44SJordan Rupprecht self.expect('frame variable a_long_guy', matching=False, 28299451b44SJordan Rupprecht substrs=['b_1', 28399451b44SJordan Rupprecht 'c_1', 28499451b44SJordan Rupprecht 'd_1', 28599451b44SJordan Rupprecht 'e_1']) 28699451b44SJordan Rupprecht self.expect('frame variable a_long_guy', matching=False, 28799451b44SJordan Rupprecht substrs=['f_1', 28899451b44SJordan Rupprecht 'g_1', 28999451b44SJordan Rupprecht 'h_1', 29099451b44SJordan Rupprecht 'i_1', 29199451b44SJordan Rupprecht 'j_1', 29299451b44SJordan Rupprecht 'q_1', 29399451b44SJordan Rupprecht 'a_2', 29499451b44SJordan Rupprecht 'f_2', 29599451b44SJordan Rupprecht 't_2', 29699451b44SJordan Rupprecht 'w_2']) 29799451b44SJordan Rupprecht 29899451b44SJordan Rupprecht self.runCmd("settings set target.max-children-count 30") 29999451b44SJordan Rupprecht self.expect('frame variable a_long_guy', matching=True, 30099451b44SJordan Rupprecht substrs=['a_1', 30199451b44SJordan Rupprecht 'b_1', 30299451b44SJordan Rupprecht 'c_1', 30399451b44SJordan Rupprecht 'd_1', 30499451b44SJordan Rupprecht 'e_1', 30599451b44SJordan Rupprecht 'z_1', 30699451b44SJordan Rupprecht 'a_2', 30799451b44SJordan Rupprecht 'b_2', 30899451b44SJordan Rupprecht 'c_2', 30999451b44SJordan Rupprecht 'd_2', 31099451b44SJordan Rupprecht '...']) 31199451b44SJordan Rupprecht self.expect('frame variable a_long_guy', matching=False, 31299451b44SJordan Rupprecht substrs=['e_2', 31399451b44SJordan Rupprecht 'n_2', 31499451b44SJordan Rupprecht 'r_2', 31599451b44SJordan Rupprecht 'i_2', 31699451b44SJordan Rupprecht 'k_2', 31799451b44SJordan Rupprecht 'o_2']) 31899451b44SJordan Rupprecht 31999451b44SJordan Rupprecht # override the cap 32099451b44SJordan Rupprecht self.expect( 32199451b44SJordan Rupprecht 'frame variable a_long_guy --show-all-children', 32299451b44SJordan Rupprecht matching=True, 32399451b44SJordan Rupprecht substrs=[ 32499451b44SJordan Rupprecht 'a_1', 32599451b44SJordan Rupprecht 'b_1', 32699451b44SJordan Rupprecht 'c_1', 32799451b44SJordan Rupprecht 'd_1', 32899451b44SJordan Rupprecht 'e_1', 32999451b44SJordan Rupprecht 'z_1', 33099451b44SJordan Rupprecht 'a_2', 33199451b44SJordan Rupprecht 'b_2', 33299451b44SJordan Rupprecht 'c_2', 33399451b44SJordan Rupprecht 'd_2']) 33499451b44SJordan Rupprecht self.expect( 33599451b44SJordan Rupprecht 'frame variable a_long_guy --show-all-children', 33699451b44SJordan Rupprecht matching=True, 33799451b44SJordan Rupprecht substrs=[ 33899451b44SJordan Rupprecht 'e_2', 33999451b44SJordan Rupprecht 'i_2', 34099451b44SJordan Rupprecht 'k_2', 34199451b44SJordan Rupprecht 'n_2', 34299451b44SJordan Rupprecht 'o_2', 34399451b44SJordan Rupprecht 'r_2', 34499451b44SJordan Rupprecht ]) 34599451b44SJordan Rupprecht self.expect( 34699451b44SJordan Rupprecht 'frame variable a_long_guy --show-all-children', 34799451b44SJordan Rupprecht matching=False, 34899451b44SJordan Rupprecht substrs=['...']) 349