blob: c4c17dd0428c7e8141751d851a03a50e6c47ae36 [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"
20#include "lldb/Symbol/ClangASTContext.h"
21#include "lldb/Symbol/ObjectFile.h"
22#include "lldb/Symbol/SymbolContext.h"
23#include "lldb/Symbol/Type.h"
24#include "lldb/Symbol/Variable.h"
25#include "lldb/Target/ExecutionContext.h"
26#include "lldb/Target/Process.h"
27
28using namespace lldb;
29using namespace lldb_private;
30
31Value::Value() :
32 m_value(),
33 m_value_type(eValueTypeScalar),
34 m_context(NULL),
35 m_context_type(eContextTypeInvalid)
36{
37}
38
39Value::Value(const Scalar& scalar) :
40 m_value(scalar),
41 m_value_type(eValueTypeScalar),
42 m_context(NULL),
43 m_context_type(eContextTypeInvalid)
44{
45}
46
47Value::Value(int v) :
48 m_value(v),
49 m_value_type(eValueTypeScalar),
50 m_context(NULL),
51 m_context_type(eContextTypeInvalid)
52{
53}
54
55Value::Value(unsigned int v) :
56 m_value(v),
57 m_value_type(eValueTypeScalar),
58 m_context(NULL),
59 m_context_type(eContextTypeInvalid)
60{
61}
62
63Value::Value(long v) :
64 m_value(v),
65 m_value_type(eValueTypeScalar),
66 m_context(NULL),
67 m_context_type(eContextTypeInvalid)
68{
69}
70
71Value::Value(unsigned long v) :
72 m_value(v),
73 m_value_type(eValueTypeScalar),
74 m_context(NULL),
75 m_context_type(eContextTypeInvalid)
76{
77}
78
79Value::Value(long long v) :
80 m_value(v),
81 m_value_type(eValueTypeScalar),
82 m_context(NULL),
83 m_context_type(eContextTypeInvalid)
84{
85}
86
87Value::Value(unsigned long long v) :
88 m_value(v),
89 m_value_type(eValueTypeScalar),
90 m_context(NULL),
91 m_context_type(eContextTypeInvalid)
92{
93}
94
95Value::Value(float v) :
96 m_value(v),
97 m_value_type(eValueTypeScalar),
98 m_context(NULL),
99 m_context_type(eContextTypeInvalid)
100{
101}
102
103Value::Value(double v) :
104 m_value(v),
105 m_value_type(eValueTypeScalar),
106 m_context(NULL),
107 m_context_type(eContextTypeInvalid)
108{
109}
110
111Value::Value(long double v) :
112 m_value(v),
113 m_value_type(eValueTypeScalar),
114 m_context(NULL),
115 m_context_type(eContextTypeInvalid)
116{
117}
118
119Value::Value(const uint8_t *bytes, int len) :
120 m_value(),
121 m_value_type(eValueTypeHostAddress),
122 m_context(NULL),
123 m_context_type(eContextTypeInvalid)
124{
125 m_data_buffer.CopyData(bytes, len);
126 m_value = (uintptr_t)m_data_buffer.GetBytes();
127}
128
129Value::Value(const Value &v) :
130 m_value(v.m_value),
131 m_value_type(v.m_value_type),
132 m_context(v.m_context),
133 m_context_type(v.m_context_type)
134{
135 if ((uintptr_t)v.m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)v.m_data_buffer.GetBytes())
136 {
137 m_data_buffer.CopyData(v.m_data_buffer.GetBytes(),
138 v.m_data_buffer.GetByteSize());
139
140 m_value = (uintptr_t)m_data_buffer.GetBytes();
141 }
142}
143
144Value *
145Value::CreateProxy()
146{
147 if (m_context_type == eContextTypeValue)
148 return ((Value*)m_context)->CreateProxy ();
149
150 Value *ret = new Value;
151 ret->SetContext(eContextTypeValue, this);
152 return ret;
153}
154
155Value *
156Value::GetProxyTarget()
157{
158 if (m_context_type == eContextTypeValue)
159 return (Value*)m_context;
160 else
161 return NULL;
162}
163
164//#include "clang/Lex/LiteralSupport.h"
165//#include "clang/AST/ASTContext.h"
166//#include "clang/Frontend/CompilerInstance.h"
167//
168//Value::Value (const char *data, llvm::CompilerInstance *compiler)
169//{
170// clang::NumericLiteralParser parser(data, data + strlen(data), clang::SourceLocation(),
171// compiler->getPreprocessor());
172// if (parser.had_error)
173// {
174// }
175// else if (parser.isBool)
176// {
177// APInt value;
178// parser.GetIntegerValue(value);
179// }
180// else if (parser.isLong)
181// {
182// }
183// else if (parser.isLongLong)
184// {
185// }
186// else if (parser.isFloat)
187// {
188// }
189//
190//}
191//
192void
193Value::Dump (Stream* strm)
194{
195 if (m_context_type == eContextTypeValue)
196 {
197 ((Value*)m_context)->Dump (strm);
198 return;
199 }
200
201 m_value.GetValue (strm, true);
202 strm->Printf(", value_type = %s, context = %p, context_type = %s",
203 Value::GetValueTypeAsCString(m_value_type),
204 m_context,
205 Value::GetContextTypeAsCString(m_context_type));
206}
207
208void *
209Value::GetOpaqueClangQualType()
210{
211 if (m_context_type == eContextTypeValue)
212 return ((Value*)m_context)->GetOpaqueClangQualType ();
213
214 if (m_context_type == eContextTypeOpaqueClangQualType)
215 return m_context;
216
217 return NULL;
218}
219
220Value::ValueType
221Value::GetValueType() const
222{
223 if (m_context_type == eContextTypeValue)
224 return ((Value*)m_context)->GetValueType ();
225
226 return m_value_type;
227}
228
229lldb::AddressType
230Value::GetValueAddressType () const
231{
232 if (m_context_type == eContextTypeValue)
233 return ((Value*)m_context)->GetValueAddressType ();
234
235 switch (m_value_type)
236 {
237 default:
238 case eValueTypeScalar:
239 break;
240 case eValueTypeLoadAddress: return eAddressTypeLoad;
241 case eValueTypeFileAddress: return eAddressTypeFile;
242 case eValueTypeHostAddress: return eAddressTypeHost;
243 }
244 return eAddressTypeInvalid;
245}
246
247
248Value::ContextType
249Value::GetContextType() const
250{
251 if (m_context_type == eContextTypeValue)
252 return ((Value*)m_context)->GetContextType ();
253
254 return m_context_type;
255}
256
257void
258Value::SetValueType (Value::ValueType value_type)
259{
260 if (m_context_type == eContextTypeValue)
261 {
262 ((Value*)m_context)->SetValueType(value_type);
263 return;
264 }
265
266 m_value_type = value_type;
267}
268
269void
270Value::ClearContext ()
271{
272 if (m_context_type == eContextTypeValue)
273 {
274 ((Value*)m_context)->ClearContext();
275 return;
276 }
277
278 m_context = NULL;
279 m_context_type = eContextTypeInvalid;
280}
281
282void
283Value::SetContext (Value::ContextType context_type, void *p)
284{
285 if (m_context_type == eContextTypeValue)
286 {
287 ((Value*)m_context)->SetContext(context_type, p);
288 return;
289 }
290
291 m_context_type = context_type;
292 m_context = p;
293}
294
295RegisterInfo *
296Value::GetRegisterInfo()
297{
298 if (m_context_type == eContextTypeValue)
299 return ((Value*)m_context)->GetRegisterInfo();
300
301 if (m_context_type == eContextTypeDCRegisterInfo)
302 return static_cast<RegisterInfo *> (m_context);
303 return NULL;
304}
305
306Type *
307Value::GetType()
308{
309 if (m_context_type == eContextTypeValue)
310 return ((Value*)m_context)->GetType();
311
312 if (m_context_type == eContextTypeDCType)
313 return static_cast<Type *> (m_context);
314 return NULL;
315}
316
317Scalar &
318Value::GetScalar()
319{
320 if (m_context_type == eContextTypeValue)
321 return ((Value*)m_context)->GetScalar();
322
323 return m_value;
324}
325
326void
327Value::ResizeData(int len)
328{
329 if (m_context_type == eContextTypeValue)
330 {
331 ((Value*)m_context)->ResizeData(len);
332 return;
333 }
334
335 m_value_type = eValueTypeHostAddress;
336 m_data_buffer.SetByteSize(len);
337 m_value = (uintptr_t)m_data_buffer.GetBytes();
338}
339
340bool
341Value::ValueOf(ExecutionContext *exe_ctx, clang::ASTContext *ast_context)
342{
343 if (m_context_type == eContextTypeValue)
344 return ((Value*)m_context)->ValueOf(exe_ctx, ast_context);
345
346 switch (m_context_type)
347 {
348 default:
349 case eContextTypeInvalid:
350 case eContextTypeOpaqueClangQualType: // clang::Type *
351 case eContextTypeDCRegisterInfo: // RegisterInfo *
352 case eContextTypeDCType: // Type *
353 break;
354
355 case eContextTypeDCVariable: // Variable *
356 ResolveValue(exe_ctx, ast_context);
357 return true;
358 }
359 return false;
360}
361
362size_t
363Value::GetValueByteSize (clang::ASTContext *ast_context, Error *error_ptr)
364{
365 if (m_context_type == eContextTypeValue)
366 return ((Value*)m_context)->GetValueByteSize(ast_context, error_ptr);
367
368 size_t byte_size = 0;
369
370 switch (m_context_type)
371 {
372 default:
373 case eContextTypeInvalid:
374 // If we have no context, there is no way to know how much memory to read
375 if (error_ptr)
376 error_ptr->SetErrorString ("Invalid context type, there is no way to know how much memory to read.");
377 break;
378
379 case eContextTypeOpaqueClangQualType:
380 if (ast_context == NULL)
381 {
382 if (error_ptr)
383 error_ptr->SetErrorString ("Can't determine size of opaque clang type with NULL ASTContext *.");
384 }
385 else
386 {
387 uint64_t bit_width = ClangASTContext::GetTypeBitSize (ast_context, m_context);
388 byte_size = (bit_width + 7 ) / 8;
389 }
390 break;
391
392 case eContextTypeDCRegisterInfo: // RegisterInfo *
393 if (GetRegisterInfo())
394 byte_size = GetRegisterInfo()->byte_size;
395 else if (error_ptr)
396 error_ptr->SetErrorString ("Can't determine byte size with NULL RegisterInfo *.");
397
398 break;
399
400 case eContextTypeDCType: // Type *
401 if (GetType())
402 byte_size = GetType()->GetByteSize();
403 else if (error_ptr)
404 error_ptr->SetErrorString ("Can't determine byte size with NULL Type *.");
405 break;
406
407 case eContextTypeDCVariable: // Variable *
408 if (GetVariable())
409 byte_size = GetVariable()->GetType()->GetByteSize();
410 else if (error_ptr)
411 error_ptr->SetErrorString ("Can't determine byte size with NULL Variable *.");
412 break;
413 }
414
415 if (error_ptr)
416 {
417 if (byte_size == 0)
418 {
419 if (error_ptr->Success())
420 error_ptr->SetErrorString("Unable to determine byte size.");
421 }
422 else
423 {
424 error_ptr->Clear();
425 }
426 }
427 return byte_size;
428}
429
430void *
431Value::GetValueOpaqueClangQualType ()
432{
433 if (m_context_type == eContextTypeValue)
434 return ((Value*)m_context)->GetValueOpaqueClangQualType();
435
436 switch (m_context_type)
437 {
438 default:
439 case eContextTypeInvalid:
440 break;
441
442 case eContextTypeOpaqueClangQualType:
443 return m_context;
444
445 case eContextTypeDCRegisterInfo:
446 break; // TODO: Eventually convert into a clang type?
447
448 case eContextTypeDCType:
449 if (GetType())
450 return GetType()->GetOpaqueClangQualType();
451 break;
452
453 case eContextTypeDCVariable:
454 if (GetVariable())
455 return GetVariable()->GetType()->GetOpaqueClangQualType();
456 break;
457 }
458
459 return NULL;
460}
461
462lldb::Format
463Value::GetValueDefaultFormat ()
464{
465 if (m_context_type == eContextTypeValue)
466 return ((Value*)m_context)->GetValueDefaultFormat();
467
468 switch (m_context_type)
469 {
470 default:
471 case eContextTypeInvalid:
472 break;
473
474 case eContextTypeOpaqueClangQualType:
475 return Type::GetFormat (m_context);
476
477 case eContextTypeDCRegisterInfo:
478 if (GetRegisterInfo())
479 return GetRegisterInfo()->format;
480 break;
481
482 case eContextTypeDCType:
483 if (GetType())
484 return GetType()->GetFormat();
485 break;
486
487 case eContextTypeDCVariable:
488 if (GetVariable())
489 return GetVariable()->GetType()->GetFormat();
490 break;
491
492 }
493
494 // Return a good default in case we can't figure anything out
495 return eFormatHex;
496}
497
498Error
499Value::GetValueAsData (ExecutionContext *exe_ctx, clang::ASTContext *ast_context, DataExtractor &data, uint32_t data_offset)
500{
501 if (m_context_type == eContextTypeValue)
502 return ((Value*)m_context)->GetValueAsData(exe_ctx, ast_context, data, data_offset);
503
504 data.Clear();
505
506 Error error;
507 lldb::addr_t address = LLDB_INVALID_ADDRESS;
508 lldb::AddressType address_type = eAddressTypeFile;
509 switch (m_value_type)
510 {
511 default:
512 error.SetErrorStringWithFormat("Invalid value type %i.\n", m_value_type);
513 break;
514
515 case eValueTypeScalar:
516 data.SetByteOrder (eByteOrderHost);
517 data.SetAddressByteSize(sizeof(void *));
518 if (m_value.GetData (data))
519 return error; // Success;
520 error.SetErrorStringWithFormat("Extracting data from value failed.\n");
521 break;
522
523 case eValueTypeLoadAddress:
524 if (exe_ctx == NULL)
525 {
526 error.SetErrorString ("Can't read memory (no execution context).");
527 }
528 else if (exe_ctx->process == NULL)
529 {
530 error.SetErrorString ("Can't read memory (invalid process).");
531 }
532 else
533 {
534 address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
535 address_type = eAddressTypeLoad;
536 data.SetByteOrder(exe_ctx->process->GetByteOrder());
537 data.SetAddressByteSize(exe_ctx->process->GetAddressByteSize());
538 }
539 break;
540
541 case eValueTypeFileAddress:
542 {
543 // The only thing we can currently lock down to a module so that
544 // we can resolve a file address, is a variable.
545 Variable *variable = GetVariable();
546
547 if (GetVariable())
548 {
549 lldb::addr_t file_addr = m_value.ULongLong(LLDB_INVALID_ADDRESS);
550 if (file_addr != LLDB_INVALID_ADDRESS)
551 {
552 SymbolContext var_sc;
553 variable->CalculateSymbolContext(&var_sc);
554 if (var_sc.module_sp)
555 {
556 ObjectFile *objfile = var_sc.module_sp->GetObjectFile();
557 if (objfile)
558 {
559 Address so_addr(file_addr, objfile->GetSectionList());
560 address = so_addr.GetLoadAddress (exe_ctx->process);
561 if (address != LLDB_INVALID_ADDRESS)
562 address_type = eAddressTypeLoad;
563 }
564 if (address_type == eAddressTypeFile)
565 error.SetErrorStringWithFormat ("%s is not loaded.\n", var_sc.module_sp->GetFileSpec().GetFilename().AsCString());
566 }
567 else
568 {
569 error.SetErrorStringWithFormat ("Unable to resolve the module for file address 0x%llx for variable '%s'.\n", file_addr, variable->GetName().AsCString(""));
570 }
571 }
572 else
573 {
574 error.SetErrorString ("Invalid file address.");
575 }
576 }
577 else
578 {
579 // Can't convert a file address to anything valid without more
580 // context (which Module it came from)
581 error.SetErrorString ("Can't read memory from file address without more context.");
582 }
583 }
584 break;
585
586 case eValueTypeHostAddress:
587 address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
588 data.SetByteOrder(eByteOrderHost);
589 data.SetAddressByteSize(sizeof(void *));
590 address_type = eAddressTypeHost;
591 break;
592 }
593
594 // Bail if we encountered any errors
595 if (error.Fail())
596 return error;
597
598 if (address == LLDB_INVALID_ADDRESS)
599 {
600 error.SetErrorStringWithFormat ("Invalid %s address.\n", address_type == eAddressTypeHost ? "host" : "load");
601 return error;
602 }
603
604 // If we got here, we need to read the value from memory
605 uint32_t byte_size = GetValueByteSize (ast_context, &error);
606
607 // Bail if we encountered any errors getting the byte size
608 if (error.Fail())
609 return error;
610
611 // Make sure we have enough room within "data", and if we don't make
612 // something large enough that does
613 if (!data.ValidOffsetForDataOfSize (data_offset, byte_size))
614 {
615 DataBufferSP data_sp(new DataBufferHeap (data_offset + byte_size, '\0'));
616 data.SetData(data_sp);
617 }
618
619 uint8_t* dst = (uint8_t*)data.PeekData (data_offset, byte_size);
620 if (dst != NULL)
621 {
622 if (address_type == eAddressTypeHost)
623 {
624 // The address is an address in this process, so just copy it
625 memcpy (dst, (uint8_t*)NULL + address, byte_size);
626 }
627 else if (address_type == eAddressTypeLoad)
628 {
629 if (exe_ctx->process->ReadMemory(address, dst, byte_size, error) != byte_size)
630 {
631 if (error.Success())
632 error.SetErrorStringWithFormat("read %u bytes of memory from 0x%llx failed", (uint64_t)address, byte_size);
633 }
634 }
635 else
636 {
637 error.SetErrorStringWithFormat ("Unsupported lldb::AddressType value (%i).\n", address_type);
638 }
639 }
640 else
641 {
642 error.SetErrorStringWithFormat ("Out of memory.\n");
643 }
644
645 return error;
646}
647
648Scalar &
649Value::ResolveValue(ExecutionContext *exe_ctx, clang::ASTContext *ast_context)
650{
651 Scalar scalar;
652 if (m_context_type == eContextTypeValue)
653 {
654 // Resolve the proxy
655
656 Value * v = (Value*)m_context;
657
658 m_value = v->m_value;
659 m_value_type = v->m_value_type;
660 m_context = v->m_context;
661 m_context_type = v->m_context_type;
662
663 if ((uintptr_t)v->m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)v->m_data_buffer.GetBytes())
664 {
665 m_data_buffer.CopyData(v->m_data_buffer.GetBytes(),
666 v->m_data_buffer.GetByteSize());
667
668 m_value = (uintptr_t)m_data_buffer.GetBytes();
669 }
670 }
671
672 if (m_context_type == eContextTypeOpaqueClangQualType)
673 {
674 void *opaque_clang_qual_type = GetOpaqueClangQualType();
675 switch (m_value_type)
676 {
677 case eValueTypeScalar: // raw scalar value
678 break;
679
680 default:
681 case eValueTypeFileAddress:
682 m_value.Clear();
683 break;
684
685 case eValueTypeLoadAddress: // load address value
686 case eValueTypeHostAddress: // host address value (for memory in the process that is using liblldb)
687 {
688 lldb::AddressType address_type = m_value_type == eValueTypeLoadAddress ? eAddressTypeLoad : eAddressTypeHost;
689 lldb::addr_t addr = m_value.ULongLong(LLDB_INVALID_ADDRESS);
690 DataExtractor data;
691 if (Type::ReadFromMemory (exe_ctx, ast_context, opaque_clang_qual_type, addr, address_type, data))
692 {
693 if (Type::GetValueAsScalar (ast_context, opaque_clang_qual_type, data, 0, data.GetByteSize(), scalar))
694 {
695 m_value = scalar;
696 m_value_type = eValueTypeScalar;
697 }
698 else
699 {
700 if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes())
701 {
702 m_value.Clear();
703 m_value_type = eValueTypeScalar;
704 }
705 }
706 }
707 else
708 {
709 if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes())
710 {
711 m_value.Clear();
712 m_value_type = eValueTypeScalar;
713 }
714 }
715 }
716 break;
717 }
718
719
720 }
721 return m_value;
722}
723
724Variable *
725Value::GetVariable()
726{
727 if (m_context_type == eContextTypeValue)
728 return ((Value*)m_context)->GetVariable();
729
730 if (m_context_type == eContextTypeDCVariable)
731 return static_cast<Variable *> (m_context);
732 return NULL;
733}
734
735
736
737const char *
738Value::GetValueTypeAsCString (ValueType value_type)
739{
740 switch (value_type)
741 {
742 case eValueTypeScalar: return "scalar";
743 case eValueTypeFileAddress: return "file address";
744 case eValueTypeLoadAddress: return "load address";
745 case eValueTypeHostAddress: return "host address";
746 };
747 return "???";
748}
749
750const char *
751Value::GetContextTypeAsCString (ContextType context_type)
752{
753 switch (context_type)
754 {
755 case eContextTypeInvalid: return "invalid";
756 case eContextTypeOpaqueClangQualType: return "clang::Type *";
757 case eContextTypeDCRegisterInfo: return "RegisterInfo *";
758 case eContextTypeDCType: return "Type *";
759 case eContextTypeDCVariable: return "Variable *";
760 };
761 return "???";
762}
763
764ValueList::ValueList (const ValueList &rhs)
765{
766 m_values = rhs.m_values;
767}
768
769const ValueList &
770ValueList::operator= (const ValueList &rhs)
771{
772 m_values = rhs.m_values;
773 return *this;
774}
775
776void
777ValueList::PushValue (const Value &value)
778{
779 m_values.push_back (value);
780}
781
782size_t
783ValueList::GetSize()
784{
785 return m_values.size();
786}
787
788Value *
789ValueList::GetValueAtIndex (size_t idx)
790{
791 if (idx < GetSize())
792 {
793 return &(m_values[idx]);
794 }
795 else
796 return NULL;
797}
798
799void
800ValueList::Clear ()
801{
802 m_values.clear();
803}