blob: 2ba490ebb0ad6b7ef1063474c5ac6e8d4cb7d102 [file] [log] [blame]
Chris Lattner30fdc8d2010-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"
19#include "lldb/Core/Stream.h"
Greg Claytone1a916a2010-07-21 22:12:05 +000020#include "lldb/Symbol/ClangASTType.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021#include "lldb/Symbol/ClangASTContext.h"
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#include "lldb/Target/ExecutionContext.h"
27#include "lldb/Target/Process.h"
Greg Clayton514487e2011-02-15 21:59:32 +000028#include "lldb/Target/Target.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029
30using namespace lldb;
31using namespace lldb_private;
32
33Value::Value() :
34 m_value(),
35 m_value_type(eValueTypeScalar),
36 m_context(NULL),
37 m_context_type(eContextTypeInvalid)
38{
39}
40
41Value::Value(const Scalar& scalar) :
42 m_value(scalar),
43 m_value_type(eValueTypeScalar),
44 m_context(NULL),
45 m_context_type(eContextTypeInvalid)
46{
47}
48
49Value::Value(int v) :
50 m_value(v),
51 m_value_type(eValueTypeScalar),
52 m_context(NULL),
53 m_context_type(eContextTypeInvalid)
54{
55}
56
57Value::Value(unsigned int v) :
58 m_value(v),
59 m_value_type(eValueTypeScalar),
60 m_context(NULL),
61 m_context_type(eContextTypeInvalid)
62{
63}
64
65Value::Value(long v) :
66 m_value(v),
67 m_value_type(eValueTypeScalar),
68 m_context(NULL),
69 m_context_type(eContextTypeInvalid)
70{
71}
72
73Value::Value(unsigned long v) :
74 m_value(v),
75 m_value_type(eValueTypeScalar),
76 m_context(NULL),
77 m_context_type(eContextTypeInvalid)
78{
79}
80
81Value::Value(long long v) :
82 m_value(v),
83 m_value_type(eValueTypeScalar),
84 m_context(NULL),
85 m_context_type(eContextTypeInvalid)
86{
87}
88
89Value::Value(unsigned long long v) :
90 m_value(v),
91 m_value_type(eValueTypeScalar),
92 m_context(NULL),
93 m_context_type(eContextTypeInvalid)
94{
95}
96
97Value::Value(float v) :
98 m_value(v),
99 m_value_type(eValueTypeScalar),
100 m_context(NULL),
101 m_context_type(eContextTypeInvalid)
102{
103}
104
105Value::Value(double v) :
106 m_value(v),
107 m_value_type(eValueTypeScalar),
108 m_context(NULL),
109 m_context_type(eContextTypeInvalid)
110{
111}
112
113Value::Value(long double v) :
114 m_value(v),
115 m_value_type(eValueTypeScalar),
116 m_context(NULL),
117 m_context_type(eContextTypeInvalid)
118{
119}
120
121Value::Value(const uint8_t *bytes, int len) :
122 m_value(),
123 m_value_type(eValueTypeHostAddress),
124 m_context(NULL),
125 m_context_type(eContextTypeInvalid)
126{
127 m_data_buffer.CopyData(bytes, len);
128 m_value = (uintptr_t)m_data_buffer.GetBytes();
129}
130
131Value::Value(const Value &v) :
132 m_value(v.m_value),
133 m_value_type(v.m_value_type),
134 m_context(v.m_context),
135 m_context_type(v.m_context_type)
136{
137 if ((uintptr_t)v.m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)v.m_data_buffer.GetBytes())
138 {
139 m_data_buffer.CopyData(v.m_data_buffer.GetBytes(),
140 v.m_data_buffer.GetByteSize());
141
142 m_value = (uintptr_t)m_data_buffer.GetBytes();
143 }
144}
145
Greg Clayton1a65ae12011-01-25 23:55:37 +0000146Value &
147Value::operator=(const Value &rhs)
148{
149 if (this != &rhs)
150 {
151 m_value = rhs.m_value;
152 m_value_type = rhs.m_value_type;
153 m_context = rhs.m_context;
154 m_context_type = rhs.m_context_type;
155 if ((uintptr_t)rhs.m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)rhs.m_data_buffer.GetBytes())
156 {
157 m_data_buffer.CopyData(rhs.m_data_buffer.GetBytes(),
158 rhs.m_data_buffer.GetByteSize());
159
160 m_value = (uintptr_t)m_data_buffer.GetBytes();
161 }
162 }
163 return *this;
164}
165
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166Value *
167Value::CreateProxy()
168{
169 if (m_context_type == eContextTypeValue)
170 return ((Value*)m_context)->CreateProxy ();
171
172 Value *ret = new Value;
173 ret->SetContext(eContextTypeValue, this);
174 return ret;
175}
176
177Value *
178Value::GetProxyTarget()
179{
180 if (m_context_type == eContextTypeValue)
181 return (Value*)m_context;
182 else
183 return NULL;
184}
185
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000186void
187Value::Dump (Stream* strm)
188{
189 if (m_context_type == eContextTypeValue)
190 {
191 ((Value*)m_context)->Dump (strm);
192 return;
193 }
194
195 m_value.GetValue (strm, true);
196 strm->Printf(", value_type = %s, context = %p, context_type = %s",
197 Value::GetValueTypeAsCString(m_value_type),
198 m_context,
199 Value::GetContextTypeAsCString(m_context_type));
200}
201
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000202Value::ValueType
203Value::GetValueType() const
204{
205 if (m_context_type == eContextTypeValue)
206 return ((Value*)m_context)->GetValueType ();
207
208 return m_value_type;
209}
210
Greg Claytone0d378b2011-03-24 21:19:54 +0000211AddressType
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000212Value::GetValueAddressType () const
213{
214 if (m_context_type == eContextTypeValue)
215 return ((Value*)m_context)->GetValueAddressType ();
216
217 switch (m_value_type)
218 {
219 default:
220 case eValueTypeScalar:
221 break;
222 case eValueTypeLoadAddress: return eAddressTypeLoad;
223 case eValueTypeFileAddress: return eAddressTypeFile;
224 case eValueTypeHostAddress: return eAddressTypeHost;
225 }
226 return eAddressTypeInvalid;
227}
228
229
230Value::ContextType
231Value::GetContextType() const
232{
233 if (m_context_type == eContextTypeValue)
234 return ((Value*)m_context)->GetContextType ();
235
236 return m_context_type;
237}
238
239void
240Value::SetValueType (Value::ValueType value_type)
241{
242 if (m_context_type == eContextTypeValue)
243 {
244 ((Value*)m_context)->SetValueType(value_type);
245 return;
246 }
247
248 m_value_type = value_type;
249}
250
251void
252Value::ClearContext ()
253{
254 if (m_context_type == eContextTypeValue)
255 {
256 ((Value*)m_context)->ClearContext();
257 return;
258 }
259
260 m_context = NULL;
261 m_context_type = eContextTypeInvalid;
262}
263
264void
265Value::SetContext (Value::ContextType context_type, void *p)
266{
267 if (m_context_type == eContextTypeValue)
268 {
269 ((Value*)m_context)->SetContext(context_type, p);
270 return;
271 }
272
273 m_context_type = context_type;
274 m_context = p;
275}
276
277RegisterInfo *
278Value::GetRegisterInfo()
279{
280 if (m_context_type == eContextTypeValue)
281 return ((Value*)m_context)->GetRegisterInfo();
282
Greg Clayton526e5af2010-11-13 03:52:47 +0000283 if (m_context_type == eContextTypeRegisterInfo)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000284 return static_cast<RegisterInfo *> (m_context);
285 return NULL;
286}
287
288Type *
289Value::GetType()
290{
291 if (m_context_type == eContextTypeValue)
292 return ((Value*)m_context)->GetType();
293
Greg Clayton526e5af2010-11-13 03:52:47 +0000294 if (m_context_type == eContextTypeLLDBType)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000295 return static_cast<Type *> (m_context);
296 return NULL;
297}
298
299Scalar &
300Value::GetScalar()
301{
302 if (m_context_type == eContextTypeValue)
303 return ((Value*)m_context)->GetScalar();
304
305 return m_value;
306}
307
308void
309Value::ResizeData(int len)
310{
311 if (m_context_type == eContextTypeValue)
312 {
313 ((Value*)m_context)->ResizeData(len);
314 return;
315 }
316
317 m_value_type = eValueTypeHostAddress;
318 m_data_buffer.SetByteSize(len);
319 m_value = (uintptr_t)m_data_buffer.GetBytes();
320}
321
322bool
323Value::ValueOf(ExecutionContext *exe_ctx, clang::ASTContext *ast_context)
324{
325 if (m_context_type == eContextTypeValue)
326 return ((Value*)m_context)->ValueOf(exe_ctx, ast_context);
327
328 switch (m_context_type)
329 {
330 default:
331 case eContextTypeInvalid:
Greg Clayton526e5af2010-11-13 03:52:47 +0000332 case eContextTypeClangType: // clang::Type *
333 case eContextTypeRegisterInfo: // RegisterInfo *
334 case eContextTypeLLDBType: // Type *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000335 break;
336
Greg Clayton526e5af2010-11-13 03:52:47 +0000337 case eContextTypeVariable: // Variable *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000338 ResolveValue(exe_ctx, ast_context);
339 return true;
340 }
341 return false;
342}
343
344size_t
345Value::GetValueByteSize (clang::ASTContext *ast_context, Error *error_ptr)
346{
347 if (m_context_type == eContextTypeValue)
348 return ((Value*)m_context)->GetValueByteSize(ast_context, error_ptr);
349
350 size_t byte_size = 0;
351
352 switch (m_context_type)
353 {
354 default:
355 case eContextTypeInvalid:
356 // If we have no context, there is no way to know how much memory to read
357 if (error_ptr)
358 error_ptr->SetErrorString ("Invalid context type, there is no way to know how much memory to read.");
359 break;
360
Greg Clayton526e5af2010-11-13 03:52:47 +0000361 case eContextTypeClangType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000362 if (ast_context == NULL)
363 {
364 if (error_ptr)
365 error_ptr->SetErrorString ("Can't determine size of opaque clang type with NULL ASTContext *.");
366 }
367 else
368 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000369 uint64_t bit_width = ClangASTType::GetClangTypeBitWidth (ast_context, m_context);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000370 byte_size = (bit_width + 7 ) / 8;
371 }
372 break;
373
Greg Clayton526e5af2010-11-13 03:52:47 +0000374 case eContextTypeRegisterInfo: // RegisterInfo *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000375 if (GetRegisterInfo())
376 byte_size = GetRegisterInfo()->byte_size;
377 else if (error_ptr)
378 error_ptr->SetErrorString ("Can't determine byte size with NULL RegisterInfo *.");
379
380 break;
381
Greg Clayton526e5af2010-11-13 03:52:47 +0000382 case eContextTypeLLDBType: // Type *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000383 if (GetType())
384 byte_size = GetType()->GetByteSize();
385 else if (error_ptr)
386 error_ptr->SetErrorString ("Can't determine byte size with NULL Type *.");
387 break;
388
Greg Clayton526e5af2010-11-13 03:52:47 +0000389 case eContextTypeVariable: // Variable *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000390 if (GetVariable())
391 byte_size = GetVariable()->GetType()->GetByteSize();
392 else if (error_ptr)
393 error_ptr->SetErrorString ("Can't determine byte size with NULL Variable *.");
394 break;
395 }
396
397 if (error_ptr)
398 {
399 if (byte_size == 0)
400 {
401 if (error_ptr->Success())
402 error_ptr->SetErrorString("Unable to determine byte size.");
403 }
404 else
405 {
406 error_ptr->Clear();
407 }
408 }
409 return byte_size;
410}
411
Greg Claytonf4ecaa52011-02-16 23:00:21 +0000412clang_type_t
Greg Clayton1be10fc2010-09-29 01:12:09 +0000413Value::GetClangType ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000414{
415 if (m_context_type == eContextTypeValue)
Greg Clayton1be10fc2010-09-29 01:12:09 +0000416 return ((Value*)m_context)->GetClangType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000417
418 switch (m_context_type)
419 {
420 default:
421 case eContextTypeInvalid:
422 break;
423
Greg Clayton526e5af2010-11-13 03:52:47 +0000424 case eContextTypeClangType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000425 return m_context;
426
Greg Clayton526e5af2010-11-13 03:52:47 +0000427 case eContextTypeRegisterInfo:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000428 break; // TODO: Eventually convert into a clang type?
429
Greg Clayton526e5af2010-11-13 03:52:47 +0000430 case eContextTypeLLDBType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000431 if (GetType())
Greg Claytonf4ecaa52011-02-16 23:00:21 +0000432 return GetType()->GetClangForwardType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000433 break;
434
Greg Clayton526e5af2010-11-13 03:52:47 +0000435 case eContextTypeVariable:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000436 if (GetVariable())
Greg Claytonf4ecaa52011-02-16 23:00:21 +0000437 return GetVariable()->GetType()->GetClangForwardType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000438 break;
439 }
440
441 return NULL;
442}
443
444lldb::Format
445Value::GetValueDefaultFormat ()
446{
447 if (m_context_type == eContextTypeValue)
448 return ((Value*)m_context)->GetValueDefaultFormat();
449
450 switch (m_context_type)
451 {
452 default:
453 case eContextTypeInvalid:
454 break;
455
Greg Clayton526e5af2010-11-13 03:52:47 +0000456 case eContextTypeClangType:
Greg Claytone1a916a2010-07-21 22:12:05 +0000457 return ClangASTType::GetFormat (m_context);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000458
Greg Clayton526e5af2010-11-13 03:52:47 +0000459 case eContextTypeRegisterInfo:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000460 if (GetRegisterInfo())
461 return GetRegisterInfo()->format;
462 break;
463
Greg Clayton526e5af2010-11-13 03:52:47 +0000464 case eContextTypeLLDBType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000465 if (GetType())
466 return GetType()->GetFormat();
467 break;
468
Greg Clayton526e5af2010-11-13 03:52:47 +0000469 case eContextTypeVariable:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000470 if (GetVariable())
471 return GetVariable()->GetType()->GetFormat();
472 break;
473
474 }
475
476 // Return a good default in case we can't figure anything out
477 return eFormatHex;
478}
479
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000480bool
481Value::GetData (DataExtractor &data)
482{
483 switch (m_value_type)
484 {
485 default:
486 break;
487
488 case eValueTypeScalar:
489 if (m_value.GetData (data))
490 return true;
491 break;
492
493 case eValueTypeLoadAddress:
494 case eValueTypeFileAddress:
495 case eValueTypeHostAddress:
496 if (m_data_buffer.GetByteSize())
497 {
498 data.SetData(m_data_buffer.GetBytes(), m_data_buffer.GetByteSize(), data.GetByteOrder());
499 return true;
500 }
501 break;
502 }
503
504 return false;
505
506}
507
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000508Error
509Value::GetValueAsData (ExecutionContext *exe_ctx, clang::ASTContext *ast_context, DataExtractor &data, uint32_t data_offset)
510{
511 if (m_context_type == eContextTypeValue)
512 return ((Value*)m_context)->GetValueAsData(exe_ctx, ast_context, data, data_offset);
513
514 data.Clear();
515
516 Error error;
517 lldb::addr_t address = LLDB_INVALID_ADDRESS;
Greg Claytone0d378b2011-03-24 21:19:54 +0000518 AddressType address_type = eAddressTypeFile;
Greg Claytondea8cb42011-06-29 22:09:02 +0000519 Address file_so_addr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000520 switch (m_value_type)
521 {
522 default:
Greg Clayton7c8a9662010-11-02 01:50:16 +0000523 error.SetErrorStringWithFormat("invalid value type %i", m_value_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000524 break;
525
526 case eValueTypeScalar:
Greg Clayton7fb56d02011-02-01 01:31:41 +0000527 data.SetByteOrder (lldb::endian::InlHostByteOrder());
Jim Inghamf6ea93f2011-02-24 21:23:14 +0000528 if (m_context_type == eContextTypeClangType && ast_context)
529 {
530 uint32_t ptr_bit_width = ClangASTType::GetClangTypeBitWidth (ast_context,
531 ClangASTContext::GetVoidPtrType(ast_context, false));
532 uint32_t ptr_byte_size = (ptr_bit_width + 7) / 8;
533 data.SetAddressByteSize (ptr_byte_size);
534 }
535 else
536 data.SetAddressByteSize(sizeof(void *));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000537 if (m_value.GetData (data))
538 return error; // Success;
Greg Clayton7c8a9662010-11-02 01:50:16 +0000539 error.SetErrorStringWithFormat("extracting data from value failed");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000540 break;
541
542 case eValueTypeLoadAddress:
543 if (exe_ctx == NULL)
544 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000545 error.SetErrorString ("can't read load address (no execution context)");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000546 }
547 else if (exe_ctx->process == NULL)
548 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000549 error.SetErrorString ("can't read load address (invalid process)");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000550 }
551 else
552 {
553 address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
554 address_type = eAddressTypeLoad;
Greg Clayton514487e2011-02-15 21:59:32 +0000555 data.SetByteOrder(exe_ctx->process->GetTarget().GetArchitecture().GetByteOrder());
556 data.SetAddressByteSize(exe_ctx->process->GetTarget().GetArchitecture().GetAddressByteSize());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000557 }
558 break;
559
560 case eValueTypeFileAddress:
Greg Claytondea8cb42011-06-29 22:09:02 +0000561 if (exe_ctx == NULL)
562 {
563 error.SetErrorString ("can't read file address (no execution context)");
564 }
565 else if (exe_ctx->target == NULL)
566 {
567 error.SetErrorString ("can't read file address (invalid target)");
568 }
569 else
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000570 {
571 // The only thing we can currently lock down to a module so that
572 // we can resolve a file address, is a variable.
573 Variable *variable = GetVariable();
574
575 if (GetVariable())
576 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000577 address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
578 if (address != LLDB_INVALID_ADDRESS)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000579 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000580 bool resolved = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000581 SymbolContext var_sc;
582 variable->CalculateSymbolContext(&var_sc);
583 if (var_sc.module_sp)
584 {
585 ObjectFile *objfile = var_sc.module_sp->GetObjectFile();
586 if (objfile)
587 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000588 Address so_addr(address, objfile->GetSectionList());
589 addr_t load_address = so_addr.GetLoadAddress (exe_ctx->target);
590 if (load_address != LLDB_INVALID_ADDRESS)
Greg Claytonad3843c2010-08-18 18:28:52 +0000591 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000592 resolved = true;
593 address = load_address;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000594 address_type = eAddressTypeLoad;
Greg Clayton514487e2011-02-15 21:59:32 +0000595 data.SetByteOrder(exe_ctx->target->GetArchitecture().GetByteOrder());
596 data.SetAddressByteSize(exe_ctx->target->GetArchitecture().GetAddressByteSize());
Greg Claytonad3843c2010-08-18 18:28:52 +0000597 }
598 else
599 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000600 if (so_addr.IsSectionOffset())
601 {
602 resolved = true;
603 file_so_addr = so_addr;
604 data.SetByteOrder(objfile->GetByteOrder());
605 data.SetAddressByteSize(objfile->GetAddressByteSize());
606 }
Greg Claytonad3843c2010-08-18 18:28:52 +0000607 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000608 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000609 }
Greg Claytondea8cb42011-06-29 22:09:02 +0000610 if (!resolved)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000611 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000612 if (var_sc.module_sp)
613 error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%llx for variable '%s' in %s%s%s",
614 address,
615 variable->GetName().AsCString(""),
616 var_sc.module_sp->GetFileSpec().GetDirectory().GetCString(),
617 var_sc.module_sp->GetFileSpec().GetDirectory() ? "/" : "",
618 var_sc.module_sp->GetFileSpec().GetFilename().GetCString());
619 else
620 error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%llx for variable '%s'",
621 address,
622 variable->GetName().AsCString(""));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000623 }
624 }
625 else
626 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000627 error.SetErrorString ("invalid file address");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000628 }
629 }
630 else
631 {
632 // Can't convert a file address to anything valid without more
633 // context (which Module it came from)
Greg Clayton7c8a9662010-11-02 01:50:16 +0000634 error.SetErrorString ("can't read memory from file address without more context");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000635 }
636 }
637 break;
638
639 case eValueTypeHostAddress:
640 address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
Greg Clayton7fb56d02011-02-01 01:31:41 +0000641 data.SetByteOrder(lldb::endian::InlHostByteOrder());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000642 data.SetAddressByteSize(sizeof(void *));
643 address_type = eAddressTypeHost;
644 break;
645 }
646
647 // Bail if we encountered any errors
648 if (error.Fail())
649 return error;
650
651 if (address == LLDB_INVALID_ADDRESS)
652 {
Greg Clayton7c8a9662010-11-02 01:50:16 +0000653 error.SetErrorStringWithFormat ("invalid %s address", address_type == eAddressTypeHost ? "host" : "load");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000654 return error;
655 }
656
657 // If we got here, we need to read the value from memory
658 uint32_t byte_size = GetValueByteSize (ast_context, &error);
659
660 // Bail if we encountered any errors getting the byte size
661 if (error.Fail())
662 return error;
663
664 // Make sure we have enough room within "data", and if we don't make
665 // something large enough that does
666 if (!data.ValidOffsetForDataOfSize (data_offset, byte_size))
667 {
668 DataBufferSP data_sp(new DataBufferHeap (data_offset + byte_size, '\0'));
669 data.SetData(data_sp);
670 }
671
Greg Claytonc982c762010-07-09 20:39:50 +0000672 uint8_t* dst = const_cast<uint8_t*>(data.PeekData (data_offset, byte_size));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000673 if (dst != NULL)
674 {
675 if (address_type == eAddressTypeHost)
676 {
677 // The address is an address in this process, so just copy it
678 memcpy (dst, (uint8_t*)NULL + address, byte_size);
679 }
Greg Claytondea8cb42011-06-29 22:09:02 +0000680 else if ((address_type == eAddressTypeLoad) || (address_type == eAddressTypeFile))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000681 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000682 if (file_so_addr.IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000683 {
Greg Claytondea8cb42011-06-29 22:09:02 +0000684 // We have a file address that we were able to translate into a
685 // section offset address so we might be able to read this from
686 // the object files if we don't have a live process. Lets always
687 // try and read from the process if we have one though since we
688 // want to read the actual value by setting "prefer_file_cache"
689 // to false.
690 const bool prefer_file_cache = false;
691 if (exe_ctx->target->ReadMemory(file_so_addr, prefer_file_cache, dst, byte_size, error) != byte_size)
692 {
Greg Clayton7c8a9662010-11-02 01:50:16 +0000693 error.SetErrorStringWithFormat("read memory from 0x%llx failed", (uint64_t)address);
Greg Claytondea8cb42011-06-29 22:09:02 +0000694 }
695 }
696 else
697 {
698 if (exe_ctx->process->ReadMemory(address, dst, byte_size, error) != byte_size)
699 {
700 error.SetErrorStringWithFormat("read memory from 0x%llx failed", (uint64_t)address);
701 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000702 }
703 }
704 else
705 {
Greg Claytone0d378b2011-03-24 21:19:54 +0000706 error.SetErrorStringWithFormat ("unsupported AddressType value (%i)", address_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000707 }
708 }
709 else
710 {
Greg Clayton7c8a9662010-11-02 01:50:16 +0000711 error.SetErrorStringWithFormat ("out of memory");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000712 }
713
714 return error;
715}
716
717Scalar &
718Value::ResolveValue(ExecutionContext *exe_ctx, clang::ASTContext *ast_context)
719{
720 Scalar scalar;
721 if (m_context_type == eContextTypeValue)
722 {
723 // Resolve the proxy
724
Greg Clayton1a65ae12011-01-25 23:55:37 +0000725 Value * rhs = (Value*)m_context;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000726
Greg Clayton1a65ae12011-01-25 23:55:37 +0000727 m_value = rhs->m_value;
728 m_value_type = rhs->m_value_type;
729 m_context = rhs->m_context;
730 m_context_type = rhs->m_context_type;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000731
Greg Clayton1a65ae12011-01-25 23:55:37 +0000732 if ((uintptr_t)rhs->m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)rhs->m_data_buffer.GetBytes())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000733 {
Greg Clayton1a65ae12011-01-25 23:55:37 +0000734 m_data_buffer.CopyData(rhs->m_data_buffer.GetBytes(),
735 rhs->m_data_buffer.GetByteSize());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000736
737 m_value = (uintptr_t)m_data_buffer.GetBytes();
738 }
739 }
740
Greg Clayton526e5af2010-11-13 03:52:47 +0000741 if (m_context_type == eContextTypeClangType)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000742 {
Greg Clayton1be10fc2010-09-29 01:12:09 +0000743 void *opaque_clang_qual_type = GetClangType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000744 switch (m_value_type)
745 {
746 case eValueTypeScalar: // raw scalar value
747 break;
748
749 default:
750 case eValueTypeFileAddress:
751 m_value.Clear();
752 break;
753
754 case eValueTypeLoadAddress: // load address value
755 case eValueTypeHostAddress: // host address value (for memory in the process that is using liblldb)
756 {
Greg Claytone0d378b2011-03-24 21:19:54 +0000757 AddressType address_type = m_value_type == eValueTypeLoadAddress ? eAddressTypeLoad : eAddressTypeHost;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000758 lldb::addr_t addr = m_value.ULongLong(LLDB_INVALID_ADDRESS);
759 DataExtractor data;
Greg Claytone1a916a2010-07-21 22:12:05 +0000760 if (ClangASTType::ReadFromMemory (ast_context, opaque_clang_qual_type, exe_ctx, addr, address_type, data))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000761 {
Greg Claytone1a916a2010-07-21 22:12:05 +0000762 if (ClangASTType::GetValueAsScalar (ast_context, opaque_clang_qual_type, data, 0, data.GetByteSize(), scalar))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000763 {
764 m_value = scalar;
765 m_value_type = eValueTypeScalar;
766 }
767 else
768 {
769 if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes())
770 {
771 m_value.Clear();
772 m_value_type = eValueTypeScalar;
773 }
774 }
775 }
776 else
777 {
778 if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes())
779 {
780 m_value.Clear();
781 m_value_type = eValueTypeScalar;
782 }
783 }
784 }
785 break;
786 }
787
788
789 }
790 return m_value;
791}
792
793Variable *
794Value::GetVariable()
795{
796 if (m_context_type == eContextTypeValue)
797 return ((Value*)m_context)->GetVariable();
798
Greg Clayton526e5af2010-11-13 03:52:47 +0000799 if (m_context_type == eContextTypeVariable)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000800 return static_cast<Variable *> (m_context);
801 return NULL;
802}
803
804
805
806const char *
807Value::GetValueTypeAsCString (ValueType value_type)
808{
809 switch (value_type)
810 {
811 case eValueTypeScalar: return "scalar";
812 case eValueTypeFileAddress: return "file address";
813 case eValueTypeLoadAddress: return "load address";
814 case eValueTypeHostAddress: return "host address";
815 };
816 return "???";
817}
818
819const char *
820Value::GetContextTypeAsCString (ContextType context_type)
821{
822 switch (context_type)
823 {
824 case eContextTypeInvalid: return "invalid";
Greg Clayton526e5af2010-11-13 03:52:47 +0000825 case eContextTypeClangType: return "clang::Type *";
826 case eContextTypeRegisterInfo: return "RegisterInfo *";
827 case eContextTypeLLDBType: return "Type *";
828 case eContextTypeVariable: return "Variable *";
Greg Claytonc982c762010-07-09 20:39:50 +0000829 case eContextTypeValue: return "Value"; // TODO: Sean, more description here?
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000830 };
831 return "???";
832}
833
834ValueList::ValueList (const ValueList &rhs)
835{
836 m_values = rhs.m_values;
837}
838
839const ValueList &
840ValueList::operator= (const ValueList &rhs)
841{
842 m_values = rhs.m_values;
843 return *this;
844}
845
846void
847ValueList::PushValue (const Value &value)
848{
849 m_values.push_back (value);
850}
851
852size_t
853ValueList::GetSize()
854{
855 return m_values.size();
856}
857
858Value *
859ValueList::GetValueAtIndex (size_t idx)
860{
861 if (idx < GetSize())
862 {
863 return &(m_values[idx]);
864 }
865 else
866 return NULL;
867}
868
869void
870ValueList::Clear ()
871{
872 m_values.clear();
873}