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