1 //===-- ClangExpressionVariable.cpp -----------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "ClangExpressionVariable.h"
11 
12 #include "clang/AST/ASTContext.h"
13 #include "lldb/Core/ConstString.h"
14 #include "lldb/Core/DataExtractor.h"
15 #include "lldb/Core/Stream.h"
16 #include "lldb/Core/Value.h"
17 #include "lldb/Core/ValueObjectConstResult.h"
18 #include "lldb/Target/ExecutionContext.h"
19 #include "lldb/Target/Process.h"
20 
21 using namespace lldb_private;
22 using namespace clang;
23 
24 const char *g_clang_expression_variable_kind_name = "ClangExpressionVariable";
25 
26 ClangExpressionVariable::ClangExpressionVariable(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size) :
27     m_parser_vars(),
28     m_jit_vars (),
29     m_flags (EVNone),
30     m_frozen_sp (ValueObjectConstResult::Create (exe_scope, byte_order, addr_byte_size))
31 {
32 }
33 
34 ClangExpressionVariable::ClangExpressionVariable (ExecutionContextScope *exe_scope,
35                                                   Value &value,
36                                                   const ConstString &name,
37                                                   uint16_t flags) :
38     m_parser_vars(),
39     m_jit_vars (),
40     m_flags (flags),
41     m_frozen_sp (ValueObjectConstResult::Create (exe_scope, value, name))
42 {
43 }
44 
45 ClangExpressionVariable::ClangExpressionVariable (const lldb::ValueObjectSP &valobj_sp) :
46     m_parser_vars(),
47     m_jit_vars (),
48     m_flags (EVNone),
49     m_frozen_sp (valobj_sp)
50 {
51 }
52 
53 //----------------------------------------------------------------------
54 /// Return the variable's size in bytes
55 //----------------------------------------------------------------------
56 size_t
57 ClangExpressionVariable::GetByteSize ()
58 {
59     return m_frozen_sp->GetByteSize();
60 }
61 
62 const ConstString &
63 ClangExpressionVariable::GetName ()
64 {
65     return m_frozen_sp->GetName();
66 }
67 
68 lldb::ValueObjectSP
69 ClangExpressionVariable::GetValueObject()
70 {
71     return m_frozen_sp;
72 }
73 
74 RegisterInfo *
75 ClangExpressionVariable::GetRegisterInfo()
76 {
77     return m_frozen_sp->GetValue().GetRegisterInfo();
78 }
79 
80 void
81 ClangExpressionVariable::SetRegisterInfo (const RegisterInfo *reg_info)
82 {
83     return m_frozen_sp->GetValue().SetContext (Value::eContextTypeRegisterInfo, const_cast<RegisterInfo *>(reg_info));
84 }
85 
86 CompilerType
87 ClangExpressionVariable::GetCompilerType()
88 {
89     return m_frozen_sp->GetCompilerType();
90 }
91 
92 void
93 ClangExpressionVariable::SetCompilerType(const CompilerType &clang_type)
94 {
95     m_frozen_sp->GetValue().SetCompilerType(clang_type);
96 }
97 
98 
99 TypeFromUser
100 ClangExpressionVariable::GetTypeFromUser()
101 {
102     TypeFromUser tfu (m_frozen_sp->GetCompilerType());
103     return tfu;
104 }
105 
106 uint8_t *
107 ClangExpressionVariable::GetValueBytes()
108 {
109     const size_t byte_size = m_frozen_sp->GetByteSize();
110     if (byte_size > 0)
111     {
112         if (m_frozen_sp->GetDataExtractor().GetByteSize() < byte_size)
113         {
114             m_frozen_sp->GetValue().ResizeData(byte_size);
115             m_frozen_sp->GetValue().GetData (m_frozen_sp->GetDataExtractor());
116         }
117         return const_cast<uint8_t *>(m_frozen_sp->GetDataExtractor().GetDataStart());
118     }
119     return NULL;
120 }
121 
122 void
123 ClangExpressionVariable::SetName (const ConstString &name)
124 {
125     m_frozen_sp->SetName (name);
126 }
127 
128 void
129 ClangExpressionVariable::ValueUpdated ()
130 {
131     m_frozen_sp->ValueUpdated ();
132 }
133 
134 void
135 ClangExpressionVariable::TransferAddress (bool force)
136 {
137     if (m_live_sp.get() == NULL)
138         return;
139 
140     if (m_frozen_sp.get() == NULL)
141         return;
142 
143     if (force || (m_frozen_sp->GetLiveAddress() == LLDB_INVALID_ADDRESS))
144         m_frozen_sp->SetLiveAddress(m_live_sp->GetLiveAddress());
145 }
146