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