| //===-- ClangExpressionVariable.cpp -----------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "lldb/Expression/ClangExpressionVariable.h" |
| |
| // C Includes |
| // C++ Includes |
| // Other libraries and framework includes |
| // Project includes |
| #include "clang/AST/ASTContext.h" |
| #include "lldb/Core/ConstString.h" |
| #include "lldb/Core/DataExtractor.h" |
| #include "lldb/Core/Stream.h" |
| #include "lldb/Core/Value.h" |
| #include "lldb/Core/ValueObjectConstResult.h" |
| #include "lldb/Target/ExecutionContext.h" |
| #include "lldb/Target/Process.h" |
| |
| using namespace lldb_private; |
| using namespace clang; |
| |
| ClangExpressionVariable::ClangExpressionVariable() : |
| m_name(), |
| m_user_type (TypeFromUser(NULL, NULL)), |
| m_store (NULL), |
| m_index (0), |
| m_parser_vars(), |
| m_jit_vars (), |
| m_data_sp () |
| { |
| } |
| |
| void |
| ClangExpressionVariable::DisableDataVars() |
| { |
| m_data_sp.reset(); |
| } |
| |
| |
| ClangExpressionVariable::ClangExpressionVariable(const ClangExpressionVariable &rhs) : |
| m_name(rhs.m_name), |
| m_user_type(rhs.m_user_type), |
| m_store(rhs.m_store), |
| m_index(rhs.m_index) |
| { |
| if (rhs.m_parser_vars.get()) |
| { |
| // TODO: Sean, can m_parser_vars be a shared pointer??? We are copy |
| // constructing it here. That is ok if we need to, but do we really |
| // need to? |
| m_parser_vars.reset(new struct ParserVars); |
| *m_parser_vars.get() = *rhs.m_parser_vars.get(); |
| } |
| |
| if (rhs.m_jit_vars.get()) |
| { |
| // TODO: Sean, can m_jit_vars be a shared pointer??? We are copy |
| // constructing it here. That is ok if we need to, but do we really |
| // need to? |
| m_jit_vars.reset(new struct JITVars); |
| *m_jit_vars.get() = *rhs.m_jit_vars.get(); |
| } |
| |
| if (rhs.m_data_sp) |
| { |
| // TODO: Sean, does m_data_sp need to be copy constructed? Or can it |
| // shared the data? |
| |
| m_data_sp.reset(new DataBufferHeap (rhs.m_data_sp->GetBytes(), |
| rhs.m_data_sp->GetByteSize())); |
| } |
| } |
| |
| bool |
| ClangExpressionVariable::PointValueAtData(Value &value, ExecutionContext *exe_ctx) |
| { |
| if (m_data_sp.get() == NULL) |
| return false; |
| |
| value.SetContext(Value::eContextTypeOpaqueClangQualType, m_user_type.GetOpaqueQualType()); |
| value.SetValueType(Value::eValueTypeHostAddress); |
| value.GetScalar() = (uintptr_t)m_data_sp->GetBytes(); |
| clang::ASTContext *ast_context = m_user_type.GetASTContext(); |
| |
| if (exe_ctx) |
| value.ResolveValue (exe_ctx, ast_context); |
| |
| return true; |
| } |
| |
| void |
| ClangExpressionVariable::EnableDataVars() |
| { |
| if (!m_data_sp.get()) |
| m_data_sp.reset(new DataBufferHeap); |
| } |
| |
| lldb::ValueObjectSP |
| ClangExpressionVariable::GetExpressionResult (ExecutionContext *exe_ctx) |
| { |
| lldb::ValueObjectSP result_sp; |
| if (m_data_sp) |
| { |
| Target * target = NULL; |
| Process *process = NULL; |
| if (exe_ctx) |
| { |
| target = exe_ctx->target; |
| process = exe_ctx->process; |
| } |
| |
| Value value; |
| if (PointValueAtData(value, exe_ctx)) |
| { |
| lldb::ByteOrder byte_order = lldb::eByteOrderHost; |
| uint32_t addr_byte_size = 4; |
| if (process) |
| { |
| byte_order = process->GetByteOrder(); |
| addr_byte_size = process->GetAddressByteSize(); |
| } |
| result_sp.reset (new ValueObjectConstResult (m_user_type.GetASTContext(), |
| m_user_type.GetOpaqueQualType(), |
| ConstString (m_name.c_str()), |
| m_data_sp,// TODO: sean can you get this to be valid? |
| byte_order, |
| addr_byte_size)); |
| } |
| } |
| return result_sp; |
| } |
| |