diff options
author | Sean Callanan <scallanan@apple.com> | 2011-05-09 22:04:36 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2011-05-09 22:04:36 +0000 |
commit | e359d9b771d8524b64a874bcb86ebac4c1a127be (patch) | |
tree | 51f0f45f09c46b6e2959c8f04008c2ac1f2c8a52 /lldb/source/Expression/ClangExpressionDeclMap.cpp | |
parent | 7adbed6b4da6cf5e91ceb0fbd0a0a7c78f3e13be (diff) | |
download | bcm5719-llvm-e359d9b771d8524b64a874bcb86ebac4c1a127be.tar.gz bcm5719-llvm-e359d9b771d8524b64a874bcb86ebac4c1a127be.zip |
Fixed a bug in which expression-local variables were
treated as being permanently resident in target
memory. In fact, since the expression's stack frame
is deleted and potentially re-used after the
expression completes, the variables need to be treated
as being freeze-dried.
llvm-svn: 131104
Diffstat (limited to 'lldb/source/Expression/ClangExpressionDeclMap.cpp')
-rw-r--r-- | lldb/source/Expression/ClangExpressionDeclMap.cpp | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index 3540a4d0783..6c7b2a87dff 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -588,7 +588,12 @@ ClangExpressionDeclMap::Materialize m_material_vars->m_process = exe_ctx.process; - bool result = DoMaterialize(false /* dematerialize */, exe_ctx, NULL, err); + bool result = DoMaterialize(false /* dematerialize */, + exe_ctx, + LLDB_INVALID_ADDRESS /* top of stack frame */, + LLDB_INVALID_ADDRESS /* bottom of stack frame */, + NULL, /* result SP */ + err); if (result) struct_address = m_material_vars->m_materialized_location; @@ -717,10 +722,12 @@ ClangExpressionDeclMap::Dematerialize ( ExecutionContext &exe_ctx, ClangExpressionVariableSP &result_sp, + lldb::addr_t stack_frame_top, + lldb::addr_t stack_frame_bottom, Error &err ) { - return DoMaterialize(true, exe_ctx, &result_sp, err); + return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err); DidDematerialize(); } @@ -825,6 +832,8 @@ ClangExpressionDeclMap::DoMaterialize ( bool dematerialize, ExecutionContext &exe_ctx, + lldb::addr_t stack_frame_top, + lldb::addr_t stack_frame_bottom, lldb::ClangExpressionVariableSP *result_sp_ptr, Error &err ) @@ -948,7 +957,9 @@ ClangExpressionDeclMap::DoMaterialize if (!DoMaterializeOnePersistentVariable (dematerialize, exe_ctx, member_sp, - m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, + m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, + stack_frame_top, + stack_frame_bottom, err)) return false; } @@ -1027,6 +1038,8 @@ ClangExpressionDeclMap::DoMaterializeOnePersistentVariable ExecutionContext &exe_ctx, ClangExpressionVariableSP &var_sp, lldb::addr_t addr, + lldb::addr_t stack_frame_top, + lldb::addr_t stack_frame_bottom, Error &err ) { @@ -1103,10 +1116,7 @@ ClangExpressionDeclMap::DoMaterializeOnePersistentVariable log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); // Read the contents of the spare memory area - - if (log) - log->Printf("Read"); - + var_sp->ValueUpdated (); if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) { @@ -1114,6 +1124,20 @@ ClangExpressionDeclMap::DoMaterializeOnePersistentVariable return false; } + if (stack_frame_top != LLDB_INVALID_ADDRESS && + stack_frame_bottom != LLDB_INVALID_ADDRESS && + mem >= stack_frame_bottom && + mem <= stack_frame_top) + { + // If the variable is resident in the stack frame created by the expression, + // then it cannot be relied upon to stay around. We treat it as needing + // reallocation. + + var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; + var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; + var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference; + } + var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; } |