mirror of
https://github.com/intel/llvm.git
synced 2026-01-13 19:08:21 +08:00
[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:
@@ -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.
|
||||
|
||||
@@ -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."""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user