blob: 7b3dbf2f30769f45480c9615db3cf92749d3fc4e [file] [log] [blame]
Jim Inghame41494a2011-04-16 00:01:13 +00001//===-- ValueObjectMemory.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
11#include "lldb/Core/ValueObjectMemory.h"
12
13// C Includes
14// C++ Includes
15// Other libraries and framework includes
16// Project includes
17#include "lldb/Core/Module.h"
18#include "lldb/Core/ValueObjectList.h"
19#include "lldb/Core/Value.h"
20#include "lldb/Core/ValueObject.h"
21
22#include "lldb/Symbol/ObjectFile.h"
23#include "lldb/Symbol/SymbolContext.h"
24#include "lldb/Symbol/Type.h"
25#include "lldb/Symbol/Variable.h"
26
27#include "lldb/Target/ExecutionContext.h"
28#include "lldb/Target/Process.h"
29#include "lldb/Target/RegisterContext.h"
30#include "lldb/Target/Target.h"
31#include "lldb/Target/Thread.h"
32
Jim Ingham47da8102011-04-22 23:53:53 +000033using namespace lldb;
Jim Inghame41494a2011-04-16 00:01:13 +000034using namespace lldb_private;
35
Jim Ingham47da8102011-04-22 23:53:53 +000036ValueObjectSP
37ValueObjectMemory::Create (ExecutionContextScope *exe_scope,
38 const char *name,
39 const Address &address,
40 lldb::TypeSP &type_sp)
41{
42 return (new ValueObjectMemory (exe_scope, name, address, type_sp))->GetSP();
43}
44
Greg Clayton57b3c6b2011-04-27 22:04:39 +000045ValueObjectSP
46ValueObjectMemory::Create (ExecutionContextScope *exe_scope,
47 const char *name,
48 const Address &address,
49 const ClangASTType &ast_type)
50{
51 return (new ValueObjectMemory (exe_scope, name, address, ast_type))->GetSP();
52}
53
Jim Inghame41494a2011-04-16 00:01:13 +000054ValueObjectMemory::ValueObjectMemory (ExecutionContextScope *exe_scope,
55 const char *name,
56 const Address &address,
57 lldb::TypeSP &type_sp) :
58 ValueObject(exe_scope),
59 m_address (address),
Greg Clayton57b3c6b2011-04-27 22:04:39 +000060 m_type_sp(type_sp),
61 m_clang_type()
Jim Inghame41494a2011-04-16 00:01:13 +000062{
63 // Do not attempt to construct one of these objects with no variable!
64 assert (m_type_sp.get() != NULL);
Enrico Granata979e20d2011-07-29 19:53:35 +000065 SetName (ConstString(name));
Jim Inghame41494a2011-04-16 00:01:13 +000066 m_value.SetContext(Value::eContextTypeLLDBType, m_type_sp.get());
Greg Claytonb4d7fc02012-02-17 07:49:44 +000067 TargetSP target_sp (GetTargetSP());
68 lldb::addr_t load_address = m_address.GetLoadAddress(target_sp.get());
Jim Inghame41494a2011-04-16 00:01:13 +000069 if (load_address != LLDB_INVALID_ADDRESS)
70 {
71 m_value.SetValueType(Value::eValueTypeLoadAddress);
72 m_value.GetScalar() = load_address;
73 }
74 else
75 {
76 lldb::addr_t file_address = m_address.GetFileAddress();
77 if (file_address != LLDB_INVALID_ADDRESS)
78 {
79 m_value.SetValueType(Value::eValueTypeFileAddress);
80 m_value.GetScalar() = file_address;
81 }
82 else
83 {
84 m_value.GetScalar() = m_address.GetOffset();
85 m_value.SetValueType (Value::eValueTypeScalar);
86 }
87 }
88}
89
Greg Clayton57b3c6b2011-04-27 22:04:39 +000090ValueObjectMemory::ValueObjectMemory (ExecutionContextScope *exe_scope,
91 const char *name,
92 const Address &address,
93 const ClangASTType &ast_type) :
94 ValueObject(exe_scope),
95 m_address (address),
96 m_type_sp(),
97 m_clang_type(ast_type)
98{
99 // Do not attempt to construct one of these objects with no variable!
100 assert (m_clang_type.GetASTContext());
101 assert (m_clang_type.GetOpaqueQualType());
102
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000103 TargetSP target_sp (GetTargetSP());
104
Enrico Granata979e20d2011-07-29 19:53:35 +0000105 SetName (ConstString(name));
Greg Clayton57b3c6b2011-04-27 22:04:39 +0000106 m_value.SetContext(Value::eContextTypeClangType, m_clang_type.GetOpaqueQualType());
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000107 lldb::addr_t load_address = m_address.GetLoadAddress (target_sp.get());
Greg Clayton57b3c6b2011-04-27 22:04:39 +0000108 if (load_address != LLDB_INVALID_ADDRESS)
109 {
110 m_value.SetValueType(Value::eValueTypeLoadAddress);
111 m_value.GetScalar() = load_address;
112 }
113 else
114 {
115 lldb::addr_t file_address = m_address.GetFileAddress();
116 if (file_address != LLDB_INVALID_ADDRESS)
117 {
118 m_value.SetValueType(Value::eValueTypeFileAddress);
119 m_value.GetScalar() = file_address;
120 }
121 else
122 {
123 m_value.GetScalar() = m_address.GetOffset();
124 m_value.SetValueType (Value::eValueTypeScalar);
125 }
126 }
127}
128
Jim Inghame41494a2011-04-16 00:01:13 +0000129ValueObjectMemory::~ValueObjectMemory()
130{
131}
132
133lldb::clang_type_t
Sean Callanan931acec2012-02-22 23:57:45 +0000134ValueObjectMemory::GetClangTypeImpl ()
Jim Inghame41494a2011-04-16 00:01:13 +0000135{
Greg Clayton57b3c6b2011-04-27 22:04:39 +0000136 if (m_type_sp)
137 return m_type_sp->GetClangForwardType();
138 return m_clang_type.GetOpaqueQualType();
Jim Inghame41494a2011-04-16 00:01:13 +0000139}
140
141ConstString
142ValueObjectMemory::GetTypeName()
143{
Greg Clayton57b3c6b2011-04-27 22:04:39 +0000144 if (m_type_sp)
145 return m_type_sp->GetName();
Greg Claytondc0a38c2012-03-26 23:03:23 +0000146 return ClangASTType::GetConstTypeName (GetClangAST(), m_clang_type.GetOpaqueQualType());
Jim Inghame41494a2011-04-16 00:01:13 +0000147}
148
149uint32_t
150ValueObjectMemory::CalculateNumChildren()
151{
Greg Clayton57b3c6b2011-04-27 22:04:39 +0000152 if (m_type_sp)
153 return m_type_sp->GetNumChildren(true);
154 const bool omit_empty_base_classes = true;
155 return ClangASTContext::GetNumChildren (m_clang_type.GetASTContext(),
156 m_clang_type.GetOpaqueQualType(),
157 omit_empty_base_classes);
Jim Inghame41494a2011-04-16 00:01:13 +0000158}
159
160clang::ASTContext *
Sean Callanan931acec2012-02-22 23:57:45 +0000161ValueObjectMemory::GetClangASTImpl ()
Jim Inghame41494a2011-04-16 00:01:13 +0000162{
Greg Clayton57b3c6b2011-04-27 22:04:39 +0000163 if (m_type_sp)
164 return m_type_sp->GetClangAST();
165 return m_clang_type.GetASTContext();
Jim Inghame41494a2011-04-16 00:01:13 +0000166}
167
168size_t
169ValueObjectMemory::GetByteSize()
170{
Greg Clayton57b3c6b2011-04-27 22:04:39 +0000171 if (m_type_sp)
172 return m_type_sp->GetByteSize();
173 return (m_clang_type.GetClangTypeBitWidth () + 7) / 8;
Jim Inghame41494a2011-04-16 00:01:13 +0000174}
175
176lldb::ValueType
177ValueObjectMemory::GetValueType() const
178{
179 // RETHINK: Should this be inherited from somewhere?
180 return lldb::eValueTypeVariableGlobal;
181}
182
183bool
184ValueObjectMemory::UpdateValue ()
185{
186 SetValueIsValid (false);
187 m_error.Clear();
188
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000189 ExecutionContext exe_ctx (GetExecutionContextRef());
Jim Inghame41494a2011-04-16 00:01:13 +0000190
Greg Clayton567e7f32011-09-22 04:58:26 +0000191 Target *target = exe_ctx.GetTargetPtr();
192 if (target)
Jim Inghame41494a2011-04-16 00:01:13 +0000193 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000194 m_data.SetByteOrder(target->GetArchitecture().GetByteOrder());
195 m_data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
Jim Inghame41494a2011-04-16 00:01:13 +0000196 }
197
198 Value old_value(m_value);
199 if (m_address.IsValid())
200 {
201 Value::ValueType value_type = m_value.GetValueType();
202
203 switch (value_type)
204 {
205 default:
206 assert(!"Unhandled expression result value kind...");
207 break;
208
209 case Value::eValueTypeScalar:
210 // The variable value is in the Scalar value inside the m_value.
211 // We can point our m_data right to it.
Greg Clayton3508c382012-02-24 01:59:29 +0000212 m_error = m_value.GetValueAsData (&exe_ctx, GetClangAST(), m_data, 0, GetModule().get());
Jim Inghame41494a2011-04-16 00:01:13 +0000213 break;
214
215 case Value::eValueTypeFileAddress:
216 case Value::eValueTypeLoadAddress:
217 case Value::eValueTypeHostAddress:
218 // The DWARF expression result was an address in the inferior
219 // process. If this variable is an aggregate type, we just need
220 // the address as the main value as all child variable objects
221 // will rely upon this location and add an offset and then read
222 // their own values as needed. If this variable is a simple
223 // type, we read all data for it into m_data.
224 // Make sure this type has a value before we try and read it
225
226 // If we have a file address, convert it to a load address if we can.
Greg Clayton567e7f32011-09-22 04:58:26 +0000227 if (value_type == Value::eValueTypeFileAddress && exe_ctx.GetProcessPtr())
Jim Inghame41494a2011-04-16 00:01:13 +0000228 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000229 lldb::addr_t load_addr = m_address.GetLoadAddress(target);
Jim Inghame41494a2011-04-16 00:01:13 +0000230 if (load_addr != LLDB_INVALID_ADDRESS)
231 {
232 m_value.SetValueType(Value::eValueTypeLoadAddress);
233 m_value.GetScalar() = load_addr;
234 }
235 }
236
237 if (ClangASTContext::IsAggregateType (GetClangType()))
238 {
239 // this value object represents an aggregate type whose
240 // children have values, but this object does not. So we
241 // say we are changed if our location has changed.
242 SetValueDidChange (value_type != old_value.GetValueType() || m_value.GetScalar() != old_value.GetScalar());
243 }
244 else
245 {
246 // Copy the Value and set the context to use our Variable
247 // so it can extract read its value into m_data appropriately
248 Value value(m_value);
Greg Clayton57b3c6b2011-04-27 22:04:39 +0000249 if (m_type_sp)
250 value.SetContext(Value::eContextTypeLLDBType, m_type_sp.get());
251 else
252 value.SetContext(Value::eContextTypeClangType, m_clang_type.GetOpaqueQualType());
253
Greg Clayton3508c382012-02-24 01:59:29 +0000254 m_error = value.GetValueAsData(&exe_ctx, GetClangAST(), m_data, 0, GetModule().get());
Jim Inghame41494a2011-04-16 00:01:13 +0000255 }
256 break;
257 }
258
259 SetValueIsValid (m_error.Success());
260 }
261 return m_error.Success();
262}
263
264
265
266bool
267ValueObjectMemory::IsInScope ()
268{
269 // FIXME: Maybe try to read the memory address, and if that works, then
270 // we are in scope?
271 return true;
272}
273
Greg Clayton801417e2011-07-07 01:59:51 +0000274
Greg Clayton3508c382012-02-24 01:59:29 +0000275lldb::ModuleSP
Greg Clayton801417e2011-07-07 01:59:51 +0000276ValueObjectMemory::GetModule()
277{
Greg Clayton3508c382012-02-24 01:59:29 +0000278 return m_address.GetModule();
Greg Clayton801417e2011-07-07 01:59:51 +0000279}
280
281