1254721Semaste//===-- ClangExpressionVariable.cpp -----------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/Expression/ClangExpressionVariable.h"
11254721Semaste
12254721Semaste// C Includes
13254721Semaste// C++ Includes
14254721Semaste// Other libraries and framework includes
15254721Semaste// Project includes
16254721Semaste#include "clang/AST/ASTContext.h"
17254721Semaste#include "lldb/Core/ConstString.h"
18254721Semaste#include "lldb/Core/DataExtractor.h"
19254721Semaste#include "lldb/Core/Stream.h"
20254721Semaste#include "lldb/Core/Value.h"
21254721Semaste#include "lldb/Core/ValueObjectConstResult.h"
22254721Semaste#include "lldb/Target/ExecutionContext.h"
23254721Semaste#include "lldb/Target/Process.h"
24254721Semaste
25254721Semasteusing namespace lldb_private;
26254721Semasteusing namespace clang;
27254721Semaste
28254721SemasteClangExpressionVariable::ClangExpressionVariable(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size) :
29254721Semaste    m_parser_vars(),
30254721Semaste    m_jit_vars (),
31254721Semaste    m_flags (EVNone),
32254721Semaste    m_frozen_sp (ValueObjectConstResult::Create (exe_scope, byte_order, addr_byte_size))
33254721Semaste{
34254721Semaste}
35254721Semaste
36254721SemasteClangExpressionVariable::ClangExpressionVariable (const lldb::ValueObjectSP &valobj_sp) :
37254721Semaste    m_parser_vars(),
38254721Semaste    m_jit_vars (),
39254721Semaste    m_flags (EVNone),
40254721Semaste    m_frozen_sp (valobj_sp)
41254721Semaste{
42254721Semaste}
43254721Semaste
44254721Semaste//----------------------------------------------------------------------
45254721Semaste/// Return the variable's size in bytes
46254721Semaste//----------------------------------------------------------------------
47254721Semastesize_t
48254721SemasteClangExpressionVariable::GetByteSize ()
49254721Semaste{
50254721Semaste    return m_frozen_sp->GetByteSize();
51254721Semaste}
52254721Semaste
53254721Semasteconst ConstString &
54254721SemasteClangExpressionVariable::GetName ()
55254721Semaste{
56254721Semaste    return m_frozen_sp->GetName();
57254721Semaste}
58254721Semaste
59254721Semastelldb::ValueObjectSP
60254721SemasteClangExpressionVariable::GetValueObject()
61254721Semaste{
62254721Semaste    return m_frozen_sp;
63254721Semaste}
64254721Semaste
65254721SemasteRegisterInfo *
66254721SemasteClangExpressionVariable::GetRegisterInfo()
67254721Semaste{
68254721Semaste    return m_frozen_sp->GetValue().GetRegisterInfo();
69254721Semaste}
70254721Semaste
71254721Semastevoid
72254721SemasteClangExpressionVariable::SetRegisterInfo (const RegisterInfo *reg_info)
73254721Semaste{
74254721Semaste    return m_frozen_sp->GetValue().SetContext (Value::eContextTypeRegisterInfo, const_cast<RegisterInfo *>(reg_info));
75254721Semaste}
76254721Semaste
77254721SemasteClangASTType
78254721SemasteClangExpressionVariable::GetClangType()
79254721Semaste{
80254721Semaste    return m_frozen_sp->GetClangType();
81254721Semaste}
82254721Semaste
83254721Semastevoid
84254721SemasteClangExpressionVariable::SetClangType(const ClangASTType &clang_type)
85254721Semaste{
86254721Semaste    m_frozen_sp->GetValue().SetClangType(clang_type);
87254721Semaste}
88254721Semaste
89254721Semaste
90254721SemasteTypeFromUser
91254721SemasteClangExpressionVariable::GetTypeFromUser()
92254721Semaste{
93254721Semaste    TypeFromUser tfu (m_frozen_sp->GetClangType());
94254721Semaste    return tfu;
95254721Semaste}
96254721Semaste
97254721Semasteuint8_t *
98254721SemasteClangExpressionVariable::GetValueBytes()
99254721Semaste{
100254721Semaste    const size_t byte_size = m_frozen_sp->GetByteSize();
101254721Semaste    if (byte_size > 0)
102254721Semaste    {
103254721Semaste        if (m_frozen_sp->GetDataExtractor().GetByteSize() < byte_size)
104254721Semaste        {
105254721Semaste            m_frozen_sp->GetValue().ResizeData(byte_size);
106254721Semaste            m_frozen_sp->GetValue().GetData (m_frozen_sp->GetDataExtractor());
107254721Semaste        }
108254721Semaste        return const_cast<uint8_t *>(m_frozen_sp->GetDataExtractor().GetDataStart());
109254721Semaste    }
110254721Semaste    return NULL;
111254721Semaste}
112254721Semaste
113254721Semastevoid
114254721SemasteClangExpressionVariable::SetName (const ConstString &name)
115254721Semaste{
116254721Semaste    m_frozen_sp->SetName (name);
117254721Semaste}
118254721Semaste
119254721Semastevoid
120254721SemasteClangExpressionVariable::ValueUpdated ()
121254721Semaste{
122254721Semaste    m_frozen_sp->ValueUpdated ();
123254721Semaste}
124254721Semaste
125254721Semastevoid
126254721SemasteClangExpressionVariable::TransferAddress (bool force)
127254721Semaste{
128254721Semaste    if (m_live_sp.get() == NULL)
129254721Semaste        return;
130254721Semaste
131254721Semaste    if (m_frozen_sp.get() == NULL)
132254721Semaste        return;
133254721Semaste
134254721Semaste    if (force || (m_frozen_sp->GetLiveAddress() == LLDB_INVALID_ADDRESS))
135254721Semaste        m_frozen_sp->SetLiveAddress(m_live_sp->GetLiveAddress());
136254721Semaste}
137