ValueObject.h revision 269024
1//===-- ValueObject.h -------------------------------------------*- 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#ifndef liblldb_ValueObject_h_ 11#define liblldb_ValueObject_h_ 12 13// C Includes 14// C++ Includes 15#include <map> 16#include <vector> 17// Other libraries and framework includes 18// Project includes 19 20#include "lldb/lldb-private.h" 21#include "lldb/Core/DataExtractor.h" 22#include "lldb/Core/Error.h" 23#include "lldb/Core/Flags.h" 24#include "lldb/Core/ConstString.h" 25#include "lldb/Core/UserID.h" 26#include "lldb/Core/Value.h" 27#include "lldb/Target/ExecutionContext.h" 28#include "lldb/Target/ExecutionContextScope.h" 29#include "lldb/Target/Process.h" 30#include "lldb/Target/StackID.h" 31#include "lldb/Utility/SharedCluster.h" 32 33namespace lldb_private { 34 35/// ValueObject: 36/// 37/// This abstract class provides an interface to a particular value, be it a register, a local or global variable, 38/// that is evaluated in some particular scope. The ValueObject also has the capibility of being the "child" of 39/// some other variable object, and in turn of having children. 40/// If a ValueObject is a root variable object - having no parent - then it must be constructed with respect to some 41/// particular ExecutionContextScope. If it is a child, it inherits the ExecutionContextScope from its parent. 42/// The ValueObject will update itself if necessary before fetching its value, summary, object description, etc. 43/// But it will always update itself in the ExecutionContextScope with which it was originally created. 44 45/// A brief note on life cycle management for ValueObjects. This is a little tricky because a ValueObject can contain 46/// various other ValueObjects - the Dynamic Value, its children, the dereference value, etc. Any one of these can be 47/// handed out as a shared pointer, but for that contained value object to be valid, the root object and potentially other 48/// of the value objects need to stay around. 49/// We solve this problem by handing out shared pointers to the Value Object and any of its dependents using a shared 50/// ClusterManager. This treats each shared pointer handed out for the entire cluster as a reference to the whole 51/// cluster. The whole cluster will stay around until the last reference is released. 52/// 53/// The ValueObject mostly handle this automatically, if a value object is made with a Parent ValueObject, then it adds 54/// itself to the ClusterManager of the parent. 55 56/// It does mean that external to the ValueObjects we should only ever make available ValueObjectSP's, never ValueObjects 57/// or pointers to them. So all the "Root level" ValueObject derived constructors should be private, and 58/// should implement a Create function that new's up object and returns a Shared Pointer that it gets from the GetSP() method. 59/// 60/// However, if you are making an derived ValueObject that will be contained in a parent value object, you should just 61/// hold onto a pointer to it internally, and by virtue of passing the parent ValueObject into its constructor, it will 62/// be added to the ClusterManager for the parent. Then if you ever hand out a Shared Pointer to the contained ValueObject, 63/// just do so by calling GetSP() on the contained object. 64 65class ValueObject : public UserID 66{ 67public: 68 69 enum GetExpressionPathFormat 70 { 71 eGetExpressionPathFormatDereferencePointers = 1, 72 eGetExpressionPathFormatHonorPointers 73 }; 74 75 enum ValueObjectRepresentationStyle 76 { 77 eValueObjectRepresentationStyleValue = 1, 78 eValueObjectRepresentationStyleSummary, 79 eValueObjectRepresentationStyleLanguageSpecific, 80 eValueObjectRepresentationStyleLocation, 81 eValueObjectRepresentationStyleChildrenCount, 82 eValueObjectRepresentationStyleType, 83 eValueObjectRepresentationStyleName, 84 eValueObjectRepresentationStyleExpressionPath 85 }; 86 87 enum ExpressionPathScanEndReason 88 { 89 eExpressionPathScanEndReasonEndOfString = 1, // out of data to parse 90 eExpressionPathScanEndReasonNoSuchChild, // child element not found 91 eExpressionPathScanEndReasonEmptyRangeNotAllowed, // [] only allowed for arrays 92 eExpressionPathScanEndReasonDotInsteadOfArrow, // . used when -> should be used 93 eExpressionPathScanEndReasonArrowInsteadOfDot, // -> used when . should be used 94 eExpressionPathScanEndReasonFragileIVarNotAllowed, // ObjC ivar expansion not allowed 95 eExpressionPathScanEndReasonRangeOperatorNotAllowed, // [] not allowed by options 96 eExpressionPathScanEndReasonRangeOperatorInvalid, // [] not valid on objects other than scalars, pointers or arrays 97 eExpressionPathScanEndReasonArrayRangeOperatorMet, // [] is good for arrays, but I cannot parse it 98 eExpressionPathScanEndReasonBitfieldRangeOperatorMet, // [] is good for bitfields, but I cannot parse after it 99 eExpressionPathScanEndReasonUnexpectedSymbol, // something is malformed in the expression 100 eExpressionPathScanEndReasonTakingAddressFailed, // impossible to apply & operator 101 eExpressionPathScanEndReasonDereferencingFailed, // impossible to apply * operator 102 eExpressionPathScanEndReasonRangeOperatorExpanded, // [] was expanded into a VOList 103 eExpressionPathScanEndReasonSyntheticValueMissing, // getting the synthetic children failed 104 eExpressionPathScanEndReasonUnknown = 0xFFFF 105 }; 106 107 enum ExpressionPathEndResultType 108 { 109 eExpressionPathEndResultTypePlain = 1, // anything but... 110 eExpressionPathEndResultTypeBitfield, // a bitfield 111 eExpressionPathEndResultTypeBoundedRange, // a range [low-high] 112 eExpressionPathEndResultTypeUnboundedRange, // a range [] 113 eExpressionPathEndResultTypeValueObjectList, // several items in a VOList 114 eExpressionPathEndResultTypeInvalid = 0xFFFF 115 }; 116 117 enum ExpressionPathAftermath 118 { 119 eExpressionPathAftermathNothing = 1, // just return it 120 eExpressionPathAftermathDereference, // dereference the target 121 eExpressionPathAftermathTakeAddress // take target's address 122 }; 123 124 enum ClearUserVisibleDataItems 125 { 126 eClearUserVisibleDataItemsNothing = 1u << 0, 127 eClearUserVisibleDataItemsValue = 1u << 1, 128 eClearUserVisibleDataItemsSummary = 1u << 2, 129 eClearUserVisibleDataItemsLocation = 1u << 3, 130 eClearUserVisibleDataItemsDescription = 1u << 4, 131 eClearUserVisibleDataItemsSyntheticChildren = 1u << 5, 132 eClearUserVisibleDataItemsAllStrings = eClearUserVisibleDataItemsValue | eClearUserVisibleDataItemsSummary | eClearUserVisibleDataItemsLocation | eClearUserVisibleDataItemsDescription, 133 eClearUserVisibleDataItemsAll = 0xFFFF 134 }; 135 136 struct GetValueForExpressionPathOptions 137 { 138 bool m_check_dot_vs_arrow_syntax; 139 bool m_no_fragile_ivar; 140 bool m_allow_bitfields_syntax; 141 bool m_no_synthetic_children; 142 143 GetValueForExpressionPathOptions(bool dot = false, 144 bool no_ivar = false, 145 bool bitfield = true, 146 bool no_synth = false) : 147 m_check_dot_vs_arrow_syntax(dot), 148 m_no_fragile_ivar(no_ivar), 149 m_allow_bitfields_syntax(bitfield), 150 m_no_synthetic_children(no_synth) 151 { 152 } 153 154 GetValueForExpressionPathOptions& 155 DoCheckDotVsArrowSyntax() 156 { 157 m_check_dot_vs_arrow_syntax = true; 158 return *this; 159 } 160 161 GetValueForExpressionPathOptions& 162 DontCheckDotVsArrowSyntax() 163 { 164 m_check_dot_vs_arrow_syntax = false; 165 return *this; 166 } 167 168 GetValueForExpressionPathOptions& 169 DoAllowFragileIVar() 170 { 171 m_no_fragile_ivar = false; 172 return *this; 173 } 174 175 GetValueForExpressionPathOptions& 176 DontAllowFragileIVar() 177 { 178 m_no_fragile_ivar = true; 179 return *this; 180 } 181 182 GetValueForExpressionPathOptions& 183 DoAllowBitfieldSyntax() 184 { 185 m_allow_bitfields_syntax = true; 186 return *this; 187 } 188 189 GetValueForExpressionPathOptions& 190 DontAllowBitfieldSyntax() 191 { 192 m_allow_bitfields_syntax = false; 193 return *this; 194 } 195 196 GetValueForExpressionPathOptions& 197 DoAllowSyntheticChildren() 198 { 199 m_no_synthetic_children = false; 200 return *this; 201 } 202 203 GetValueForExpressionPathOptions& 204 DontAllowSyntheticChildren() 205 { 206 m_no_synthetic_children = true; 207 return *this; 208 } 209 210 static const GetValueForExpressionPathOptions 211 DefaultOptions() 212 { 213 static GetValueForExpressionPathOptions g_default_options; 214 215 return g_default_options; 216 } 217 218 }; 219 220 class EvaluationPoint 221 { 222 public: 223 224 EvaluationPoint (); 225 226 EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected = false); 227 228 EvaluationPoint (const EvaluationPoint &rhs); 229 230 ~EvaluationPoint (); 231 232 const ExecutionContextRef & 233 GetExecutionContextRef() const 234 { 235 return m_exe_ctx_ref; 236 } 237 238 // Set the EvaluationPoint to the values in exe_scope, 239 // Return true if the Evaluation Point changed. 240 // Since the ExecutionContextScope is always going to be valid currently, 241 // the Updated Context will also always be valid. 242 243// bool 244// SetContext (ExecutionContextScope *exe_scope); 245 246 void 247 SetIsConstant () 248 { 249 SetUpdated(); 250 m_mod_id.SetInvalid(); 251 } 252 253 bool 254 IsConstant () const 255 { 256 return !m_mod_id.IsValid(); 257 } 258 259 ProcessModID 260 GetModID () const 261 { 262 return m_mod_id; 263 } 264 265 void 266 SetUpdateID (ProcessModID new_id) 267 { 268 m_mod_id = new_id; 269 } 270 271 bool 272 IsFirstEvaluation () const 273 { 274 return m_first_update; 275 } 276 277 void 278 SetNeedsUpdate () 279 { 280 m_needs_update = true; 281 } 282 283 void 284 SetUpdated (); 285 286 bool 287 NeedsUpdating() 288 { 289 SyncWithProcessState(); 290 return m_needs_update; 291 } 292 293 bool 294 IsValid () 295 { 296 if (!m_mod_id.IsValid()) 297 return false; 298 else if (SyncWithProcessState ()) 299 { 300 if (!m_mod_id.IsValid()) 301 return false; 302 } 303 return true; 304 } 305 306 void 307 SetInvalid () 308 { 309 // Use the stop id to mark us as invalid, leave the thread id and the stack id around for logging and 310 // history purposes. 311 m_mod_id.SetInvalid(); 312 313 // Can't update an invalid state. 314 m_needs_update = false; 315 316 } 317 318 private: 319 bool 320 SyncWithProcessState (); 321 322 ProcessModID m_mod_id; // This is the stop id when this ValueObject was last evaluated. 323 ExecutionContextRef m_exe_ctx_ref; 324 bool m_needs_update; 325 bool m_first_update; 326 }; 327 328 const EvaluationPoint & 329 GetUpdatePoint () const 330 { 331 return m_update_point; 332 } 333 334 EvaluationPoint & 335 GetUpdatePoint () 336 { 337 return m_update_point; 338 } 339 340 const ExecutionContextRef & 341 GetExecutionContextRef() const 342 { 343 return m_update_point.GetExecutionContextRef(); 344 } 345 346 lldb::TargetSP 347 GetTargetSP() const 348 { 349 return m_update_point.GetExecutionContextRef().GetTargetSP(); 350 } 351 352 lldb::ProcessSP 353 GetProcessSP() const 354 { 355 return m_update_point.GetExecutionContextRef().GetProcessSP(); 356 } 357 358 lldb::ThreadSP 359 GetThreadSP() const 360 { 361 return m_update_point.GetExecutionContextRef().GetThreadSP(); 362 } 363 364 lldb::StackFrameSP 365 GetFrameSP() const 366 { 367 return m_update_point.GetExecutionContextRef().GetFrameSP(); 368 } 369 370 void 371 SetNeedsUpdate (); 372 373 virtual ~ValueObject(); 374 375 ClangASTType 376 GetClangType (); 377 378 // this vends a TypeImpl that is useful at the SB API layer 379 virtual TypeImpl 380 GetTypeImpl (); 381 382 //------------------------------------------------------------------ 383 // Sublasses must implement the functions below. 384 //------------------------------------------------------------------ 385 virtual uint64_t 386 GetByteSize() = 0; 387 388 virtual lldb::ValueType 389 GetValueType() const = 0; 390 391 //------------------------------------------------------------------ 392 // Sublasses can implement the functions below. 393 //------------------------------------------------------------------ 394 virtual ConstString 395 GetTypeName(); 396 397 virtual ConstString 398 GetQualifiedTypeName(); 399 400 virtual lldb::LanguageType 401 GetObjectRuntimeLanguage(); 402 403 virtual uint32_t 404 GetTypeInfo (ClangASTType *pointee_or_element_clang_type = NULL); 405 406 virtual bool 407 IsPointerType (); 408 409 virtual bool 410 IsArrayType (); 411 412 virtual bool 413 IsScalarType (); 414 415 virtual bool 416 IsPointerOrReferenceType (); 417 418 virtual bool 419 IsPossibleDynamicType (); 420 421 virtual bool 422 IsObjCNil (); 423 424 virtual bool 425 IsBaseClass () 426 { 427 return false; 428 } 429 430 virtual bool 431 IsDereferenceOfParent () 432 { 433 return false; 434 } 435 436 bool 437 IsIntegerType (bool &is_signed); 438 439 virtual bool 440 GetBaseClassPath (Stream &s); 441 442 virtual void 443 GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat = eGetExpressionPathFormatDereferencePointers); 444 445 lldb::ValueObjectSP 446 GetValueForExpressionPath(const char* expression, 447 const char** first_unparsed = NULL, 448 ExpressionPathScanEndReason* reason_to_stop = NULL, 449 ExpressionPathEndResultType* final_value_type = NULL, 450 const GetValueForExpressionPathOptions& options = GetValueForExpressionPathOptions::DefaultOptions(), 451 ExpressionPathAftermath* final_task_on_target = NULL); 452 453 int 454 GetValuesForExpressionPath(const char* expression, 455 lldb::ValueObjectListSP& list, 456 const char** first_unparsed = NULL, 457 ExpressionPathScanEndReason* reason_to_stop = NULL, 458 ExpressionPathEndResultType* final_value_type = NULL, 459 const GetValueForExpressionPathOptions& options = GetValueForExpressionPathOptions::DefaultOptions(), 460 ExpressionPathAftermath* final_task_on_target = NULL); 461 462 virtual bool 463 IsInScope () 464 { 465 return true; 466 } 467 468 virtual off_t 469 GetByteOffset() 470 { 471 return 0; 472 } 473 474 virtual uint32_t 475 GetBitfieldBitSize () 476 { 477 return 0; 478 } 479 480 virtual uint32_t 481 GetBitfieldBitOffset () 482 { 483 return 0; 484 } 485 486 bool 487 IsBitfield () 488 { 489 return (GetBitfieldBitSize() != 0) || (GetBitfieldBitOffset() != 0); 490 } 491 492 virtual bool 493 IsArrayItemForPointer() 494 { 495 return m_is_array_item_for_pointer; 496 } 497 498 virtual const char * 499 GetValueAsCString (); 500 501 virtual bool 502 GetValueAsCString (const lldb_private::TypeFormatImpl& format, 503 std::string& destination); 504 505 bool 506 GetValueAsCString (lldb::Format format, 507 std::string& destination); 508 509 virtual uint64_t 510 GetValueAsUnsigned (uint64_t fail_value, bool *success = NULL); 511 512 virtual int64_t 513 GetValueAsSigned (int64_t fail_value, bool *success = NULL); 514 515 virtual bool 516 SetValueFromCString (const char *value_str, Error& error); 517 518 // Return the module associated with this value object in case the 519 // value is from an executable file and might have its data in 520 // sections of the file. This can be used for variables. 521 virtual lldb::ModuleSP 522 GetModule(); 523 524 virtual ValueObject* 525 GetRoot (); 526 527 virtual bool 528 GetDeclaration (Declaration &decl); 529 530 //------------------------------------------------------------------ 531 // The functions below should NOT be modified by sublasses 532 //------------------------------------------------------------------ 533 const Error & 534 GetError(); 535 536 const ConstString & 537 GetName() const; 538 539 virtual lldb::ValueObjectSP 540 GetChildAtIndex (size_t idx, bool can_create); 541 542 // this will always create the children if necessary 543 lldb::ValueObjectSP 544 GetChildAtIndexPath (const std::initializer_list<size_t> &idxs, 545 size_t* index_of_error = NULL); 546 547 lldb::ValueObjectSP 548 GetChildAtIndexPath (const std::vector<size_t> &idxs, 549 size_t* index_of_error = NULL); 550 551 lldb::ValueObjectSP 552 GetChildAtIndexPath (const std::initializer_list< std::pair<size_t, bool> > &idxs, 553 size_t* index_of_error = NULL); 554 555 lldb::ValueObjectSP 556 GetChildAtIndexPath (const std::vector< std::pair<size_t, bool> > &idxs, 557 size_t* index_of_error = NULL); 558 559 // this will always create the children if necessary 560 lldb::ValueObjectSP 561 GetChildAtNamePath (const std::initializer_list<ConstString> &names, 562 ConstString* name_of_error = NULL); 563 564 lldb::ValueObjectSP 565 GetChildAtNamePath (const std::vector<ConstString> &names, 566 ConstString* name_of_error = NULL); 567 568 lldb::ValueObjectSP 569 GetChildAtNamePath (const std::initializer_list< std::pair<ConstString, bool> > &names, 570 ConstString* name_of_error = NULL); 571 572 lldb::ValueObjectSP 573 GetChildAtNamePath (const std::vector< std::pair<ConstString, bool> > &names, 574 ConstString* name_of_error = NULL); 575 576 virtual lldb::ValueObjectSP 577 GetChildMemberWithName (const ConstString &name, bool can_create); 578 579 virtual size_t 580 GetIndexOfChildWithName (const ConstString &name); 581 582 size_t 583 GetNumChildren (); 584 585 const Value & 586 GetValue() const; 587 588 Value & 589 GetValue(); 590 591 virtual bool 592 ResolveValue (Scalar &scalar); 593 594 virtual const char * 595 GetLocationAsCString (); 596 597 const char * 598 GetSummaryAsCString (); 599 600 bool 601 GetSummaryAsCString (TypeSummaryImpl* summary_ptr, 602 std::string& destination); 603 604 const char * 605 GetObjectDescription (); 606 607 bool 608 HasSpecialPrintableRepresentation (ValueObjectRepresentationStyle val_obj_display, 609 lldb::Format custom_format); 610 611 enum PrintableRepresentationSpecialCases 612 { 613 ePrintableRepresentationSpecialCasesDisable = 0, 614 ePrintableRepresentationSpecialCasesAllow = 1, 615 ePrintableRepresentationSpecialCasesOnly = 3 616 }; 617 618 bool 619 DumpPrintableRepresentation (Stream& s, 620 ValueObjectRepresentationStyle val_obj_display = eValueObjectRepresentationStyleSummary, 621 lldb::Format custom_format = lldb::eFormatInvalid, 622 PrintableRepresentationSpecialCases special = ePrintableRepresentationSpecialCasesAllow, 623 bool do_dump_error = true); 624 bool 625 GetValueIsValid () const; 626 627 bool 628 GetValueDidChange (); 629 630 bool 631 UpdateValueIfNeeded (bool update_format = true); 632 633 bool 634 UpdateFormatsIfNeeded(); 635 636 lldb::ValueObjectSP 637 GetSP () 638 { 639 return m_manager->GetSharedPointer(this); 640 } 641 642 void 643 SetName (const ConstString &name); 644 645 virtual lldb::addr_t 646 GetAddressOf (bool scalar_is_load_address = true, 647 AddressType *address_type = NULL); 648 649 lldb::addr_t 650 GetPointerValue (AddressType *address_type = NULL); 651 652 lldb::ValueObjectSP 653 GetSyntheticChild (const ConstString &key) const; 654 655 lldb::ValueObjectSP 656 GetSyntheticArrayMember (size_t index, bool can_create); 657 658 lldb::ValueObjectSP 659 GetSyntheticArrayMemberFromPointer (size_t index, bool can_create); 660 661 lldb::ValueObjectSP 662 GetSyntheticArrayMemberFromArray (size_t index, bool can_create); 663 664 lldb::ValueObjectSP 665 GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create); 666 667 lldb::ValueObjectSP 668 GetSyntheticExpressionPathChild(const char* expression, bool can_create); 669 670 virtual lldb::ValueObjectSP 671 GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create); 672 673 virtual lldb::ValueObjectSP 674 GetDynamicValue (lldb::DynamicValueType valueType); 675 676 lldb::DynamicValueType 677 GetDynamicValueType (); 678 679 virtual lldb::ValueObjectSP 680 GetStaticValue (); 681 682 virtual lldb::ValueObjectSP 683 GetNonSyntheticValue (); 684 685 lldb::ValueObjectSP 686 GetSyntheticValue (bool use_synthetic = true); 687 688 virtual bool 689 HasSyntheticValue(); 690 691 virtual bool 692 IsSynthetic() { return false; } 693 694 virtual lldb::ValueObjectSP 695 CreateConstantValue (const ConstString &name); 696 697 virtual lldb::ValueObjectSP 698 Dereference (Error &error); 699 700 virtual lldb::ValueObjectSP 701 AddressOf (Error &error); 702 703 virtual lldb::addr_t 704 GetLiveAddress() 705 { 706 return LLDB_INVALID_ADDRESS; 707 } 708 709 virtual void 710 SetLiveAddress(lldb::addr_t addr = LLDB_INVALID_ADDRESS, 711 AddressType address_type = eAddressTypeLoad) 712 { 713 } 714 715 virtual lldb::ValueObjectSP 716 Cast (const ClangASTType &clang_ast_type); 717 718 virtual lldb::ValueObjectSP 719 CastPointerType (const char *name, 720 ClangASTType &ast_type); 721 722 virtual lldb::ValueObjectSP 723 CastPointerType (const char *name, 724 lldb::TypeSP &type_sp); 725 726 // The backing bits of this value object were updated, clear any 727 // descriptive string, so we know we have to refetch them 728 virtual void 729 ValueUpdated () 730 { 731 ClearUserVisibleData(eClearUserVisibleDataItemsValue | 732 eClearUserVisibleDataItemsSummary | 733 eClearUserVisibleDataItemsDescription); 734 } 735 736 virtual bool 737 IsDynamic () 738 { 739 return false; 740 } 741 742 virtual SymbolContextScope * 743 GetSymbolContextScope(); 744 745 void 746 Dump (Stream &s); 747 748 void 749 Dump (Stream &s, 750 const DumpValueObjectOptions& options); 751 752 static lldb::ValueObjectSP 753 CreateValueObjectFromExpression (const char* name, 754 const char* expression, 755 const ExecutionContext& exe_ctx); 756 757 static lldb::ValueObjectSP 758 CreateValueObjectFromAddress (const char* name, 759 uint64_t address, 760 const ExecutionContext& exe_ctx, 761 ClangASTType type); 762 763 static lldb::ValueObjectSP 764 CreateValueObjectFromData (const char* name, 765 DataExtractor& data, 766 const ExecutionContext& exe_ctx, 767 ClangASTType type); 768 769 void 770 LogValueObject (Log *log); 771 772 void 773 LogValueObject (Log *log, 774 const DumpValueObjectOptions& options); 775 776 777 // returns true if this is a char* or a char[] 778 // if it is a char* and check_pointer is true, 779 // it also checks that the pointer is valid 780 bool 781 IsCStringContainer (bool check_pointer = false); 782 783 size_t 784 ReadPointedString (Stream& s, 785 Error& error, 786 uint32_t max_length = 0, 787 bool honor_array = true, 788 lldb::Format item_format = lldb::eFormatCharArray); 789 790 virtual size_t 791 GetPointeeData (DataExtractor& data, 792 uint32_t item_idx = 0, 793 uint32_t item_count = 1); 794 795 virtual uint64_t 796 GetData (DataExtractor& data); 797 798 virtual bool 799 SetData (DataExtractor &data, Error &error); 800 801 bool 802 GetIsConstant () const 803 { 804 return m_update_point.IsConstant(); 805 } 806 807 void 808 SetIsConstant () 809 { 810 m_update_point.SetIsConstant(); 811 } 812 813 lldb::Format 814 GetFormat () const; 815 816 void 817 SetFormat (lldb::Format format) 818 { 819 if (format != m_format) 820 ClearUserVisibleData(eClearUserVisibleDataItemsValue); 821 m_format = format; 822 } 823 824 lldb::TypeSummaryImplSP 825 GetSummaryFormat() 826 { 827 UpdateFormatsIfNeeded(); 828 return m_type_summary_sp; 829 } 830 831 void 832 SetSummaryFormat(lldb::TypeSummaryImplSP format) 833 { 834 m_type_summary_sp = format; 835 ClearUserVisibleData(eClearUserVisibleDataItemsSummary); 836 } 837 838 void 839 SetValueFormat(lldb::TypeFormatImplSP format) 840 { 841 m_type_format_sp = format; 842 ClearUserVisibleData(eClearUserVisibleDataItemsValue); 843 } 844 845 lldb::TypeFormatImplSP 846 GetValueFormat() 847 { 848 UpdateFormatsIfNeeded(); 849 return m_type_format_sp; 850 } 851 852 void 853 SetSyntheticChildren(const lldb::SyntheticChildrenSP &synth_sp) 854 { 855 if (synth_sp.get() == m_synthetic_children_sp.get()) 856 return; 857 ClearUserVisibleData(eClearUserVisibleDataItemsSyntheticChildren); 858 m_synthetic_children_sp = synth_sp; 859 } 860 861 lldb::SyntheticChildrenSP 862 GetSyntheticChildren() 863 { 864 UpdateFormatsIfNeeded(); 865 return m_synthetic_children_sp; 866 } 867 868 // Use GetParent for display purposes, but if you want to tell the parent to update itself 869 // then use m_parent. The ValueObjectDynamicValue's parent is not the correct parent for 870 // displaying, they are really siblings, so for display it needs to route through to its grandparent. 871 virtual ValueObject * 872 GetParent() 873 { 874 return m_parent; 875 } 876 877 virtual const ValueObject * 878 GetParent() const 879 { 880 return m_parent; 881 } 882 883 ValueObject * 884 GetNonBaseClassParent(); 885 886 void 887 SetAddressTypeOfChildren(AddressType at) 888 { 889 m_address_type_of_ptr_or_ref_children = at; 890 } 891 892 AddressType 893 GetAddressTypeOfChildren(); 894 895 void 896 SetHasCompleteType() 897 { 898 m_did_calculate_complete_objc_class_type = true; 899 } 900 901 //------------------------------------------------------------------ 902 /// Find out if a ValueObject might have children. 903 /// 904 /// This call is much more efficient than CalculateNumChildren() as 905 /// it doesn't need to complete the underlying type. This is designed 906 /// to be used in a UI environment in order to detect if the 907 /// disclosure triangle should be displayed or not. 908 /// 909 /// This function returns true for class, union, structure, 910 /// pointers, references, arrays and more. Again, it does so without 911 /// doing any expensive type completion. 912 /// 913 /// @return 914 /// Returns \b true if the ValueObject might have children, or \b 915 /// false otherwise. 916 //------------------------------------------------------------------ 917 virtual bool 918 MightHaveChildren(); 919 920protected: 921 typedef ClusterManager<ValueObject> ValueObjectManager; 922 923 class ChildrenManager 924 { 925 public: 926 ChildrenManager() : 927 m_mutex(Mutex::eMutexTypeRecursive), 928 m_children(), 929 m_children_count(0) 930 {} 931 932 bool 933 HasChildAtIndex (size_t idx) 934 { 935 Mutex::Locker locker(m_mutex); 936 ChildrenIterator iter = m_children.find(idx); 937 ChildrenIterator end = m_children.end(); 938 return (iter != end); 939 } 940 941 ValueObject* 942 GetChildAtIndex (size_t idx) 943 { 944 Mutex::Locker locker(m_mutex); 945 ChildrenIterator iter = m_children.find(idx); 946 ChildrenIterator end = m_children.end(); 947 if (iter == end) 948 return NULL; 949 else 950 return iter->second; 951 } 952 953 void 954 SetChildAtIndex (size_t idx, ValueObject* valobj) 955 { 956 ChildrenPair pair(idx,valobj); // we do not need to be mutex-protected to make a pair 957 Mutex::Locker locker(m_mutex); 958 m_children.insert(pair); 959 } 960 961 void 962 SetChildrenCount (size_t count) 963 { 964 m_children_count = count; 965 } 966 967 size_t 968 GetChildrenCount () 969 { 970 return m_children_count; 971 } 972 973 void 974 Clear() 975 { 976 m_children_count = 0; 977 Mutex::Locker locker(m_mutex); 978 m_children.clear(); 979 } 980 981 private: 982 typedef std::map<size_t, ValueObject*> ChildrenMap; 983 typedef ChildrenMap::iterator ChildrenIterator; 984 typedef ChildrenMap::value_type ChildrenPair; 985 Mutex m_mutex; 986 ChildrenMap m_children; 987 size_t m_children_count; 988 }; 989 990 //------------------------------------------------------------------ 991 // Classes that inherit from ValueObject can see and modify these 992 //------------------------------------------------------------------ 993 ValueObject * m_parent; // The parent value object, or NULL if this has no parent 994 ValueObject * m_root; // The root of the hierarchy for this ValueObject (or NULL if never calculated) 995 EvaluationPoint m_update_point; // Stores both the stop id and the full context at which this value was last 996 // updated. When we are asked to update the value object, we check whether 997 // the context & stop id are the same before updating. 998 ConstString m_name; // The name of this object 999 DataExtractor m_data; // A data extractor that can be used to extract the value. 1000 Value m_value; 1001 Error m_error; // An error object that can describe any errors that occur when updating values. 1002 std::string m_value_str; // Cached value string that will get cleared if/when the value is updated. 1003 std::string m_old_value_str;// Cached old value string from the last time the value was gotten 1004 std::string m_location_str; // Cached location string that will get cleared if/when the value is updated. 1005 std::string m_summary_str; // Cached summary string that will get cleared if/when the value is updated. 1006 std::string m_object_desc_str; // Cached result of the "object printer". This differs from the summary 1007 // in that the summary is consed up by us, the object_desc_string is builtin. 1008 1009 ClangASTType m_override_type;// If the type of the value object should be overridden, the type to impose. 1010 1011 ValueObjectManager *m_manager; // This object is managed by the root object (any ValueObject that gets created 1012 // without a parent.) The manager gets passed through all the generations of 1013 // dependent objects, and will keep the whole cluster of objects alive as long 1014 // as a shared pointer to any of them has been handed out. Shared pointers to 1015 // value objects must always be made with the GetSP method. 1016 1017 ChildrenManager m_children; 1018 std::map<ConstString, ValueObject *> m_synthetic_children; 1019 1020 ValueObject* m_dynamic_value; 1021 ValueObject* m_synthetic_value; 1022 ValueObject* m_deref_valobj; 1023 1024 lldb::ValueObjectSP m_addr_of_valobj_sp; // We have to hold onto a shared pointer to this one because it is created 1025 // as an independent ValueObjectConstResult, which isn't managed by us. 1026 1027 lldb::Format m_format; 1028 lldb::Format m_last_format; 1029 uint32_t m_last_format_mgr_revision; 1030 lldb::TypeSummaryImplSP m_type_summary_sp; 1031 lldb::TypeFormatImplSP m_type_format_sp; 1032 lldb::SyntheticChildrenSP m_synthetic_children_sp; 1033 ProcessModID m_user_id_of_forced_summary; 1034 AddressType m_address_type_of_ptr_or_ref_children; 1035 1036 bool m_value_is_valid:1, 1037 m_value_did_change:1, 1038 m_children_count_valid:1, 1039 m_old_value_valid:1, 1040 m_is_deref_of_parent:1, 1041 m_is_array_item_for_pointer:1, 1042 m_is_bitfield_for_scalar:1, 1043 m_is_child_at_offset:1, 1044 m_is_getting_summary:1, 1045 m_did_calculate_complete_objc_class_type:1; 1046 1047 friend class ClangExpressionDeclMap; // For GetValue 1048 friend class ClangExpressionVariable; // For SetName 1049 friend class Target; // For SetName 1050 friend class ValueObjectConstResultImpl; 1051 1052 //------------------------------------------------------------------ 1053 // Constructors and Destructors 1054 //------------------------------------------------------------------ 1055 1056 // Use the no-argument constructor to make a constant variable object (with no ExecutionContextScope.) 1057 1058 ValueObject(); 1059 1060 // Use this constructor to create a "root variable object". The ValueObject will be locked to this context 1061 // through-out its lifespan. 1062 1063 ValueObject (ExecutionContextScope *exe_scope, 1064 AddressType child_ptr_or_ref_addr_type = eAddressTypeLoad); 1065 1066 // Use this constructor to create a ValueObject owned by another ValueObject. It will inherit the ExecutionContext 1067 // of its parent. 1068 1069 ValueObject (ValueObject &parent); 1070 1071 ValueObjectManager * 1072 GetManager() 1073 { 1074 return m_manager; 1075 } 1076 1077 virtual bool 1078 UpdateValue () = 0; 1079 1080 virtual void 1081 CalculateDynamicValue (lldb::DynamicValueType use_dynamic); 1082 1083 virtual lldb::DynamicValueType 1084 GetDynamicValueTypeImpl () 1085 { 1086 return lldb::eNoDynamicValues; 1087 } 1088 1089 virtual bool 1090 HasDynamicValueTypeInfo () 1091 { 1092 return false; 1093 } 1094 1095 virtual void 1096 CalculateSyntheticValue (bool use_synthetic = true); 1097 1098 // Should only be called by ValueObject::GetChildAtIndex() 1099 // Returns a ValueObject managed by this ValueObject's manager. 1100 virtual ValueObject * 1101 CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index); 1102 1103 // Should only be called by ValueObject::GetNumChildren() 1104 virtual size_t 1105 CalculateNumChildren() = 0; 1106 1107 void 1108 SetNumChildren (size_t num_children); 1109 1110 void 1111 SetValueDidChange (bool value_changed); 1112 1113 void 1114 SetValueIsValid (bool valid); 1115 1116 void 1117 ClearUserVisibleData(uint32_t items = ValueObject::eClearUserVisibleDataItemsAllStrings); 1118 1119 void 1120 AddSyntheticChild (const ConstString &key, 1121 ValueObject *valobj); 1122 1123 DataExtractor & 1124 GetDataExtractor (); 1125 1126 void 1127 ClearDynamicTypeInformation (); 1128 1129 //------------------------------------------------------------------ 1130 // Sublasses must implement the functions below. 1131 //------------------------------------------------------------------ 1132 1133 virtual ClangASTType 1134 GetClangTypeImpl () = 0; 1135 1136 const char * 1137 GetLocationAsCStringImpl (const Value& value, 1138 const DataExtractor& data); 1139 1140private: 1141 //------------------------------------------------------------------ 1142 // For ValueObject only 1143 //------------------------------------------------------------------ 1144 1145 virtual ClangASTType 1146 MaybeCalculateCompleteType (); 1147 1148 lldb::ValueObjectSP 1149 GetValueForExpressionPath_Impl(const char* expression_cstr, 1150 const char** first_unparsed, 1151 ExpressionPathScanEndReason* reason_to_stop, 1152 ExpressionPathEndResultType* final_value_type, 1153 const GetValueForExpressionPathOptions& options, 1154 ExpressionPathAftermath* final_task_on_target); 1155 1156 // this method will ONLY expand [] expressions into a VOList and return 1157 // the number of elements it added to the VOList 1158 // it will NOT loop through expanding the follow-up of the expression_cstr 1159 // for all objects in the list 1160 int 1161 ExpandArraySliceExpression(const char* expression_cstr, 1162 const char** first_unparsed, 1163 lldb::ValueObjectSP root, 1164 lldb::ValueObjectListSP& list, 1165 ExpressionPathScanEndReason* reason_to_stop, 1166 ExpressionPathEndResultType* final_value_type, 1167 const GetValueForExpressionPathOptions& options, 1168 ExpressionPathAftermath* final_task_on_target); 1169 1170 1171 DISALLOW_COPY_AND_ASSIGN (ValueObject); 1172 1173}; 1174 1175} // namespace lldb_private 1176 1177#endif // liblldb_ValueObject_h_ 1178