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