199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest some SBValue APIs. 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 ValueAPITestCase(TestBase): 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht def setUp(self): 1999451b44SJordan Rupprecht # Call super's setUp(). 2099451b44SJordan Rupprecht TestBase.setUp(self) 2199451b44SJordan Rupprecht # We'll use the test method name as the exe_name. 2299451b44SJordan Rupprecht self.exe_name = self.testMethodName 2399451b44SJordan Rupprecht # Find the line number to of function 'c'. 2499451b44SJordan Rupprecht self.line = line_number('main.c', '// Break at this line') 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24772") 2799451b44SJordan Rupprecht @add_test_categories(['pyapi']) 2899451b44SJordan Rupprecht def test(self): 2999451b44SJordan Rupprecht """Exercise some SBValue APIs.""" 3099451b44SJordan Rupprecht d = {'EXE': self.exe_name} 3199451b44SJordan Rupprecht self.build(dictionary=d) 3299451b44SJordan Rupprecht self.setTearDownCleanup(dictionary=d) 3399451b44SJordan Rupprecht exe = self.getBuildArtifact(self.exe_name) 3499451b44SJordan Rupprecht 3599451b44SJordan Rupprecht # Create a target by the debugger. 3699451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 3799451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 3899451b44SJordan Rupprecht 3999451b44SJordan Rupprecht # Create the breakpoint inside function 'main'. 4099451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation('main.c', self.line) 4199451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 4499451b44SJordan Rupprecht process = target.LaunchSimple( 4599451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 4699451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 4799451b44SJordan Rupprecht 4899451b44SJordan Rupprecht # Get Frame #0. 49619e2e09SDave Lee self.assertEqual(process.GetState(), lldb.eStateStopped) 5099451b44SJordan Rupprecht thread = lldbutil.get_stopped_thread( 5199451b44SJordan Rupprecht process, lldb.eStopReasonBreakpoint) 5299451b44SJordan Rupprecht self.assertTrue( 5399451b44SJordan Rupprecht thread.IsValid(), 5499451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint condition") 5599451b44SJordan Rupprecht frame0 = thread.GetFrameAtIndex(0) 5699451b44SJordan Rupprecht 5799451b44SJordan Rupprecht # Get global variable 'days_of_week'. 5899451b44SJordan Rupprecht list = target.FindGlobalVariables('days_of_week', 1) 5999451b44SJordan Rupprecht days_of_week = list.GetValueAtIndex(0) 6099451b44SJordan Rupprecht self.assertTrue(days_of_week, VALID_VARIABLE) 6199451b44SJordan Rupprecht self.assertEqual(days_of_week.GetNumChildren(), 7, VALID_VARIABLE) 6299451b44SJordan Rupprecht self.DebugSBValue(days_of_week) 6399451b44SJordan Rupprecht 6499451b44SJordan Rupprecht # Use this to test the "child" and "children" accessors: 6599451b44SJordan Rupprecht children = days_of_week.children 6699451b44SJordan Rupprecht self.assertEqual(len(children), 7, VALID_VARIABLE) 6799451b44SJordan Rupprecht for i in range(0, len(children)): 6899451b44SJordan Rupprecht day = days_of_week.child[i] 6999451b44SJordan Rupprecht list_day = children[i] 7099451b44SJordan Rupprecht self.assertNotEqual(day, None) 7199451b44SJordan Rupprecht self.assertNotEqual(list_day, None) 7299451b44SJordan Rupprecht self.assertEqual(day.GetSummary(), list_day.GetSummary(), VALID_VARIABLE) 7399451b44SJordan Rupprecht 7499451b44SJordan Rupprecht # Spot check the actual value: 7599451b44SJordan Rupprecht first_day = days_of_week.child[1] 7699451b44SJordan Rupprecht self.assertEqual(first_day.GetSummary(), '"Monday"', VALID_VARIABLE) 7799451b44SJordan Rupprecht 7899451b44SJordan Rupprecht # Get global variable 'weekdays'. 7999451b44SJordan Rupprecht list = target.FindGlobalVariables('weekdays', 1) 8099451b44SJordan Rupprecht weekdays = list.GetValueAtIndex(0) 8199451b44SJordan Rupprecht self.assertTrue(weekdays, VALID_VARIABLE) 82619e2e09SDave Lee self.assertEqual(weekdays.GetNumChildren(), 5, VALID_VARIABLE) 8399451b44SJordan Rupprecht self.DebugSBValue(weekdays) 8499451b44SJordan Rupprecht 8599451b44SJordan Rupprecht # Get global variable 'g_table'. 8699451b44SJordan Rupprecht list = target.FindGlobalVariables('g_table', 1) 8799451b44SJordan Rupprecht g_table = list.GetValueAtIndex(0) 8899451b44SJordan Rupprecht self.assertTrue(g_table, VALID_VARIABLE) 89619e2e09SDave Lee self.assertEqual(g_table.GetNumChildren(), 2, VALID_VARIABLE) 9099451b44SJordan Rupprecht self.DebugSBValue(g_table) 9199451b44SJordan Rupprecht 9299451b44SJordan Rupprecht fmt = lldbutil.BasicFormatter() 9399451b44SJordan Rupprecht cvf = lldbutil.ChildVisitingFormatter(indent_child=2) 9499451b44SJordan Rupprecht rdf = lldbutil.RecursiveDecentFormatter(indent_child=2) 9599451b44SJordan Rupprecht if self.TraceOn(): 9699451b44SJordan Rupprecht print(fmt.format(days_of_week)) 9799451b44SJordan Rupprecht print(cvf.format(days_of_week)) 9899451b44SJordan Rupprecht print(cvf.format(weekdays)) 9999451b44SJordan Rupprecht print(rdf.format(g_table)) 10099451b44SJordan Rupprecht 10199451b44SJordan Rupprecht # Get variable 'my_int_ptr'. 10299451b44SJordan Rupprecht value = frame0.FindVariable('my_int_ptr') 10399451b44SJordan Rupprecht self.assertTrue(value, VALID_VARIABLE) 10499451b44SJordan Rupprecht self.DebugSBValue(value) 10599451b44SJordan Rupprecht 10699451b44SJordan Rupprecht # Get what 'my_int_ptr' points to. 10799451b44SJordan Rupprecht pointed = value.GetChildAtIndex(0) 10899451b44SJordan Rupprecht self.assertTrue(pointed, VALID_VARIABLE) 10999451b44SJordan Rupprecht self.DebugSBValue(pointed) 11099451b44SJordan Rupprecht 11199451b44SJordan Rupprecht # While we are at it, verify that 'my_int_ptr' points to 'g_my_int'. 11299451b44SJordan Rupprecht symbol = target.ResolveLoadAddress( 11399451b44SJordan Rupprecht int(pointed.GetLocation(), 0)).GetSymbol() 11499451b44SJordan Rupprecht self.assertTrue(symbol) 11599451b44SJordan Rupprecht self.expect(symbol.GetName(), exe=False, 11699451b44SJordan Rupprecht startstr='g_my_int') 11799451b44SJordan Rupprecht 11899451b44SJordan Rupprecht # Get variable 'str_ptr'. 11999451b44SJordan Rupprecht value = frame0.FindVariable('str_ptr') 12099451b44SJordan Rupprecht self.assertTrue(value, VALID_VARIABLE) 12199451b44SJordan Rupprecht self.DebugSBValue(value) 12299451b44SJordan Rupprecht 12399451b44SJordan Rupprecht # SBValue::TypeIsPointerType() should return true. 12499451b44SJordan Rupprecht self.assertTrue(value.TypeIsPointerType()) 12599451b44SJordan Rupprecht 12699451b44SJordan Rupprecht # Verify the SBValue::GetByteSize() API is working correctly. 12799451b44SJordan Rupprecht arch = self.getArchitecture() 12899451b44SJordan Rupprecht if arch == 'i386': 129619e2e09SDave Lee self.assertEqual(value.GetByteSize(), 4) 13099451b44SJordan Rupprecht elif arch == 'x86_64': 131619e2e09SDave Lee self.assertEqual(value.GetByteSize(), 8) 13299451b44SJordan Rupprecht 13399451b44SJordan Rupprecht # Get child at index 5 => 'Friday'. 13499451b44SJordan Rupprecht child = value.GetChildAtIndex(5, lldb.eNoDynamicValues, True) 13599451b44SJordan Rupprecht self.assertTrue(child, VALID_VARIABLE) 13699451b44SJordan Rupprecht self.DebugSBValue(child) 13799451b44SJordan Rupprecht 13899451b44SJordan Rupprecht self.expect(child.GetSummary(), exe=False, 13999451b44SJordan Rupprecht substrs=['Friday']) 14099451b44SJordan Rupprecht 14199451b44SJordan Rupprecht # Now try to get at the same variable using GetValueForExpressionPath(). 14299451b44SJordan Rupprecht # These two SBValue objects should have the same value. 14399451b44SJordan Rupprecht val2 = value.GetValueForExpressionPath('[5]') 14499451b44SJordan Rupprecht self.assertTrue(val2, VALID_VARIABLE) 14599451b44SJordan Rupprecht self.DebugSBValue(val2) 14699451b44SJordan Rupprecht self.assertTrue(child.GetValue() == val2.GetValue() and 14799451b44SJordan Rupprecht child.GetSummary() == val2.GetSummary()) 14899451b44SJordan Rupprecht 14999451b44SJordan Rupprecht val_i = target.EvaluateExpression('i') 15099451b44SJordan Rupprecht val_s = target.EvaluateExpression('s') 15199451b44SJordan Rupprecht val_a = target.EvaluateExpression('a') 15299451b44SJordan Rupprecht self.assertTrue( 15399451b44SJordan Rupprecht val_s.GetChildMemberWithName('a').GetAddress().IsValid(), 15499451b44SJordan Rupprecht VALID_VARIABLE) 15599451b44SJordan Rupprecht self.assertTrue( 15699451b44SJordan Rupprecht val_s.GetChildMemberWithName('a').AddressOf(), 15799451b44SJordan Rupprecht VALID_VARIABLE) 15899451b44SJordan Rupprecht self.assertTrue( 15999451b44SJordan Rupprecht val_a.Cast( 16099451b44SJordan Rupprecht val_i.GetType()).AddressOf(), 16199451b44SJordan Rupprecht VALID_VARIABLE) 16299451b44SJordan Rupprecht 16399451b44SJordan Rupprecht # Check that lldb.value implements truth testing. 16499451b44SJordan Rupprecht self.assertFalse(lldb.value(frame0.FindVariable('bogus'))) 16599451b44SJordan Rupprecht self.assertTrue(lldb.value(frame0.FindVariable('uinthex'))) 16699451b44SJordan Rupprecht 16799451b44SJordan Rupprecht self.assertTrue(int(lldb.value(frame0.FindVariable('uinthex'))) 16899451b44SJordan Rupprecht == 3768803088, 'uinthex == 3768803088') 16999451b44SJordan Rupprecht self.assertTrue(int(lldb.value(frame0.FindVariable('sinthex'))) 17099451b44SJordan Rupprecht == -526164208, 'sinthex == -526164208') 17199451b44SJordan Rupprecht 17299451b44SJordan Rupprecht # Check value_iter works correctly. 17399451b44SJordan Rupprecht for v in [ 17499451b44SJordan Rupprecht lldb.value(frame0.FindVariable('uinthex')), 17599451b44SJordan Rupprecht lldb.value(frame0.FindVariable('sinthex')) 17699451b44SJordan Rupprecht ]: 17799451b44SJordan Rupprecht self.assertTrue(v) 17899451b44SJordan Rupprecht 179*0ed758b2SDave Lee self.assertEqual( 180*0ed758b2SDave Lee frame0.FindVariable('uinthex').GetValueAsUnsigned(), 3768803088, 18199451b44SJordan Rupprecht 'unsigned uinthex == 3768803088') 182*0ed758b2SDave Lee self.assertEqual( 183*0ed758b2SDave Lee frame0.FindVariable('sinthex').GetValueAsUnsigned(), 3768803088, 18499451b44SJordan Rupprecht 'unsigned sinthex == 3768803088') 18599451b44SJordan Rupprecht 18699451b44SJordan Rupprecht self.assertTrue( 18799451b44SJordan Rupprecht frame0.FindVariable('uinthex').GetValueAsSigned() == - 18899451b44SJordan Rupprecht 526164208, 18999451b44SJordan Rupprecht 'signed uinthex == -526164208') 19099451b44SJordan Rupprecht self.assertTrue( 19199451b44SJordan Rupprecht frame0.FindVariable('sinthex').GetValueAsSigned() == - 19299451b44SJordan Rupprecht 526164208, 19399451b44SJordan Rupprecht 'signed sinthex == -526164208') 194