Fixed a problem where constant results of expressions

were not being created in the proper way, meaning
results were getting lost.

llvm-svn: 122800
This commit is contained in:
Sean Callanan 2011-01-04 02:41:41 +00:00
parent 857591143e
commit e4f98722be
1 changed files with 29 additions and 32 deletions

View File

@ -129,7 +129,6 @@ ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
{ {
assert (m_parser_vars.get()); assert (m_parser_vars.get());
clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext()); clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext());
TypeFromUser user_type(ClangASTContext::CopyType(context, TypeFromUser user_type(ClangASTContext::CopyType(context,
@ -137,25 +136,32 @@ ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
type.GetOpaqueQualType()), type.GetOpaqueQualType()),
context); context);
DataBufferHeap *heap_data_buf = new DataBufferHeap(ClangASTType::GetClangTypeBitWidth(user_type.GetASTContext(), if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (name,
user_type.GetOpaqueQualType()) / 8, user_type,
'\0'); m_parser_vars->m_exe_ctx->process->GetByteOrder(),
m_parser_vars->m_exe_ctx->process->GetAddressByteSize()))
return lldb::ClangExpressionVariableSP();
DataBufferSP data_sp(heap_data_buf); ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
if (!pvar_sp)
return lldb::ClangExpressionVariableSP();
uint8_t *pvar_data = pvar_sp->GetValueBytes();
if (pvar_data == NULL)
return lldb::ClangExpressionVariableSP();
uint64_t value64 = value.getLimitedValue(); uint64_t value64 = value.getLimitedValue();
ByteOrder byte_order = m_parser_vars->m_exe_ctx->process->GetByteOrder(); ByteOrder byte_order = m_parser_vars->m_exe_ctx->process->GetByteOrder();
size_t num_val_bytes = sizeof(value64); size_t num_val_bytes = sizeof(value64);
size_t num_data_bytes = heap_data_buf->GetByteSize(); size_t num_data_bytes = pvar_sp->GetByteSize();
size_t num_bytes = num_val_bytes; size_t num_bytes = num_val_bytes;
if (num_bytes > num_data_bytes) if (num_bytes > num_data_bytes)
num_bytes = num_data_bytes; num_bytes = num_data_bytes;
uint8_t *data_bytes = heap_data_buf->GetBytes();
for (off_t byte_idx = 0; for (off_t byte_idx = 0;
byte_idx < num_bytes; byte_idx < num_bytes;
++byte_idx) ++byte_idx)
@ -171,27 +177,18 @@ ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
// Original: |AABBCCDDEEFFGGHH| // Original: |AABBCCDDEEFFGGHH|
// Target: |EEFFGGHH| // Target: |EEFFGGHH|
data_bytes[num_data_bytes - (1 + byte_idx)] = cur_byte; pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
break; break;
case eByteOrderLittle: case eByteOrderLittle:
// Target: |HHGGFFEE| // Target: |HHGGFFEE|
data_bytes[byte_idx] = cur_byte; pvar_data[byte_idx] = cur_byte;
break; break;
default: default:
return lldb::ClangExpressionVariableSP(); return lldb::ClangExpressionVariableSP();
} }
} }
ValueObjectSP valobj_sp(new ValueObjectConstResult(user_type.GetASTContext(), return pvar_sp;
user_type.GetOpaqueQualType(),
name,
data_sp,
m_parser_vars->m_exe_ctx->process->GetByteOrder(),
m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
ClangExpressionVariableSP var_sp(new ClangExpressionVariable(valobj_sp));
return var_sp;
} }
bool bool