[lldb] Fix updating persistent variables without JIT (#149642)

This patch fixes updating persistent variables when memory cannot be
allocated in an inferior process:
```
> lldb -c test.core
(lldb) expr int $i = 5
(lldb) expr $i = 55
(int) $0 = 55
(lldb) expr $i
(int) $i = 5
```

With this patch, the last command prints:
```
(int) $i = 55
```

The issue was introduced in #145599.
This commit is contained in:
Igor Kudrin
2025-07-30 12:54:15 -07:00
committed by GitHub
parent a7ac43125e
commit e4c0f30030
2 changed files with 15 additions and 10 deletions

View File

@@ -102,22 +102,23 @@ public:
m_persistent_variable_sp->GetName(), mem, eAddressTypeLoad,
map.GetAddressByteSize());
if (m_persistent_variable_sp->m_flags &
ExpressionVariable::EVKeepInTarget) {
if (used_policy == IRMemoryMap::eAllocationPolicyMirror) {
if (used_policy == IRMemoryMap::eAllocationPolicyMirror) {
if (m_persistent_variable_sp->m_flags &
ExpressionVariable::EVKeepInTarget) {
// Clear the flag if the variable will never be deallocated.
Status leak_error;
map.Leak(mem, leak_error);
m_persistent_variable_sp->m_flags &=
~ExpressionVariable::EVNeedsAllocation;
} else {
// If the variable cannot be kept in target, clear this flag...
m_persistent_variable_sp->m_flags &=
~ExpressionVariable::EVKeepInTarget;
// ...and set the flag to copy the value during dematerialization.
m_persistent_variable_sp->m_flags |=
ExpressionVariable::EVNeedsFreezeDry;
}
} else {
// If we cannot allocate memory in the process,
// - clear the 'EVKeepInTarget' flag to ensure that 'm_live_sp' is reset
// during dematerialization,
m_persistent_variable_sp->m_flags &= ~ExpressionVariable::EVKeepInTarget;
// - set the 'EVNeedsFreezeDry' flag so that the value is copied to
// 'm_frozen_sp' during dematerialization.
m_persistent_variable_sp->m_flags |= ExpressionVariable::EVNeedsFreezeDry;
}
// Write the contents of the variable to the area.

View File

@@ -37,6 +37,10 @@ class CoreExprTestCase(TestBase):
self.target.EvaluateExpression("int $my_int = 5")
self.expect_expr("$my_int * 2", result_type="int", result_value="10")
# Try assigning the persistent variable a new value.
self.target.EvaluateExpression("$my_int = 55")
self.expect_expr("$my_int", result_type="int", result_value="55")
def test_context_object(self):
"""Test expression evaluation in context of an object."""