199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest some SBValue APIs. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport lldb 899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprechtclass ChangeValueAPITestCase(TestBase): 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht def setUp(self): 1699451b44SJordan Rupprecht # Call super's setUp(). 1799451b44SJordan Rupprecht TestBase.setUp(self) 1899451b44SJordan Rupprecht # We'll use the test method name as the exe_name. 1999451b44SJordan Rupprecht self.exe_name = self.testMethodName 2099451b44SJordan Rupprecht # Find the line number to of function 'c'. 2199451b44SJordan Rupprecht self.line = line_number('main.c', '// Stop here and set values') 2299451b44SJordan Rupprecht self.check_line = line_number( 2399451b44SJordan Rupprecht 'main.c', '// Stop here and check values') 2499451b44SJordan Rupprecht self.end_line = line_number( 2599451b44SJordan Rupprecht 'main.c', '// Set a breakpoint here at the end') 2699451b44SJordan Rupprecht 2799451b44SJordan Rupprecht @expectedFlakeyLinux("llvm.org/pr25652") 2899451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24772") 2999451b44SJordan Rupprecht def test_change_value(self): 3099451b44SJordan Rupprecht """Exercise the SBValue::SetValueFromCString API.""" 3199451b44SJordan Rupprecht d = {'EXE': self.exe_name} 3299451b44SJordan Rupprecht self.build(dictionary=d) 3399451b44SJordan Rupprecht self.setTearDownCleanup(dictionary=d) 3499451b44SJordan Rupprecht exe = self.getBuildArtifact(self.exe_name) 3599451b44SJordan Rupprecht 3699451b44SJordan Rupprecht # Create a target by the debugger. 3799451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 3899451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht # Create the breakpoint inside function 'main'. 4199451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation('main.c', self.line) 4299451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 4399451b44SJordan Rupprecht 4499451b44SJordan Rupprecht # Create the breakpoint inside the function 'main' 4599451b44SJordan Rupprecht check_breakpoint = target.BreakpointCreateByLocation( 4699451b44SJordan Rupprecht 'main.c', self.check_line) 4799451b44SJordan Rupprecht self.assertTrue(check_breakpoint, VALID_BREAKPOINT) 4899451b44SJordan Rupprecht 4999451b44SJordan Rupprecht # Create the breakpoint inside function 'main'. 5099451b44SJordan Rupprecht end_breakpoint = target.BreakpointCreateByLocation( 5199451b44SJordan Rupprecht 'main.c', self.end_line) 5299451b44SJordan Rupprecht self.assertTrue(end_breakpoint, VALID_BREAKPOINT) 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 5599451b44SJordan Rupprecht process = target.LaunchSimple( 5699451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 5799451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 5899451b44SJordan Rupprecht 5999451b44SJordan Rupprecht # Get Frame #0. 60*ce825e46SJonas Devlieghere self.assertState(process.GetState(), lldb.eStateStopped) 6199451b44SJordan Rupprecht thread = lldbutil.get_stopped_thread( 6299451b44SJordan Rupprecht process, lldb.eStopReasonBreakpoint) 6399451b44SJordan Rupprecht self.assertTrue( 6499451b44SJordan Rupprecht thread.IsValid(), 6599451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint condition") 6699451b44SJordan Rupprecht frame0 = thread.GetFrameAtIndex(0) 6799451b44SJordan Rupprecht self.assertTrue(frame0.IsValid(), "Got a valid frame.") 6899451b44SJordan Rupprecht 6999451b44SJordan Rupprecht # Get the val variable and change it: 7099451b44SJordan Rupprecht error = lldb.SBError() 7199451b44SJordan Rupprecht 7299451b44SJordan Rupprecht val_value = frame0.FindVariable("val") 7399451b44SJordan Rupprecht self.assertTrue(val_value.IsValid(), "Got the SBValue for val") 7499451b44SJordan Rupprecht actual_value = val_value.GetValueAsSigned(error, 0) 75779bbbf2SDave Lee self.assertSuccess(error, "Got a value from val") 76b3a0c4d7SRaphael Isemann self.assertEquals(actual_value, 100, "Got the right value from val") 7799451b44SJordan Rupprecht 7899451b44SJordan Rupprecht result = val_value.SetValueFromCString("12345") 7999451b44SJordan Rupprecht self.assertTrue(result, "Setting val returned True.") 8099451b44SJordan Rupprecht actual_value = val_value.GetValueAsSigned(error, 0) 81779bbbf2SDave Lee self.assertSuccess(error, "Got a changed value from val") 820ed758b2SDave Lee self.assertEqual( 830ed758b2SDave Lee actual_value, 12345, 8499451b44SJordan Rupprecht "Got the right changed value from val") 8599451b44SJordan Rupprecht 8699451b44SJordan Rupprecht # Now check that we can set a structure element: 8799451b44SJordan Rupprecht 8899451b44SJordan Rupprecht mine_value = frame0.FindVariable("mine") 8999451b44SJordan Rupprecht self.assertTrue(mine_value.IsValid(), "Got the SBValue for mine") 9099451b44SJordan Rupprecht 9199451b44SJordan Rupprecht mine_second_value = mine_value.GetChildMemberWithName("second_val") 9299451b44SJordan Rupprecht self.assertTrue( 9399451b44SJordan Rupprecht mine_second_value.IsValid(), 9499451b44SJordan Rupprecht "Got second_val from mine") 9599451b44SJordan Rupprecht actual_value = mine_second_value.GetValueAsUnsigned(error, 0) 9699451b44SJordan Rupprecht self.assertTrue( 9799451b44SJordan Rupprecht error.Success(), 9899451b44SJordan Rupprecht "Got an unsigned value for second_val") 99b3a0c4d7SRaphael Isemann self.assertEquals(actual_value, 5555) 10099451b44SJordan Rupprecht 10199451b44SJordan Rupprecht result = mine_second_value.SetValueFromCString("98765") 10299451b44SJordan Rupprecht self.assertTrue(result, "Success setting mine.second_value.") 10399451b44SJordan Rupprecht actual_value = mine_second_value.GetValueAsSigned(error, 0) 10499451b44SJordan Rupprecht self.assertTrue( 10599451b44SJordan Rupprecht error.Success(), 10699451b44SJordan Rupprecht "Got a changed value from mine.second_val") 107b3a0c4d7SRaphael Isemann self.assertEquals(actual_value, 98765, 10899451b44SJordan Rupprecht "Got the right changed value from mine.second_val") 10999451b44SJordan Rupprecht 11099451b44SJordan Rupprecht # Next do the same thing with the pointer version. 11199451b44SJordan Rupprecht ptr_value = frame0.FindVariable("ptr") 11299451b44SJordan Rupprecht self.assertTrue(ptr_value.IsValid(), "Got the SBValue for ptr") 11399451b44SJordan Rupprecht 11499451b44SJordan Rupprecht ptr_second_value = ptr_value.GetChildMemberWithName("second_val") 11599451b44SJordan Rupprecht self.assertTrue(ptr_second_value.IsValid(), "Got second_val from ptr") 11699451b44SJordan Rupprecht actual_value = ptr_second_value.GetValueAsUnsigned(error, 0) 11799451b44SJordan Rupprecht self.assertTrue( 11899451b44SJordan Rupprecht error.Success(), 11999451b44SJordan Rupprecht "Got an unsigned value for ptr->second_val") 120b3a0c4d7SRaphael Isemann self.assertEquals(actual_value, 6666) 12199451b44SJordan Rupprecht 12299451b44SJordan Rupprecht result = ptr_second_value.SetValueFromCString("98765") 12399451b44SJordan Rupprecht self.assertTrue(result, "Success setting ptr->second_value.") 12499451b44SJordan Rupprecht actual_value = ptr_second_value.GetValueAsSigned(error, 0) 12599451b44SJordan Rupprecht self.assertTrue( 12699451b44SJordan Rupprecht error.Success(), 12799451b44SJordan Rupprecht "Got a changed value from ptr->second_val") 128b3a0c4d7SRaphael Isemann self.assertEquals(actual_value, 98765, 12999451b44SJordan Rupprecht "Got the right changed value from ptr->second_val") 13099451b44SJordan Rupprecht 13199451b44SJordan Rupprecht # gcc may set multiple locations for breakpoint 13299451b44SJordan Rupprecht breakpoint.SetEnabled(False) 13399451b44SJordan Rupprecht 1347606a543SJonas Devlieghere # Now continue. 13599451b44SJordan Rupprecht process.Continue() 13699451b44SJordan Rupprecht 137*ce825e46SJonas Devlieghere self.assertState(process.GetState(), lldb.eStateStopped) 13899451b44SJordan Rupprecht thread = lldbutil.get_stopped_thread( 13999451b44SJordan Rupprecht process, lldb.eStopReasonBreakpoint) 14099451b44SJordan Rupprecht self.assertTrue( 14199451b44SJordan Rupprecht thread.IsValid(), 14299451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint condition") 14399451b44SJordan Rupprecht 14499451b44SJordan Rupprecht expected_value = "Val - 12345 Mine - 55, 98765, 55555555. Ptr - 66, 98765, 66666666" 14599451b44SJordan Rupprecht stdout = process.GetSTDOUT(1000) 14699451b44SJordan Rupprecht self.assertTrue( 14799451b44SJordan Rupprecht expected_value in stdout, 14899451b44SJordan Rupprecht "STDOUT showed changed values.") 14999451b44SJordan Rupprecht 15099451b44SJordan Rupprecht # Finally, change the stack pointer to 0, and we should not make it to 15199451b44SJordan Rupprecht # our end breakpoint. 15299451b44SJordan Rupprecht frame0 = thread.GetFrameAtIndex(0) 15399451b44SJordan Rupprecht self.assertTrue(frame0.IsValid(), "Second time: got a valid frame.") 15499451b44SJordan Rupprecht sp_value = frame0.FindValue("sp", lldb.eValueTypeRegister) 15599451b44SJordan Rupprecht self.assertTrue(sp_value.IsValid(), "Got a stack pointer value") 15699451b44SJordan Rupprecht result = sp_value.SetValueFromCString("1") 15799451b44SJordan Rupprecht self.assertTrue(result, "Setting sp returned true.") 15899451b44SJordan Rupprecht actual_value = sp_value.GetValueAsUnsigned(error, 0) 159779bbbf2SDave Lee self.assertSuccess(error, "Got a changed value for sp") 1600ed758b2SDave Lee self.assertEqual( 1610ed758b2SDave Lee actual_value, 1, 16299451b44SJordan Rupprecht "Got the right changed value for sp.") 16399451b44SJordan Rupprecht 16499451b44SJordan Rupprecht # Boundary condition test the SBValue.CreateValueFromExpression() API. 16599451b44SJordan Rupprecht # LLDB should not crash! 16699451b44SJordan Rupprecht nosuchval = mine_value.CreateValueFromExpression(None, None) 16799451b44SJordan Rupprecht 16899451b44SJordan Rupprecht process.Continue() 16999451b44SJordan Rupprecht 170*ce825e46SJonas Devlieghere self.assertState(process.GetState(), lldb.eStateStopped) 17199451b44SJordan Rupprecht thread = lldbutil.get_stopped_thread( 17299451b44SJordan Rupprecht process, lldb.eStopReasonBreakpoint) 17399451b44SJordan Rupprecht self.assertTrue( 17499451b44SJordan Rupprecht thread is None, 17599451b44SJordan Rupprecht "We should not have managed to hit our second breakpoint with sp == 1") 17699451b44SJordan Rupprecht 17799451b44SJordan Rupprecht process.Kill() 178