1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest some SBValue APIs. 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprechtfrom __future__ import print_function 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprecht 8*99451b44SJordan Rupprechtimport lldb 9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 11*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 12*99451b44SJordan Rupprecht 13*99451b44SJordan Rupprecht 14*99451b44SJordan Rupprechtclass ValueAPITestCase(TestBase): 15*99451b44SJordan Rupprecht 16*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 17*99451b44SJordan Rupprecht 18*99451b44SJordan Rupprecht def setUp(self): 19*99451b44SJordan Rupprecht # Call super's setUp(). 20*99451b44SJordan Rupprecht TestBase.setUp(self) 21*99451b44SJordan Rupprecht # We'll use the test method name as the exe_name. 22*99451b44SJordan Rupprecht self.exe_name = self.testMethodName 23*99451b44SJordan Rupprecht # Find the line number to of function 'c'. 24*99451b44SJordan Rupprecht self.line = line_number('main.c', '// Break at this line') 25*99451b44SJordan Rupprecht 26*99451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24772") 27*99451b44SJordan Rupprecht @add_test_categories(['pyapi']) 28*99451b44SJordan Rupprecht def test(self): 29*99451b44SJordan Rupprecht """Exercise some SBValue APIs.""" 30*99451b44SJordan Rupprecht d = {'EXE': self.exe_name} 31*99451b44SJordan Rupprecht self.build(dictionary=d) 32*99451b44SJordan Rupprecht self.setTearDownCleanup(dictionary=d) 33*99451b44SJordan Rupprecht exe = self.getBuildArtifact(self.exe_name) 34*99451b44SJordan Rupprecht 35*99451b44SJordan Rupprecht # Create a target by the debugger. 36*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 37*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 38*99451b44SJordan Rupprecht 39*99451b44SJordan Rupprecht # Create the breakpoint inside function 'main'. 40*99451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation('main.c', self.line) 41*99451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 42*99451b44SJordan Rupprecht 43*99451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 44*99451b44SJordan Rupprecht process = target.LaunchSimple( 45*99451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 46*99451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 47*99451b44SJordan Rupprecht 48*99451b44SJordan Rupprecht # Get Frame #0. 49*99451b44SJordan Rupprecht self.assertTrue(process.GetState() == lldb.eStateStopped) 50*99451b44SJordan Rupprecht thread = lldbutil.get_stopped_thread( 51*99451b44SJordan Rupprecht process, lldb.eStopReasonBreakpoint) 52*99451b44SJordan Rupprecht self.assertTrue( 53*99451b44SJordan Rupprecht thread.IsValid(), 54*99451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint condition") 55*99451b44SJordan Rupprecht frame0 = thread.GetFrameAtIndex(0) 56*99451b44SJordan Rupprecht 57*99451b44SJordan Rupprecht # Get global variable 'days_of_week'. 58*99451b44SJordan Rupprecht list = target.FindGlobalVariables('days_of_week', 1) 59*99451b44SJordan Rupprecht days_of_week = list.GetValueAtIndex(0) 60*99451b44SJordan Rupprecht self.assertTrue(days_of_week, VALID_VARIABLE) 61*99451b44SJordan Rupprecht self.assertEqual(days_of_week.GetNumChildren(), 7, VALID_VARIABLE) 62*99451b44SJordan Rupprecht self.DebugSBValue(days_of_week) 63*99451b44SJordan Rupprecht 64*99451b44SJordan Rupprecht # Use this to test the "child" and "children" accessors: 65*99451b44SJordan Rupprecht children = days_of_week.children 66*99451b44SJordan Rupprecht self.assertEqual(len(children), 7, VALID_VARIABLE) 67*99451b44SJordan Rupprecht for i in range(0, len(children)): 68*99451b44SJordan Rupprecht day = days_of_week.child[i] 69*99451b44SJordan Rupprecht list_day = children[i] 70*99451b44SJordan Rupprecht self.assertNotEqual(day, None) 71*99451b44SJordan Rupprecht self.assertNotEqual(list_day, None) 72*99451b44SJordan Rupprecht self.assertEqual(day.GetSummary(), list_day.GetSummary(), VALID_VARIABLE) 73*99451b44SJordan Rupprecht 74*99451b44SJordan Rupprecht # Spot check the actual value: 75*99451b44SJordan Rupprecht first_day = days_of_week.child[1] 76*99451b44SJordan Rupprecht self.assertEqual(first_day.GetSummary(), '"Monday"', VALID_VARIABLE) 77*99451b44SJordan Rupprecht 78*99451b44SJordan Rupprecht # Get global variable 'weekdays'. 79*99451b44SJordan Rupprecht list = target.FindGlobalVariables('weekdays', 1) 80*99451b44SJordan Rupprecht weekdays = list.GetValueAtIndex(0) 81*99451b44SJordan Rupprecht self.assertTrue(weekdays, VALID_VARIABLE) 82*99451b44SJordan Rupprecht self.assertTrue(weekdays.GetNumChildren() == 5, VALID_VARIABLE) 83*99451b44SJordan Rupprecht self.DebugSBValue(weekdays) 84*99451b44SJordan Rupprecht 85*99451b44SJordan Rupprecht # Get global variable 'g_table'. 86*99451b44SJordan Rupprecht list = target.FindGlobalVariables('g_table', 1) 87*99451b44SJordan Rupprecht g_table = list.GetValueAtIndex(0) 88*99451b44SJordan Rupprecht self.assertTrue(g_table, VALID_VARIABLE) 89*99451b44SJordan Rupprecht self.assertTrue(g_table.GetNumChildren() == 2, VALID_VARIABLE) 90*99451b44SJordan Rupprecht self.DebugSBValue(g_table) 91*99451b44SJordan Rupprecht 92*99451b44SJordan Rupprecht fmt = lldbutil.BasicFormatter() 93*99451b44SJordan Rupprecht cvf = lldbutil.ChildVisitingFormatter(indent_child=2) 94*99451b44SJordan Rupprecht rdf = lldbutil.RecursiveDecentFormatter(indent_child=2) 95*99451b44SJordan Rupprecht if self.TraceOn(): 96*99451b44SJordan Rupprecht print(fmt.format(days_of_week)) 97*99451b44SJordan Rupprecht print(cvf.format(days_of_week)) 98*99451b44SJordan Rupprecht print(cvf.format(weekdays)) 99*99451b44SJordan Rupprecht print(rdf.format(g_table)) 100*99451b44SJordan Rupprecht 101*99451b44SJordan Rupprecht # Get variable 'my_int_ptr'. 102*99451b44SJordan Rupprecht value = frame0.FindVariable('my_int_ptr') 103*99451b44SJordan Rupprecht self.assertTrue(value, VALID_VARIABLE) 104*99451b44SJordan Rupprecht self.DebugSBValue(value) 105*99451b44SJordan Rupprecht 106*99451b44SJordan Rupprecht # Get what 'my_int_ptr' points to. 107*99451b44SJordan Rupprecht pointed = value.GetChildAtIndex(0) 108*99451b44SJordan Rupprecht self.assertTrue(pointed, VALID_VARIABLE) 109*99451b44SJordan Rupprecht self.DebugSBValue(pointed) 110*99451b44SJordan Rupprecht 111*99451b44SJordan Rupprecht # While we are at it, verify that 'my_int_ptr' points to 'g_my_int'. 112*99451b44SJordan Rupprecht symbol = target.ResolveLoadAddress( 113*99451b44SJordan Rupprecht int(pointed.GetLocation(), 0)).GetSymbol() 114*99451b44SJordan Rupprecht self.assertTrue(symbol) 115*99451b44SJordan Rupprecht self.expect(symbol.GetName(), exe=False, 116*99451b44SJordan Rupprecht startstr='g_my_int') 117*99451b44SJordan Rupprecht 118*99451b44SJordan Rupprecht # Get variable 'str_ptr'. 119*99451b44SJordan Rupprecht value = frame0.FindVariable('str_ptr') 120*99451b44SJordan Rupprecht self.assertTrue(value, VALID_VARIABLE) 121*99451b44SJordan Rupprecht self.DebugSBValue(value) 122*99451b44SJordan Rupprecht 123*99451b44SJordan Rupprecht # SBValue::TypeIsPointerType() should return true. 124*99451b44SJordan Rupprecht self.assertTrue(value.TypeIsPointerType()) 125*99451b44SJordan Rupprecht 126*99451b44SJordan Rupprecht # Verify the SBValue::GetByteSize() API is working correctly. 127*99451b44SJordan Rupprecht arch = self.getArchitecture() 128*99451b44SJordan Rupprecht if arch == 'i386': 129*99451b44SJordan Rupprecht self.assertTrue(value.GetByteSize() == 4) 130*99451b44SJordan Rupprecht elif arch == 'x86_64': 131*99451b44SJordan Rupprecht self.assertTrue(value.GetByteSize() == 8) 132*99451b44SJordan Rupprecht 133*99451b44SJordan Rupprecht # Get child at index 5 => 'Friday'. 134*99451b44SJordan Rupprecht child = value.GetChildAtIndex(5, lldb.eNoDynamicValues, True) 135*99451b44SJordan Rupprecht self.assertTrue(child, VALID_VARIABLE) 136*99451b44SJordan Rupprecht self.DebugSBValue(child) 137*99451b44SJordan Rupprecht 138*99451b44SJordan Rupprecht self.expect(child.GetSummary(), exe=False, 139*99451b44SJordan Rupprecht substrs=['Friday']) 140*99451b44SJordan Rupprecht 141*99451b44SJordan Rupprecht # Now try to get at the same variable using GetValueForExpressionPath(). 142*99451b44SJordan Rupprecht # These two SBValue objects should have the same value. 143*99451b44SJordan Rupprecht val2 = value.GetValueForExpressionPath('[5]') 144*99451b44SJordan Rupprecht self.assertTrue(val2, VALID_VARIABLE) 145*99451b44SJordan Rupprecht self.DebugSBValue(val2) 146*99451b44SJordan Rupprecht self.assertTrue(child.GetValue() == val2.GetValue() and 147*99451b44SJordan Rupprecht child.GetSummary() == val2.GetSummary()) 148*99451b44SJordan Rupprecht 149*99451b44SJordan Rupprecht val_i = target.EvaluateExpression('i') 150*99451b44SJordan Rupprecht val_s = target.EvaluateExpression('s') 151*99451b44SJordan Rupprecht val_a = target.EvaluateExpression('a') 152*99451b44SJordan Rupprecht self.assertTrue( 153*99451b44SJordan Rupprecht val_s.GetChildMemberWithName('a').GetAddress().IsValid(), 154*99451b44SJordan Rupprecht VALID_VARIABLE) 155*99451b44SJordan Rupprecht self.assertTrue( 156*99451b44SJordan Rupprecht val_s.GetChildMemberWithName('a').AddressOf(), 157*99451b44SJordan Rupprecht VALID_VARIABLE) 158*99451b44SJordan Rupprecht self.assertTrue( 159*99451b44SJordan Rupprecht val_a.Cast( 160*99451b44SJordan Rupprecht val_i.GetType()).AddressOf(), 161*99451b44SJordan Rupprecht VALID_VARIABLE) 162*99451b44SJordan Rupprecht 163*99451b44SJordan Rupprecht # Check that lldb.value implements truth testing. 164*99451b44SJordan Rupprecht self.assertFalse(lldb.value(frame0.FindVariable('bogus'))) 165*99451b44SJordan Rupprecht self.assertTrue(lldb.value(frame0.FindVariable('uinthex'))) 166*99451b44SJordan Rupprecht 167*99451b44SJordan Rupprecht self.assertTrue(int(lldb.value(frame0.FindVariable('uinthex'))) 168*99451b44SJordan Rupprecht == 3768803088, 'uinthex == 3768803088') 169*99451b44SJordan Rupprecht self.assertTrue(int(lldb.value(frame0.FindVariable('sinthex'))) 170*99451b44SJordan Rupprecht == -526164208, 'sinthex == -526164208') 171*99451b44SJordan Rupprecht 172*99451b44SJordan Rupprecht # Check value_iter works correctly. 173*99451b44SJordan Rupprecht for v in [ 174*99451b44SJordan Rupprecht lldb.value(frame0.FindVariable('uinthex')), 175*99451b44SJordan Rupprecht lldb.value(frame0.FindVariable('sinthex')) 176*99451b44SJordan Rupprecht ]: 177*99451b44SJordan Rupprecht self.assertTrue(v) 178*99451b44SJordan Rupprecht 179*99451b44SJordan Rupprecht self.assertTrue( 180*99451b44SJordan Rupprecht frame0.FindVariable('uinthex').GetValueAsUnsigned() == 3768803088, 181*99451b44SJordan Rupprecht 'unsigned uinthex == 3768803088') 182*99451b44SJordan Rupprecht self.assertTrue( 183*99451b44SJordan Rupprecht frame0.FindVariable('sinthex').GetValueAsUnsigned() == 3768803088, 184*99451b44SJordan Rupprecht 'unsigned sinthex == 3768803088') 185*99451b44SJordan Rupprecht 186*99451b44SJordan Rupprecht self.assertTrue( 187*99451b44SJordan Rupprecht frame0.FindVariable('uinthex').GetValueAsSigned() == - 188*99451b44SJordan Rupprecht 526164208, 189*99451b44SJordan Rupprecht 'signed uinthex == -526164208') 190*99451b44SJordan Rupprecht self.assertTrue( 191*99451b44SJordan Rupprecht frame0.FindVariable('sinthex').GetValueAsSigned() == - 192*99451b44SJordan Rupprecht 526164208, 193*99451b44SJordan Rupprecht 'signed sinthex == -526164208') 194