199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest lldb data formatter subsystem. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtfrom __future__ import print_function 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtimport lldb 999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprechtclass DataFormatterSynthValueTestCase(TestBase): 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht def setUp(self): 1799451b44SJordan Rupprecht # Call super's setUp(). 1899451b44SJordan Rupprecht TestBase.setUp(self) 1999451b44SJordan Rupprecht # Find the line number to break at. 2099451b44SJordan Rupprecht self.line = line_number('main.cpp', 'break here') 2199451b44SJordan Rupprecht 22*c3549d4dSRaphael Isemann @expectedFailureAll(bugnumber="llvm.org/pr50814", compiler="gcc") 2399451b44SJordan Rupprecht def test_with_run_command(self): 2499451b44SJordan Rupprecht """Test using Python synthetic children provider to provide a value.""" 2599451b44SJordan Rupprecht self.build() 2699451b44SJordan Rupprecht self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 2999451b44SJordan Rupprecht self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True) 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 3299451b44SJordan Rupprecht 3399451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 3499451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 3599451b44SJordan Rupprecht substrs=['stopped', 3699451b44SJordan Rupprecht 'stop reason = breakpoint']) 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht # This is the function to remove the custom formats in order to have a 3999451b44SJordan Rupprecht # clean slate for the next test case. 4099451b44SJordan Rupprecht def cleanup(): 4199451b44SJordan Rupprecht self.runCmd('type format clear', check=False) 4299451b44SJordan Rupprecht self.runCmd('type summary clear', check=False) 4399451b44SJordan Rupprecht self.runCmd('type filter clear', check=False) 4499451b44SJordan Rupprecht self.runCmd('type synth 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 x = self.frame().FindVariable("x") 5099451b44SJordan Rupprecht x.SetPreferSyntheticValue(True) 5199451b44SJordan Rupprecht y = self.frame().FindVariable("y") 5299451b44SJordan Rupprecht y.SetPreferSyntheticValue(True) 5399451b44SJordan Rupprecht z = self.frame().FindVariable("z") 5499451b44SJordan Rupprecht z.SetPreferSyntheticValue(True) 5599451b44SJordan Rupprecht q = self.frame().FindVariable("q") 5699451b44SJordan Rupprecht z.SetPreferSyntheticValue(True) 5799451b44SJordan Rupprecht 5899451b44SJordan Rupprecht x_val = x.GetValueAsUnsigned 5999451b44SJordan Rupprecht y_val = y.GetValueAsUnsigned 6099451b44SJordan Rupprecht z_val = z.GetValueAsUnsigned 6199451b44SJordan Rupprecht q_val = q.GetValueAsUnsigned 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht if self.TraceOn(): 6499451b44SJordan Rupprecht print( 6599451b44SJordan Rupprecht "x_val = %s; y_val = %s; z_val = %s; q_val = %s" % 6699451b44SJordan Rupprecht (x_val(), y_val(), z_val(), q_val())) 6799451b44SJordan Rupprecht 68619e2e09SDave Lee self.assertNotEqual(x_val(), 3, "x == 3 before synthetics") 69619e2e09SDave Lee self.assertNotEqual(y_val(), 4, "y == 4 before synthetics") 70619e2e09SDave Lee self.assertNotEqual(z_val(), 7, "z == 7 before synthetics") 71619e2e09SDave Lee self.assertNotEqual(q_val(), 8, "q == 8 before synthetics") 7299451b44SJordan Rupprecht 7399451b44SJordan Rupprecht # now set up the synth 7499451b44SJordan Rupprecht self.runCmd("script from myIntSynthProvider import *") 7599451b44SJordan Rupprecht self.runCmd("type synth add -l myIntSynthProvider myInt") 7699451b44SJordan Rupprecht self.runCmd("type synth add -l myArraySynthProvider myArray") 7799451b44SJordan Rupprecht self.runCmd("type synth add -l myIntSynthProvider myIntAndStuff") 7899451b44SJordan Rupprecht 7999451b44SJordan Rupprecht if self.TraceOn(): 8099451b44SJordan Rupprecht print( 8199451b44SJordan Rupprecht "x_val = %s; y_val = %s; z_val = %s; q_val = %s" % 8299451b44SJordan Rupprecht (x_val(), y_val(), z_val(), q_val())) 8399451b44SJordan Rupprecht 84619e2e09SDave Lee self.assertEqual(x_val(), 3, "x != 3 after synthetics") 85619e2e09SDave Lee self.assertEqual(y_val(), 4, "y != 4 after synthetics") 86619e2e09SDave Lee self.assertEqual(z_val(), 7, "z != 7 after synthetics") 87619e2e09SDave Lee self.assertEqual(q_val(), 8, "q != 8 after synthetics") 8899451b44SJordan Rupprecht 8999451b44SJordan Rupprecht self.expect("frame variable x", substrs=['3']) 9099451b44SJordan Rupprecht self.expect( 9199451b44SJordan Rupprecht "frame variable x", 9299451b44SJordan Rupprecht substrs=['theValue = 3'], 9399451b44SJordan Rupprecht matching=False) 9499451b44SJordan Rupprecht self.expect("frame variable q", substrs=['8']) 9599451b44SJordan Rupprecht self.expect( 9699451b44SJordan Rupprecht "frame variable q", 9799451b44SJordan Rupprecht substrs=['theValue = 8'], 9899451b44SJordan Rupprecht matching=False) 9999451b44SJordan Rupprecht 10099451b44SJordan Rupprecht # check that an aptly defined synthetic provider does not affect 10199451b44SJordan Rupprecht # one-lining 10299451b44SJordan Rupprecht self.expect( 10399451b44SJordan Rupprecht "expression struct Struct { myInt theInt{12}; }; Struct()", 10499451b44SJordan Rupprecht substrs=['(theInt = 12)']) 10599451b44SJordan Rupprecht 10699451b44SJordan Rupprecht # check that we can use a synthetic value in a summary 10799451b44SJordan Rupprecht self.runCmd("type summary add hasAnInt -s ${var.theInt}") 10899451b44SJordan Rupprecht hi = self.frame().FindVariable("hi") 10999451b44SJordan Rupprecht self.assertEqual(hi.GetSummary(), "42") 11099451b44SJordan Rupprecht 11199451b44SJordan Rupprecht ma = self.frame().FindVariable("ma") 11299451b44SJordan Rupprecht self.assertTrue(ma.IsValid()) 11399451b44SJordan Rupprecht self.assertEqual(ma.GetNumChildren(15), 15) 11499451b44SJordan Rupprecht self.assertEqual(ma.GetNumChildren(16), 16) 11599451b44SJordan Rupprecht self.assertEqual(ma.GetNumChildren(17), 16) 116