blob: cebd380f181e19b7d16abef466e6721ef48a2f3a [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- Value.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 "lldb/Core/Value.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
16#include "lldb/Core/DataExtractor.h"
17#include "lldb/Core/DataBufferHeap.h"
18#include "lldb/Core/Module.h"
Johnny Chen3c49d4c2012-02-02 22:11:13 +000019#include "lldb/Core/State.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Core/Stream.h"
Greg Clayton1674b122010-07-21 22:12:05 +000021#include "lldb/Symbol/ClangASTType.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Symbol/ClangASTContext.h"
23#include "lldb/Symbol/ObjectFile.h"
24#include "lldb/Symbol/SymbolContext.h"
25#include "lldb/Symbol/Type.h"
26#include "lldb/Symbol/Variable.h"
27#include "lldb/Target/ExecutionContext.h"
28#include "lldb/Target/Process.h"
Greg Clayton395fc332011-02-15 21:59:32 +000029#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000030
31using namespace lldb;
32using namespace lldb_private;
33
34Value::Value() :
Greg Clayton801417e2011-07-07 01:59:51 +000035 m_value (),
36 m_value_type (eValueTypeScalar),
37 m_context (NULL),
38 m_context_type (eContextTypeInvalid),
39 m_data_buffer ()
Chris Lattner24943d22010-06-08 16:52:24 +000040{
41}
42
43Value::Value(const Scalar& scalar) :
Greg Clayton801417e2011-07-07 01:59:51 +000044 m_value (scalar),
45 m_value_type (eValueTypeScalar),
46 m_context (NULL),
47 m_context_type (eContextTypeInvalid),
48 m_data_buffer ()
Chris Lattner24943d22010-06-08 16:52:24 +000049{
50}
51
Chris Lattner24943d22010-06-08 16:52:24 +000052
53Value::Value(const uint8_t *bytes, int len) :
Greg Clayton801417e2011-07-07 01:59:51 +000054 m_value (),
55 m_value_type (eValueTypeHostAddress),
56 m_context (NULL),
57 m_context_type (eContextTypeInvalid),
58 m_data_buffer ()
Chris Lattner24943d22010-06-08 16:52:24 +000059{
60 m_data_buffer.CopyData(bytes, len);
61 m_value = (uintptr_t)m_data_buffer.GetBytes();
62}
63
64Value::Value(const Value &v) :
65 m_value(v.m_value),
66 m_value_type(v.m_value_type),
67 m_context(v.m_context),
68 m_context_type(v.m_context_type)
69{
70 if ((uintptr_t)v.m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)v.m_data_buffer.GetBytes())
71 {
72 m_data_buffer.CopyData(v.m_data_buffer.GetBytes(),
73 v.m_data_buffer.GetByteSize());
74
75 m_value = (uintptr_t)m_data_buffer.GetBytes();
76 }
77}
78
Greg Claytonbdcb6ab2011-01-25 23:55:37 +000079Value &
80Value::operator=(const Value &rhs)
81{
82 if (this != &rhs)
83 {
84 m_value = rhs.m_value;
85 m_value_type = rhs.m_value_type;
86 m_context = rhs.m_context;
87 m_context_type = rhs.m_context_type;
88 if ((uintptr_t)rhs.m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)rhs.m_data_buffer.GetBytes())
89 {
90 m_data_buffer.CopyData(rhs.m_data_buffer.GetBytes(),
91 rhs.m_data_buffer.GetByteSize());
92
93 m_value = (uintptr_t)m_data_buffer.GetBytes();
94 }
95 }
96 return *this;
97}
98
Chris Lattner24943d22010-06-08 16:52:24 +000099void
100Value::Dump (Stream* strm)
101{
Chris Lattner24943d22010-06-08 16:52:24 +0000102 m_value.GetValue (strm, true);
103 strm->Printf(", value_type = %s, context = %p, context_type = %s",
104 Value::GetValueTypeAsCString(m_value_type),
105 m_context,
106 Value::GetContextTypeAsCString(m_context_type));
107}
108
Chris Lattner24943d22010-06-08 16:52:24 +0000109Value::ValueType
110Value::GetValueType() const
111{
Chris Lattner24943d22010-06-08 16:52:24 +0000112 return m_value_type;
113}
114
Greg Claytonb3448432011-03-24 21:19:54 +0000115AddressType
Chris Lattner24943d22010-06-08 16:52:24 +0000116Value::GetValueAddressType () const
117{
Chris Lattner24943d22010-06-08 16:52:24 +0000118 switch (m_value_type)
119 {
120 default:
121 case eValueTypeScalar:
122 break;
123 case eValueTypeLoadAddress: return eAddressTypeLoad;
124 case eValueTypeFileAddress: return eAddressTypeFile;
125 case eValueTypeHostAddress: return eAddressTypeHost;
126 }
127 return eAddressTypeInvalid;
128}
129
Chris Lattner24943d22010-06-08 16:52:24 +0000130RegisterInfo *
131Value::GetRegisterInfo()
132{
Greg Clayton6916e352010-11-13 03:52:47 +0000133 if (m_context_type == eContextTypeRegisterInfo)
Chris Lattner24943d22010-06-08 16:52:24 +0000134 return static_cast<RegisterInfo *> (m_context);
135 return NULL;
136}
137
138Type *
139Value::GetType()
140{
Greg Clayton6916e352010-11-13 03:52:47 +0000141 if (m_context_type == eContextTypeLLDBType)
Chris Lattner24943d22010-06-08 16:52:24 +0000142 return static_cast<Type *> (m_context);
143 return NULL;
144}
145
Chris Lattner24943d22010-06-08 16:52:24 +0000146void
147Value::ResizeData(int len)
148{
Chris Lattner24943d22010-06-08 16:52:24 +0000149 m_value_type = eValueTypeHostAddress;
150 m_data_buffer.SetByteSize(len);
151 m_value = (uintptr_t)m_data_buffer.GetBytes();
152}
153
154bool
155Value::ValueOf(ExecutionContext *exe_ctx, clang::ASTContext *ast_context)
156{
Chris Lattner24943d22010-06-08 16:52:24 +0000157 switch (m_context_type)
158 {
Chris Lattner24943d22010-06-08 16:52:24 +0000159 case eContextTypeInvalid:
Greg Clayton801417e2011-07-07 01:59:51 +0000160 case eContextTypeClangType: // clang::Type *
161 case eContextTypeRegisterInfo: // RegisterInfo *
162 case eContextTypeLLDBType: // Type *
Chris Lattner24943d22010-06-08 16:52:24 +0000163 break;
164
Greg Clayton801417e2011-07-07 01:59:51 +0000165 case eContextTypeVariable: // Variable *
Chris Lattner24943d22010-06-08 16:52:24 +0000166 ResolveValue(exe_ctx, ast_context);
167 return true;
168 }
169 return false;
170}
171
172size_t
173Value::GetValueByteSize (clang::ASTContext *ast_context, Error *error_ptr)
174{
Chris Lattner24943d22010-06-08 16:52:24 +0000175 size_t byte_size = 0;
176
177 switch (m_context_type)
178 {
Chris Lattner24943d22010-06-08 16:52:24 +0000179 case eContextTypeInvalid:
180 // If we have no context, there is no way to know how much memory to read
181 if (error_ptr)
182 error_ptr->SetErrorString ("Invalid context type, there is no way to know how much memory to read.");
183 break;
184
Greg Clayton6916e352010-11-13 03:52:47 +0000185 case eContextTypeClangType:
Chris Lattner24943d22010-06-08 16:52:24 +0000186 if (ast_context == NULL)
187 {
188 if (error_ptr)
189 error_ptr->SetErrorString ("Can't determine size of opaque clang type with NULL ASTContext *.");
190 }
191 else
192 {
Greg Clayton960d6a42010-08-03 00:35:52 +0000193 uint64_t bit_width = ClangASTType::GetClangTypeBitWidth (ast_context, m_context);
Chris Lattner24943d22010-06-08 16:52:24 +0000194 byte_size = (bit_width + 7 ) / 8;
195 }
196 break;
197
Greg Clayton6916e352010-11-13 03:52:47 +0000198 case eContextTypeRegisterInfo: // RegisterInfo *
Chris Lattner24943d22010-06-08 16:52:24 +0000199 if (GetRegisterInfo())
200 byte_size = GetRegisterInfo()->byte_size;
201 else if (error_ptr)
Greg Claytonb9124572012-12-06 02:33:54 +0000202 error_ptr->SetErrorString ("Can't determine byte size with NULL RegisterInfo *.");
Chris Lattner24943d22010-06-08 16:52:24 +0000203 break;
204
Greg Clayton6916e352010-11-13 03:52:47 +0000205 case eContextTypeLLDBType: // Type *
Chris Lattner24943d22010-06-08 16:52:24 +0000206 if (GetType())
207 byte_size = GetType()->GetByteSize();
208 else if (error_ptr)
209 error_ptr->SetErrorString ("Can't determine byte size with NULL Type *.");
210 break;
211
Greg Clayton6916e352010-11-13 03:52:47 +0000212 case eContextTypeVariable: // Variable *
Chris Lattner24943d22010-06-08 16:52:24 +0000213 if (GetVariable())
Jim Inghamb3996532011-12-22 17:03:37 +0000214 {
215 if (GetVariable()->GetType())
216 byte_size = GetVariable()->GetType()->GetByteSize();
217 else if (error_ptr)
218 error_ptr->SetErrorString ("Can't determine byte size with NULL Type *.");
219 }
Chris Lattner24943d22010-06-08 16:52:24 +0000220 else if (error_ptr)
221 error_ptr->SetErrorString ("Can't determine byte size with NULL Variable *.");
222 break;
223 }
224
225 if (error_ptr)
226 {
227 if (byte_size == 0)
228 {
229 if (error_ptr->Success())
230 error_ptr->SetErrorString("Unable to determine byte size.");
231 }
232 else
233 {
234 error_ptr->Clear();
235 }
236 }
237 return byte_size;
238}
239
Greg Clayton04c9c7b2011-02-16 23:00:21 +0000240clang_type_t
Greg Clayton462d4142010-09-29 01:12:09 +0000241Value::GetClangType ()
Chris Lattner24943d22010-06-08 16:52:24 +0000242{
Chris Lattner24943d22010-06-08 16:52:24 +0000243 switch (m_context_type)
244 {
Chris Lattner24943d22010-06-08 16:52:24 +0000245 case eContextTypeInvalid:
246 break;
247
Greg Clayton6916e352010-11-13 03:52:47 +0000248 case eContextTypeClangType:
Chris Lattner24943d22010-06-08 16:52:24 +0000249 return m_context;
250
Greg Clayton6916e352010-11-13 03:52:47 +0000251 case eContextTypeRegisterInfo:
Chris Lattner24943d22010-06-08 16:52:24 +0000252 break; // TODO: Eventually convert into a clang type?
253
Greg Clayton6916e352010-11-13 03:52:47 +0000254 case eContextTypeLLDBType:
Chris Lattner24943d22010-06-08 16:52:24 +0000255 if (GetType())
Greg Clayton04c9c7b2011-02-16 23:00:21 +0000256 return GetType()->GetClangForwardType();
Chris Lattner24943d22010-06-08 16:52:24 +0000257 break;
258
Greg Clayton6916e352010-11-13 03:52:47 +0000259 case eContextTypeVariable:
Chris Lattner24943d22010-06-08 16:52:24 +0000260 if (GetVariable())
Greg Clayton04c9c7b2011-02-16 23:00:21 +0000261 return GetVariable()->GetType()->GetClangForwardType();
Chris Lattner24943d22010-06-08 16:52:24 +0000262 break;
263 }
264
265 return NULL;
266}
267
268lldb::Format
269Value::GetValueDefaultFormat ()
270{
Chris Lattner24943d22010-06-08 16:52:24 +0000271 switch (m_context_type)
272 {
Chris Lattner24943d22010-06-08 16:52:24 +0000273 case eContextTypeInvalid:
274 break;
275
Greg Clayton6916e352010-11-13 03:52:47 +0000276 case eContextTypeClangType:
Greg Clayton1674b122010-07-21 22:12:05 +0000277 return ClangASTType::GetFormat (m_context);
Chris Lattner24943d22010-06-08 16:52:24 +0000278
Greg Clayton6916e352010-11-13 03:52:47 +0000279 case eContextTypeRegisterInfo:
Chris Lattner24943d22010-06-08 16:52:24 +0000280 if (GetRegisterInfo())
281 return GetRegisterInfo()->format;
282 break;
283
Greg Clayton6916e352010-11-13 03:52:47 +0000284 case eContextTypeLLDBType:
Chris Lattner24943d22010-06-08 16:52:24 +0000285 if (GetType())
286 return GetType()->GetFormat();
287 break;
288
Greg Clayton6916e352010-11-13 03:52:47 +0000289 case eContextTypeVariable:
Chris Lattner24943d22010-06-08 16:52:24 +0000290 if (GetVariable())
291 return GetVariable()->GetType()->GetFormat();
292 break;
293
294 }
295
296 // Return a good default in case we can't figure anything out
297 return eFormatHex;
298}
299
Greg Clayton427f2902010-12-14 02:59:59 +0000300bool
301Value::GetData (DataExtractor &data)
302{
303 switch (m_value_type)
304 {
305 default:
306 break;
307
308 case eValueTypeScalar:
309 if (m_value.GetData (data))
310 return true;
311 break;
312
313 case eValueTypeLoadAddress:
314 case eValueTypeFileAddress:
315 case eValueTypeHostAddress:
316 if (m_data_buffer.GetByteSize())
317 {
318 data.SetData(m_data_buffer.GetBytes(), m_data_buffer.GetByteSize(), data.GetByteOrder());
319 return true;
320 }
321 break;
322 }
323
324 return false;
325
326}
327
Chris Lattner24943d22010-06-08 16:52:24 +0000328Error
Greg Clayton801417e2011-07-07 01:59:51 +0000329Value::GetValueAsData (ExecutionContext *exe_ctx,
330 clang::ASTContext *ast_context,
331 DataExtractor &data,
332 uint32_t data_offset,
333 Module *module)
Chris Lattner24943d22010-06-08 16:52:24 +0000334{
Chris Lattner24943d22010-06-08 16:52:24 +0000335 data.Clear();
336
337 Error error;
338 lldb::addr_t address = LLDB_INVALID_ADDRESS;
Greg Claytonb3448432011-03-24 21:19:54 +0000339 AddressType address_type = eAddressTypeFile;
Greg Clayton917c0002011-06-29 22:09:02 +0000340 Address file_so_addr;
Chris Lattner24943d22010-06-08 16:52:24 +0000341 switch (m_value_type)
342 {
343 default:
Greg Claytona564ec62010-11-02 01:50:16 +0000344 error.SetErrorStringWithFormat("invalid value type %i", m_value_type);
Chris Lattner24943d22010-06-08 16:52:24 +0000345 break;
346
347 case eValueTypeScalar:
Greg Claytoncd548032011-02-01 01:31:41 +0000348 data.SetByteOrder (lldb::endian::InlHostByteOrder());
Jim Inghamb14b00c2011-02-24 21:23:14 +0000349 if (m_context_type == eContextTypeClangType && ast_context)
350 {
351 uint32_t ptr_bit_width = ClangASTType::GetClangTypeBitWidth (ast_context,
352 ClangASTContext::GetVoidPtrType(ast_context, false));
353 uint32_t ptr_byte_size = (ptr_bit_width + 7) / 8;
354 data.SetAddressByteSize (ptr_byte_size);
355 }
356 else
357 data.SetAddressByteSize(sizeof(void *));
Chris Lattner24943d22010-06-08 16:52:24 +0000358 if (m_value.GetData (data))
359 return error; // Success;
Greg Claytona564ec62010-11-02 01:50:16 +0000360 error.SetErrorStringWithFormat("extracting data from value failed");
Chris Lattner24943d22010-06-08 16:52:24 +0000361 break;
362
363 case eValueTypeLoadAddress:
364 if (exe_ctx == NULL)
365 {
Greg Clayton917c0002011-06-29 22:09:02 +0000366 error.SetErrorString ("can't read load address (no execution context)");
Chris Lattner24943d22010-06-08 16:52:24 +0000367 }
Greg Clayton801417e2011-07-07 01:59:51 +0000368 else
Chris Lattner24943d22010-06-08 16:52:24 +0000369 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000370 Process *process = exe_ctx->GetProcessPtr();
Greg Clayton801417e2011-07-07 01:59:51 +0000371 if (process == NULL)
372 {
373 error.SetErrorString ("can't read load address (invalid process)");
374 }
375 else
376 {
377 address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
378 address_type = eAddressTypeLoad;
379 data.SetByteOrder(process->GetTarget().GetArchitecture().GetByteOrder());
380 data.SetAddressByteSize(process->GetTarget().GetArchitecture().GetAddressByteSize());
381 }
Chris Lattner24943d22010-06-08 16:52:24 +0000382 }
383 break;
384
385 case eValueTypeFileAddress:
Greg Clayton917c0002011-06-29 22:09:02 +0000386 if (exe_ctx == NULL)
387 {
388 error.SetErrorString ("can't read file address (no execution context)");
389 }
Greg Clayton567e7f32011-09-22 04:58:26 +0000390 else if (exe_ctx->GetTargetPtr() == NULL)
Greg Clayton917c0002011-06-29 22:09:02 +0000391 {
392 error.SetErrorString ("can't read file address (invalid target)");
393 }
394 else
Chris Lattner24943d22010-06-08 16:52:24 +0000395 {
Greg Clayton801417e2011-07-07 01:59:51 +0000396 address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
397 if (address == LLDB_INVALID_ADDRESS)
Chris Lattner24943d22010-06-08 16:52:24 +0000398 {
Greg Clayton801417e2011-07-07 01:59:51 +0000399 error.SetErrorString ("invalid file address");
400 }
401 else
402 {
403 if (module == NULL)
404 {
405 // The only thing we can currently lock down to a module so that
406 // we can resolve a file address, is a variable.
407 Variable *variable = GetVariable();
408 if (variable)
409 {
410 SymbolContext var_sc;
411 variable->CalculateSymbolContext(&var_sc);
412 module = var_sc.module_sp.get();
413 }
414 }
415
416 if (module)
Chris Lattner24943d22010-06-08 16:52:24 +0000417 {
Greg Clayton917c0002011-06-29 22:09:02 +0000418 bool resolved = false;
Greg Clayton801417e2011-07-07 01:59:51 +0000419 ObjectFile *objfile = module->GetObjectFile();
420 if (objfile)
Chris Lattner24943d22010-06-08 16:52:24 +0000421 {
Greg Clayton801417e2011-07-07 01:59:51 +0000422 Address so_addr(address, objfile->GetSectionList());
Greg Clayton567e7f32011-09-22 04:58:26 +0000423 addr_t load_address = so_addr.GetLoadAddress (exe_ctx->GetTargetPtr());
Johnny Chen3c49d4c2012-02-02 22:11:13 +0000424 bool process_launched_and_stopped = exe_ctx->GetProcessPtr()
425 ? StateIsStoppedState(exe_ctx->GetProcessPtr()->GetState(), true /* must_exist */)
426 : false;
Johnny Chen6c49bf42012-02-02 19:55:18 +0000427 // Don't use the load address if the process has exited.
428 if (load_address != LLDB_INVALID_ADDRESS && process_launched_and_stopped)
Chris Lattner24943d22010-06-08 16:52:24 +0000429 {
Greg Clayton801417e2011-07-07 01:59:51 +0000430 resolved = true;
431 address = load_address;
432 address_type = eAddressTypeLoad;
Greg Clayton567e7f32011-09-22 04:58:26 +0000433 data.SetByteOrder(exe_ctx->GetTargetRef().GetArchitecture().GetByteOrder());
434 data.SetAddressByteSize(exe_ctx->GetTargetRef().GetArchitecture().GetAddressByteSize());
Greg Clayton801417e2011-07-07 01:59:51 +0000435 }
436 else
437 {
438 if (so_addr.IsSectionOffset())
Greg Claytonfe9864c2010-08-18 18:28:52 +0000439 {
Greg Clayton917c0002011-06-29 22:09:02 +0000440 resolved = true;
Greg Clayton801417e2011-07-07 01:59:51 +0000441 file_so_addr = so_addr;
442 data.SetByteOrder(objfile->GetByteOrder());
443 data.SetAddressByteSize(objfile->GetAddressByteSize());
Greg Claytonfe9864c2010-08-18 18:28:52 +0000444 }
Chris Lattner24943d22010-06-08 16:52:24 +0000445 }
Chris Lattner24943d22010-06-08 16:52:24 +0000446 }
Greg Clayton917c0002011-06-29 22:09:02 +0000447 if (!resolved)
Chris Lattner24943d22010-06-08 16:52:24 +0000448 {
Greg Clayton801417e2011-07-07 01:59:51 +0000449 Variable *variable = GetVariable();
450
451 if (module)
452 {
453 if (variable)
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000454 error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64 " for variable '%s' in %s%s%s",
Greg Clayton801417e2011-07-07 01:59:51 +0000455 address,
456 variable->GetName().AsCString(""),
457 module->GetFileSpec().GetDirectory().GetCString(),
458 module->GetFileSpec().GetDirectory() ? "/" : "",
459 module->GetFileSpec().GetFilename().GetCString());
460 else
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000461 error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64 " in %s%s%s",
Greg Clayton801417e2011-07-07 01:59:51 +0000462 address,
463 module->GetFileSpec().GetDirectory().GetCString(),
464 module->GetFileSpec().GetDirectory() ? "/" : "",
465 module->GetFileSpec().GetFilename().GetCString());
466 }
Greg Clayton917c0002011-06-29 22:09:02 +0000467 else
Greg Clayton801417e2011-07-07 01:59:51 +0000468 {
469 if (variable)
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000470 error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64 " for variable '%s'",
Greg Clayton801417e2011-07-07 01:59:51 +0000471 address,
472 variable->GetName().AsCString(""));
473 else
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000474 error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64, address);
Greg Clayton801417e2011-07-07 01:59:51 +0000475 }
Chris Lattner24943d22010-06-08 16:52:24 +0000476 }
477 }
478 else
479 {
Greg Clayton801417e2011-07-07 01:59:51 +0000480 // Can't convert a file address to anything valid without more
481 // context (which Module it came from)
482 error.SetErrorString ("can't read memory from file address without more context");
Chris Lattner24943d22010-06-08 16:52:24 +0000483 }
484 }
Chris Lattner24943d22010-06-08 16:52:24 +0000485 }
486 break;
487
488 case eValueTypeHostAddress:
489 address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
Enrico Granata2d34a502012-04-24 01:23:23 +0000490 address_type = eAddressTypeHost;
491 if (exe_ctx)
492 {
493 Target *target = exe_ctx->GetTargetPtr();
494 if (target)
495 {
496 data.SetByteOrder(target->GetArchitecture().GetByteOrder());
497 data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
498 break;
499 }
500 }
501 // fallback to host settings
Greg Claytoncd548032011-02-01 01:31:41 +0000502 data.SetByteOrder(lldb::endian::InlHostByteOrder());
Chris Lattner24943d22010-06-08 16:52:24 +0000503 data.SetAddressByteSize(sizeof(void *));
Chris Lattner24943d22010-06-08 16:52:24 +0000504 break;
505 }
506
507 // Bail if we encountered any errors
508 if (error.Fail())
509 return error;
510
511 if (address == LLDB_INVALID_ADDRESS)
512 {
Greg Claytona564ec62010-11-02 01:50:16 +0000513 error.SetErrorStringWithFormat ("invalid %s address", address_type == eAddressTypeHost ? "host" : "load");
Chris Lattner24943d22010-06-08 16:52:24 +0000514 return error;
515 }
516
517 // If we got here, we need to read the value from memory
518 uint32_t byte_size = GetValueByteSize (ast_context, &error);
519
520 // Bail if we encountered any errors getting the byte size
521 if (error.Fail())
522 return error;
523
524 // Make sure we have enough room within "data", and if we don't make
525 // something large enough that does
526 if (!data.ValidOffsetForDataOfSize (data_offset, byte_size))
527 {
528 DataBufferSP data_sp(new DataBufferHeap (data_offset + byte_size, '\0'));
529 data.SetData(data_sp);
530 }
531
Greg Clayton54e7afa2010-07-09 20:39:50 +0000532 uint8_t* dst = const_cast<uint8_t*>(data.PeekData (data_offset, byte_size));
Chris Lattner24943d22010-06-08 16:52:24 +0000533 if (dst != NULL)
534 {
535 if (address_type == eAddressTypeHost)
536 {
537 // The address is an address in this process, so just copy it
538 memcpy (dst, (uint8_t*)NULL + address, byte_size);
539 }
Greg Clayton917c0002011-06-29 22:09:02 +0000540 else if ((address_type == eAddressTypeLoad) || (address_type == eAddressTypeFile))
Chris Lattner24943d22010-06-08 16:52:24 +0000541 {
Greg Clayton917c0002011-06-29 22:09:02 +0000542 if (file_so_addr.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000543 {
Greg Clayton917c0002011-06-29 22:09:02 +0000544 // We have a file address that we were able to translate into a
545 // section offset address so we might be able to read this from
546 // the object files if we don't have a live process. Lets always
547 // try and read from the process if we have one though since we
548 // want to read the actual value by setting "prefer_file_cache"
549 // to false.
550 const bool prefer_file_cache = false;
Greg Clayton567e7f32011-09-22 04:58:26 +0000551 if (exe_ctx->GetTargetRef().ReadMemory(file_so_addr, prefer_file_cache, dst, byte_size, error) != byte_size)
Greg Clayton917c0002011-06-29 22:09:02 +0000552 {
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000553 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", (uint64_t)address);
Greg Clayton917c0002011-06-29 22:09:02 +0000554 }
555 }
556 else
557 {
Greg Clayton801417e2011-07-07 01:59:51 +0000558 // The execution context might have a NULL process, but it
559 // might have a valid process in the exe_ctx->target, so use
560 // the ExecutionContext::GetProcess accessor to ensure we
561 // get the process if there is one.
Greg Clayton567e7f32011-09-22 04:58:26 +0000562 Process *process = exe_ctx->GetProcessPtr();
Greg Clayton801417e2011-07-07 01:59:51 +0000563
564 if (process)
Greg Clayton917c0002011-06-29 22:09:02 +0000565 {
Greg Clayton801417e2011-07-07 01:59:51 +0000566 const size_t bytes_read = process->ReadMemory(address, dst, byte_size, error);
567 if (bytes_read != byte_size)
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000568 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed (%u of %u bytes read)",
Greg Clayton801417e2011-07-07 01:59:51 +0000569 (uint64_t)address,
570 (uint32_t)bytes_read,
571 (uint32_t)byte_size);
572 }
573 else
574 {
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000575 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed (invalid process)", (uint64_t)address);
Greg Clayton917c0002011-06-29 22:09:02 +0000576 }
Chris Lattner24943d22010-06-08 16:52:24 +0000577 }
578 }
579 else
580 {
Greg Claytonb3448432011-03-24 21:19:54 +0000581 error.SetErrorStringWithFormat ("unsupported AddressType value (%i)", address_type);
Chris Lattner24943d22010-06-08 16:52:24 +0000582 }
583 }
584 else
585 {
Greg Claytona564ec62010-11-02 01:50:16 +0000586 error.SetErrorStringWithFormat ("out of memory");
Chris Lattner24943d22010-06-08 16:52:24 +0000587 }
588
589 return error;
590}
591
592Scalar &
593Value::ResolveValue(ExecutionContext *exe_ctx, clang::ASTContext *ast_context)
594{
Greg Clayton801417e2011-07-07 01:59:51 +0000595 void *opaque_clang_qual_type = GetClangType();
596 if (opaque_clang_qual_type)
Chris Lattner24943d22010-06-08 16:52:24 +0000597 {
Chris Lattner24943d22010-06-08 16:52:24 +0000598 switch (m_value_type)
599 {
600 case eValueTypeScalar: // raw scalar value
601 break;
602
603 default:
604 case eValueTypeFileAddress:
605 m_value.Clear();
606 break;
607
608 case eValueTypeLoadAddress: // load address value
609 case eValueTypeHostAddress: // host address value (for memory in the process that is using liblldb)
610 {
Greg Claytonb3448432011-03-24 21:19:54 +0000611 AddressType address_type = m_value_type == eValueTypeLoadAddress ? eAddressTypeLoad : eAddressTypeHost;
Chris Lattner24943d22010-06-08 16:52:24 +0000612 lldb::addr_t addr = m_value.ULongLong(LLDB_INVALID_ADDRESS);
613 DataExtractor data;
Greg Clayton1674b122010-07-21 22:12:05 +0000614 if (ClangASTType::ReadFromMemory (ast_context, opaque_clang_qual_type, exe_ctx, addr, address_type, data))
Chris Lattner24943d22010-06-08 16:52:24 +0000615 {
Greg Clayton801417e2011-07-07 01:59:51 +0000616 Scalar scalar;
Greg Clayton1674b122010-07-21 22:12:05 +0000617 if (ClangASTType::GetValueAsScalar (ast_context, opaque_clang_qual_type, data, 0, data.GetByteSize(), scalar))
Chris Lattner24943d22010-06-08 16:52:24 +0000618 {
619 m_value = scalar;
620 m_value_type = eValueTypeScalar;
621 }
622 else
623 {
624 if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes())
625 {
626 m_value.Clear();
627 m_value_type = eValueTypeScalar;
628 }
629 }
630 }
631 else
632 {
633 if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes())
634 {
635 m_value.Clear();
636 m_value_type = eValueTypeScalar;
637 }
638 }
639 }
640 break;
641 }
Chris Lattner24943d22010-06-08 16:52:24 +0000642 }
643 return m_value;
644}
645
646Variable *
647Value::GetVariable()
648{
Greg Clayton6916e352010-11-13 03:52:47 +0000649 if (m_context_type == eContextTypeVariable)
Chris Lattner24943d22010-06-08 16:52:24 +0000650 return static_cast<Variable *> (m_context);
651 return NULL;
652}
653
Chris Lattner24943d22010-06-08 16:52:24 +0000654const char *
655Value::GetValueTypeAsCString (ValueType value_type)
656{
657 switch (value_type)
658 {
659 case eValueTypeScalar: return "scalar";
Greg Claytonf0fab4f2012-10-30 23:56:14 +0000660 case eValueTypeVector: return "vector";
Chris Lattner24943d22010-06-08 16:52:24 +0000661 case eValueTypeFileAddress: return "file address";
662 case eValueTypeLoadAddress: return "load address";
663 case eValueTypeHostAddress: return "host address";
664 };
665 return "???";
666}
667
668const char *
669Value::GetContextTypeAsCString (ContextType context_type)
670{
671 switch (context_type)
672 {
Greg Clayton801417e2011-07-07 01:59:51 +0000673 case eContextTypeInvalid: return "invalid";
674 case eContextTypeClangType: return "clang::Type *";
675 case eContextTypeRegisterInfo: return "RegisterInfo *";
676 case eContextTypeLLDBType: return "Type *";
677 case eContextTypeVariable: return "Variable *";
Chris Lattner24943d22010-06-08 16:52:24 +0000678 };
679 return "???";
680}
681
682ValueList::ValueList (const ValueList &rhs)
683{
684 m_values = rhs.m_values;
685}
686
687const ValueList &
688ValueList::operator= (const ValueList &rhs)
689{
690 m_values = rhs.m_values;
691 return *this;
692}
693
694void
695ValueList::PushValue (const Value &value)
696{
697 m_values.push_back (value);
698}
699
700size_t
701ValueList::GetSize()
702{
703 return m_values.size();
704}
705
706Value *
707ValueList::GetValueAtIndex (size_t idx)
708{
709 if (idx < GetSize())
710 {
711 return &(m_values[idx]);
712 }
713 else
714 return NULL;
715}
716
717void
718ValueList::Clear ()
719{
720 m_values.clear();
721}