1 //===-- ExecutionContext.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 /// Execution context objects refer to objects in the execution of the 10 /// program that is being debugged. The consist of one or more of the 11 /// following objects: target, process, thread, and frame. Many objects 12 /// in the debugger need to track different executions contexts. For 13 /// example, a local function variable might have an execution context 14 /// that refers to a stack frame. A global or static variable might 15 /// refer to a target since a stack frame isn't required in order to 16 /// evaluate a global or static variable (a process isn't necessarily 17 /// needed for a global variable since we might be able to read the 18 /// variable value from a data section in one of the object files in 19 /// a target). There are two types of objects that hold onto execution 20 /// contexts: ExecutionContextRef and ExecutionContext. Both of these 21 /// objects are deascribed below. 22 /// 23 /// Not all objects in an ExectionContext objects will be valid. If you want 24 /// to refer stronly (ExectionContext) or weakly (ExectionContextRef) to 25 /// a process, then only the process and target references will be valid. 26 /// For threads, only the thread, process and target references will be 27 /// filled in. For frames, all of the objects will be filled in. 28 /// 29 /// These classes are designed to be used as baton objects that get passed 30 /// to a wide variety of functions that require execution contexts. 31 //===----------------------------------------------------------------------===// 32 33 34 35 #ifndef liblldb_ExecutionContext_h_ 36 #define liblldb_ExecutionContext_h_ 37 38 #include "lldb/lldb-private.h" 39 #include "lldb/Target/StackID.h" 40 #include "lldb/Host/Mutex.h" 41 42 namespace lldb_private { 43 44 //---------------------------------------------------------------------- 45 /// @class ExecutionContextRef ExecutionContext.h "lldb/Target/ExecutionContext.h" 46 /// @brief A class that holds a weak reference to an execution context. 47 /// 48 /// ExecutionContextRef objects are designed to hold onto an execution 49 /// context that might change over time. For example, if an object wants 50 /// to refer to a stack frame, it should hold onto an ExecutionContextRef 51 /// to a frame object. The backing object that represents the stack frame 52 /// might change over time and instaces of this object can track the logical 53 /// object that refers to a frame even if it does change. 54 /// 55 /// These objects also don't keep execution objects around longer than they 56 /// should since they use weak pointers. For example if an object refers 57 /// to a stack frame and a stack frame is no longer in a thread, then a 58 /// ExecutionContextRef object that refers to that frame will not be able 59 /// to get a shared pointer to those objects since they are no longer around. 60 /// 61 /// ExecutionContextRef objects can also be used as objects in classes 62 /// that want to track a "previous execution context". Since the weak 63 /// references to the execution objects (target, process, thread and frame) 64 /// don't keep these objects around, they are safe to keep around. 65 /// 66 /// The general rule of thumb is all long lived objects that want to 67 /// refer to execution contexts should use ExecutionContextRef objcts. 68 /// The ExecutionContext class is used to temporarily get shared 69 /// pointers to any execution context objects that are still around 70 /// so they are guaranteed to exist during a function that requires the 71 /// objects. ExecutionContext objects should NOT be used for long term 72 /// storage since they will keep objects alive with extra shared pointer 73 /// references to these objects. 74 //---------------------------------------------------------------------- 75 class ExecutionContextRef 76 { 77 public: 78 //------------------------------------------------------------------ 79 /// Default Constructor. 80 //------------------------------------------------------------------ 81 ExecutionContextRef(); 82 83 //------------------------------------------------------------------ 84 /// Copy Constructor. 85 //------------------------------------------------------------------ 86 ExecutionContextRef (const ExecutionContextRef &rhs); 87 88 //------------------------------------------------------------------ 89 /// Construct using an ExecutionContext object that might be NULL. 90 /// 91 /// If \a exe_ctx_ptr is valid, then make weak references to any 92 /// valid objects in the ExecutionContext, othewise no weak 93 /// references to any execution context objects will be made. 94 //------------------------------------------------------------------ 95 ExecutionContextRef (const ExecutionContext *exe_ctx_ptr); 96 97 //------------------------------------------------------------------ 98 /// Construct using an ExecutionContext object. 99 /// 100 /// Make weak references to any valid objects in the ExecutionContext. 101 //------------------------------------------------------------------ 102 ExecutionContextRef (const ExecutionContext &exe_ctx); 103 104 //------------------------------------------------------------------ 105 /// Assignment operator 106 /// 107 /// Copy all weak refernces in \a rhs. 108 //------------------------------------------------------------------ 109 ExecutionContextRef & 110 operator =(const ExecutionContextRef &rhs); 111 112 //------------------------------------------------------------------ 113 /// Assignment operator from a ExecutionContext 114 /// 115 /// Make weak refernces to any stringly referenced objects in \a exe_ctx. 116 //------------------------------------------------------------------ 117 ExecutionContextRef & 118 operator =(const ExecutionContext &exe_ctx); 119 120 //------------------------------------------------------------------ 121 /// Construct using the target and all the selected items inside of it 122 /// (the process and its selected thread, and the thread's selected 123 /// frame). If there is no selected thread, default to the first thread 124 /// If there is no selected frame, default to the first frame. 125 //------------------------------------------------------------------ 126 ExecutionContextRef (Target *target, bool adopt_selected); 127 128 //------------------------------------------------------------------ 129 /// Construct using an execution context scope. 130 /// 131 /// If the ExecutionContextScope object is valid and refers to a frame, 132 /// make weak refernces too the frame, thread, process and target. 133 /// If the ExecutionContextScope object is valid and refers to a thread, 134 /// make weak refernces too the thread, process and target. 135 /// If the ExecutionContextScope object is valid and refers to a process, 136 /// make weak refernces too the process and target. 137 /// If the ExecutionContextScope object is valid and refers to a target, 138 /// make weak refernces too the target. 139 //------------------------------------------------------------------ 140 ExecutionContextRef (ExecutionContextScope *exe_scope); 141 142 //------------------------------------------------------------------ 143 /// Construct using an execution context scope. 144 /// 145 /// If the ExecutionContextScope object refers to a frame, 146 /// make weak refernces too the frame, thread, process and target. 147 /// If the ExecutionContextScope object refers to a thread, 148 /// make weak refernces too the thread, process and target. 149 /// If the ExecutionContextScope object refers to a process, 150 /// make weak refernces too the process and target. 151 /// If the ExecutionContextScope object refers to a target, 152 /// make weak refernces too the target. 153 //------------------------------------------------------------------ 154 ExecutionContextRef (ExecutionContextScope &exe_scope); 155 156 ~ExecutionContextRef(); 157 //------------------------------------------------------------------ 158 /// Clear the object's state. 159 /// 160 /// Sets the process and thread to NULL, and the frame index to an 161 /// invalid value. 162 //------------------------------------------------------------------ 163 void 164 Clear (); 165 166 //------------------------------------------------------------------ 167 /// Set accessor that creates a weak reference to the target 168 /// referenced in \a target_sp. 169 /// 170 /// If \a target_sp is valid this object will create a weak 171 /// reference to that object, otherwise any previous target weak 172 /// reference contained in this object will be reset. 173 /// 174 /// Only the weak reference to the target will be updated, no other 175 /// weak references will be modified. If you want this execution 176 /// context to make a weak reference to the target's process, use 177 /// the ExecutionContextRef::SetContext() functions. 178 /// 179 /// @see ExecutionContextRef::SetContext(const lldb::TargetSP &, bool) 180 //------------------------------------------------------------------ 181 void 182 SetTargetSP (const lldb::TargetSP &target_sp); 183 184 //------------------------------------------------------------------ 185 /// Set accessor that creates a weak reference to the process 186 /// referenced in \a process_sp. 187 /// 188 /// If \a process_sp is valid this object will create a weak 189 /// reference to that object, otherwise any previous process weak 190 /// reference contained in this object will be reset. 191 /// 192 /// Only the weak reference to the process will be updated, no other 193 /// weak references will be modified. If you want this execution 194 /// context to make a weak reference to the target, use the 195 /// ExecutionContextRef::SetContext() functions. 196 /// 197 /// @see ExecutionContextRef::SetContext(const lldb::ProcessSP &) 198 //------------------------------------------------------------------ 199 void 200 SetProcessSP (const lldb::ProcessSP &process_sp); 201 202 //------------------------------------------------------------------ 203 /// Set accessor that creates a weak reference to the thread 204 /// referenced in \a thread_sp. 205 /// 206 /// If \a thread_sp is valid this object will create a weak 207 /// reference to that object, otherwise any previous thread weak 208 /// reference contained in this object will be reset. 209 /// 210 /// Only the weak reference to the thread will be updated, no other 211 /// weak references will be modified. If you want this execution 212 /// context to make a weak reference to the thread's process and 213 /// target, use the ExecutionContextRef::SetContext() functions. 214 /// 215 /// @see ExecutionContextRef::SetContext(const lldb::ThreadSP &) 216 //------------------------------------------------------------------ 217 void 218 SetThreadSP (const lldb::ThreadSP &thread_sp); 219 220 //------------------------------------------------------------------ 221 /// Set accessor that creates a weak reference to the frame 222 /// referenced in \a frame_sp. 223 /// 224 /// If \a frame_sp is valid this object will create a weak 225 /// reference to that object, otherwise any previous frame weak 226 /// reference contained in this object will be reset. 227 /// 228 /// Only the weak reference to the frame will be updated, no other 229 /// weak references will be modified. If you want this execution 230 /// context to make a weak reference to the frame's thread, process 231 /// and target, use the ExecutionContextRef::SetContext() functions. 232 /// 233 /// @see ExecutionContextRef::SetContext(const lldb::StackFrameSP &) 234 //------------------------------------------------------------------ 235 void 236 SetFrameSP (const lldb::StackFrameSP &frame_sp); 237 238 void 239 SetTargetPtr (Target* target, bool adopt_selected); 240 241 void 242 SetProcessPtr (Process *process); 243 244 void 245 SetThreadPtr (Thread *thread); 246 247 void 248 SetFramePtr (StackFrame *frame); 249 250 //------------------------------------------------------------------ 251 /// Get accessor that creates a strong reference from the weak target 252 /// reference contained in this object. 253 /// 254 /// @returns 255 /// A shared pointer to a target that is not guaranteed to be valid. 256 //------------------------------------------------------------------ 257 lldb::TargetSP 258 GetTargetSP () const; 259 260 //------------------------------------------------------------------ 261 /// Get accessor that creates a strong reference from the weak process 262 /// reference contained in this object. 263 /// 264 /// @returns 265 /// A shared pointer to a process that is not guaranteed to be valid. 266 //------------------------------------------------------------------ 267 lldb::ProcessSP 268 GetProcessSP () const; 269 270 //------------------------------------------------------------------ 271 /// Get accessor that creates a strong reference from the weak thread 272 /// reference contained in this object. 273 /// 274 /// @returns 275 /// A shared pointer to a thread that is not guaranteed to be valid. 276 //------------------------------------------------------------------ 277 lldb::ThreadSP 278 GetThreadSP () const; 279 280 //------------------------------------------------------------------ 281 /// Get accessor that creates a strong reference from the weak frame 282 /// reference contained in this object. 283 /// 284 /// @returns 285 /// A shared pointer to a frame that is not guaranteed to be valid. 286 //------------------------------------------------------------------ 287 lldb::StackFrameSP 288 GetFrameSP () const; 289 290 //------------------------------------------------------------------ 291 /// Create an ExecutionContext object from this object. 292 /// 293 /// Create strong references to any execution context objects that 294 /// are still valid. Any of the returned shared pointers in the 295 /// ExecutionContext objects is not guaranteed to be valid. 296 /// @returns 297 /// An execution context object that has strong references to 298 /// any valid weak references in this object. 299 //------------------------------------------------------------------ 300 ExecutionContext 301 Lock () const; 302 303 //------------------------------------------------------------------ 304 /// Returns true if this object has a weak reference to a thread. 305 /// The return value is only an indication of wether this object has 306 /// a weak reference and does not indicate wether the weak rerference 307 /// is valid or not. 308 //------------------------------------------------------------------ 309 bool HasThreadRef()310 HasThreadRef () const 311 { 312 return m_tid != LLDB_INVALID_THREAD_ID; 313 } 314 315 //------------------------------------------------------------------ 316 /// Returns true if this object has a weak reference to a frame. 317 /// The return value is only an indication of wether this object has 318 /// a weak reference and does not indicate wether the weak rerference 319 /// is valid or not. 320 //------------------------------------------------------------------ 321 bool HasFrameRef()322 HasFrameRef () const 323 { 324 return m_stack_id.IsValid(); 325 } 326 327 void ClearThread()328 ClearThread () 329 { 330 m_thread_wp.reset(); 331 m_tid = LLDB_INVALID_THREAD_ID; 332 } 333 334 void ClearFrame()335 ClearFrame () 336 { 337 m_stack_id.Clear(); 338 } 339 340 protected: 341 //------------------------------------------------------------------ 342 // Member variables 343 //------------------------------------------------------------------ 344 lldb::TargetWP m_target_wp; ///< A weak reference to a target 345 lldb::ProcessWP m_process_wp; ///< A weak reference to a process 346 mutable lldb::ThreadWP m_thread_wp; ///< A weak reference to a thread 347 lldb::tid_t m_tid; ///< The thread ID that this object refers to in case the backing object changes 348 StackID m_stack_id; ///< The stack ID that this object refers to in case the backing object changes 349 }; 350 351 //---------------------------------------------------------------------- 352 /// @class ExecutionContext ExecutionContext.h "lldb/Target/ExecutionContext.h" 353 /// @brief A class that contains an execution context. 354 /// 355 /// This baton object can be passed into any function that requires 356 /// a context that specifies a target, process, thread and frame. 357 /// These objects are designed to be used for short term execution 358 /// context object storage while a function might be trying to evaluate 359 /// something that requires a thread or frame. ExecutionContextRef 360 /// objects can be used to initialize one of these objects to turn 361 /// the weak execution context object references to the target, process, 362 /// thread and frame into strong references (shared pointers) so that 363 /// functions can guarantee that these objects won't go away in the 364 /// middle of a function. 365 /// 366 /// ExecutionContext objects should be used as short lived objects 367 /// (typically on the stack) in order to lock down an execution context 368 /// for local use and for passing down to other functions that also 369 /// require specific contexts. They should NOT be used for long term 370 /// storage, for long term storage use ExecutionContextRef objects. 371 //---------------------------------------------------------------------- 372 class ExecutionContext 373 { 374 public: 375 //------------------------------------------------------------------ 376 /// Default Constructor. 377 //------------------------------------------------------------------ 378 ExecutionContext(); 379 380 //------------------------------------------------------------------ 381 // Copy constructor 382 //------------------------------------------------------------------ 383 ExecutionContext (const ExecutionContext &rhs); 384 385 //------------------------------------------------------------------ 386 // Adopt the target and optionally its current context. 387 //------------------------------------------------------------------ 388 ExecutionContext (Target* t, bool fill_current_process_thread_frame = true); 389 390 //------------------------------------------------------------------ 391 // Create execution contexts from shared pointers 392 //------------------------------------------------------------------ 393 ExecutionContext (const lldb::TargetSP &target_sp, bool get_process); 394 ExecutionContext (const lldb::ProcessSP &process_sp); 395 ExecutionContext (const lldb::ThreadSP &thread_sp); 396 ExecutionContext (const lldb::StackFrameSP &frame_sp); 397 //------------------------------------------------------------------ 398 // Create execution contexts from weak pointers 399 //------------------------------------------------------------------ 400 ExecutionContext (const lldb::TargetWP &target_wp, bool get_process); 401 ExecutionContext (const lldb::ProcessWP &process_wp); 402 ExecutionContext (const lldb::ThreadWP &thread_wp); 403 ExecutionContext (const lldb::StackFrameWP &frame_wp); 404 ExecutionContext (const ExecutionContextRef &exe_ctx_ref); 405 ExecutionContext (const ExecutionContextRef *exe_ctx_ref); 406 407 // These two variants take in a locker, and grab the target, lock the API mutex into locker, then 408 // fill in the rest of the shared pointers. 409 ExecutionContext (const ExecutionContextRef &exe_ctx_ref, Mutex::Locker &locker); 410 ExecutionContext (const ExecutionContextRef *exe_ctx_ref, Mutex::Locker &locker); 411 //------------------------------------------------------------------ 412 // Create execution contexts from execution context scopes 413 //------------------------------------------------------------------ 414 ExecutionContext (ExecutionContextScope *exe_scope); 415 ExecutionContext (ExecutionContextScope &exe_scope); 416 417 418 ExecutionContext & 419 operator =(const ExecutionContext &rhs); 420 421 bool 422 operator ==(const ExecutionContext &rhs) const; 423 424 bool 425 operator !=(const ExecutionContext &rhs) const; 426 427 //------------------------------------------------------------------ 428 /// Construct with process, thread, and frame index. 429 /// 430 /// Initialize with process \a p, thread \a t, and frame index \a f. 431 /// 432 /// @param[in] process 433 /// The process for this execution context. 434 /// 435 /// @param[in] thread 436 /// The thread for this execution context. 437 /// 438 /// @param[in] frame 439 /// The frame index for this execution context. 440 //------------------------------------------------------------------ 441 ExecutionContext (Process* process, 442 Thread *thread = NULL, 443 StackFrame * frame = NULL); 444 445 446 ~ExecutionContext(); 447 //------------------------------------------------------------------ 448 /// Clear the object's state. 449 /// 450 /// Sets the process and thread to NULL, and the frame index to an 451 /// invalid value. 452 //------------------------------------------------------------------ 453 void 454 Clear (); 455 456 RegisterContext * 457 GetRegisterContext () const; 458 459 ExecutionContextScope * 460 GetBestExecutionContextScope () const; 461 462 uint32_t 463 GetAddressByteSize() const; 464 465 //------------------------------------------------------------------ 466 /// Returns a pointer to the target object. 467 /// 468 /// The returned pointer might be NULL. Calling HasTargetScope(), 469 /// HasProcessScope(), HasThreadScope(), or HasFrameScope() 470 /// can help to pre-validate this pointer so that this accessor can 471 /// freely be used without having to check for NULL each time. 472 /// 473 /// @see ExecutionContext::HasTargetScope() const 474 /// @see ExecutionContext::HasProcessScope() const 475 /// @see ExecutionContext::HasThreadScope() const 476 /// @see ExecutionContext::HasFrameScope() const 477 //------------------------------------------------------------------ 478 Target * 479 GetTargetPtr () const; 480 481 //------------------------------------------------------------------ 482 /// Returns a pointer to the process object. 483 /// 484 /// The returned pointer might be NULL. Calling HasProcessScope(), 485 /// HasThreadScope(), or HasFrameScope() can help to pre-validate 486 /// this pointer so that this accessor can freely be used without 487 /// having to check for NULL each time. 488 /// 489 /// @see ExecutionContext::HasProcessScope() const 490 /// @see ExecutionContext::HasThreadScope() const 491 /// @see ExecutionContext::HasFrameScope() const 492 //------------------------------------------------------------------ 493 Process * 494 GetProcessPtr () const; 495 496 //------------------------------------------------------------------ 497 /// Returns a pointer to the thread object. 498 /// 499 /// The returned pointer might be NULL. Calling HasThreadScope() or 500 /// HasFrameScope() can help to pre-validate this pointer so that 501 /// this accessor can freely be used without having to check for 502 /// NULL each time. 503 /// 504 /// @see ExecutionContext::HasThreadScope() const 505 /// @see ExecutionContext::HasFrameScope() const 506 //------------------------------------------------------------------ 507 Thread * GetThreadPtr()508 GetThreadPtr () const 509 { 510 return m_thread_sp.get(); 511 } 512 513 //------------------------------------------------------------------ 514 /// Returns a pointer to the frame object. 515 /// 516 /// The returned pointer might be NULL. Calling HasFrameScope(), 517 /// can help to pre-validate this pointer so that this accessor can 518 /// freely be used without having to check for NULL each time. 519 /// 520 /// @see ExecutionContext::HasFrameScope() const 521 //------------------------------------------------------------------ 522 StackFrame * GetFramePtr()523 GetFramePtr () const 524 { 525 return m_frame_sp.get(); 526 } 527 528 //------------------------------------------------------------------ 529 /// Returns a reference to the target object. 530 /// 531 /// Clients should call HasTargetScope(), HasProcessScope(), 532 /// HasThreadScope(), or HasFrameScope() prior to calling this 533 /// function to ensure that this ExecutionContext object contains 534 /// a valid target. 535 /// 536 /// @see ExecutionContext::HasTargetScope() const 537 /// @see ExecutionContext::HasProcessScope() const 538 /// @see ExecutionContext::HasThreadScope() const 539 /// @see ExecutionContext::HasFrameScope() const 540 //------------------------------------------------------------------ 541 Target & 542 GetTargetRef () const; 543 544 //------------------------------------------------------------------ 545 /// Returns a reference to the process object. 546 /// 547 /// Clients should call HasProcessScope(), HasThreadScope(), or 548 /// HasFrameScope() prior to calling this function to ensure that 549 /// this ExecutionContext object contains a valid target. 550 /// 551 /// @see ExecutionContext::HasProcessScope() const 552 /// @see ExecutionContext::HasThreadScope() const 553 /// @see ExecutionContext::HasFrameScope() const 554 //------------------------------------------------------------------ 555 Process & 556 GetProcessRef () const; 557 558 //------------------------------------------------------------------ 559 /// Returns a reference to the thread object. 560 /// 561 /// Clients should call HasThreadScope(), or HasFrameScope() prior 562 /// to calling this function to ensure that this ExecutionContext 563 /// object contains a valid target. 564 /// 565 /// @see ExecutionContext::HasThreadScope() const 566 /// @see ExecutionContext::HasFrameScope() const 567 //------------------------------------------------------------------ 568 Thread & 569 GetThreadRef () const; 570 571 //------------------------------------------------------------------ 572 /// Returns a reference to the thread object. 573 /// 574 /// Clients should call HasFrameScope() prior to calling this 575 /// function to ensure that this ExecutionContext object contains 576 /// a valid target. 577 /// 578 /// @see ExecutionContext::HasFrameScope() const 579 //------------------------------------------------------------------ 580 StackFrame & 581 GetFrameRef () const; 582 583 //------------------------------------------------------------------ 584 /// Get accessor to get the target shared pointer. 585 /// 586 /// The returned shared pointer is not guaranteed to be valid. 587 //------------------------------------------------------------------ 588 const lldb::TargetSP & GetTargetSP()589 GetTargetSP () const 590 { 591 return m_target_sp; 592 } 593 594 //------------------------------------------------------------------ 595 /// Get accessor to get the process shared pointer. 596 /// 597 /// The returned shared pointer is not guaranteed to be valid. 598 //------------------------------------------------------------------ 599 const lldb::ProcessSP & GetProcessSP()600 GetProcessSP () const 601 { 602 return m_process_sp; 603 } 604 605 //------------------------------------------------------------------ 606 /// Get accessor to get the thread shared pointer. 607 /// 608 /// The returned shared pointer is not guaranteed to be valid. 609 //------------------------------------------------------------------ 610 const lldb::ThreadSP & GetThreadSP()611 GetThreadSP () const 612 { 613 return m_thread_sp; 614 } 615 616 //------------------------------------------------------------------ 617 /// Get accessor to get the frame shared pointer. 618 /// 619 /// The returned shared pointer is not guaranteed to be valid. 620 //------------------------------------------------------------------ 621 const lldb::StackFrameSP & GetFrameSP()622 GetFrameSP () const 623 { 624 return m_frame_sp; 625 } 626 627 //------------------------------------------------------------------ 628 /// Set accessor to set only the target shared pointer. 629 //------------------------------------------------------------------ 630 void 631 SetTargetSP (const lldb::TargetSP &target_sp); 632 633 //------------------------------------------------------------------ 634 /// Set accessor to set only the process shared pointer. 635 //------------------------------------------------------------------ 636 void 637 SetProcessSP (const lldb::ProcessSP &process_sp); 638 639 //------------------------------------------------------------------ 640 /// Set accessor to set only the thread shared pointer. 641 //------------------------------------------------------------------ 642 void 643 SetThreadSP (const lldb::ThreadSP &thread_sp); 644 645 //------------------------------------------------------------------ 646 /// Set accessor to set only the frame shared pointer. 647 //------------------------------------------------------------------ 648 void 649 SetFrameSP (const lldb::StackFrameSP &frame_sp); 650 651 //------------------------------------------------------------------ 652 /// Set accessor to set only the target shared pointer from a target 653 /// pointer. 654 //------------------------------------------------------------------ 655 void 656 SetTargetPtr (Target* target); 657 658 //------------------------------------------------------------------ 659 /// Set accessor to set only the process shared pointer from a 660 /// process pointer. 661 //------------------------------------------------------------------ 662 void 663 SetProcessPtr (Process *process); 664 665 //------------------------------------------------------------------ 666 /// Set accessor to set only the thread shared pointer from a thread 667 /// pointer. 668 //------------------------------------------------------------------ 669 void 670 SetThreadPtr (Thread *thread); 671 672 //------------------------------------------------------------------ 673 /// Set accessor to set only the frame shared pointer from a frame 674 /// pointer. 675 //------------------------------------------------------------------ 676 void 677 SetFramePtr (StackFrame *frame); 678 679 //------------------------------------------------------------------ 680 // Set the execution context using a target shared pointer. 681 // 682 // If "target_sp" is valid, sets the target context to match and 683 // if "get_process" is true, sets the process shared pointer if 684 // the target currently has a process. 685 //------------------------------------------------------------------ 686 void 687 SetContext (const lldb::TargetSP &target_sp, bool get_process); 688 689 //------------------------------------------------------------------ 690 // Set the execution context using a process shared pointer. 691 // 692 // If "process_sp" is valid, then set the process and target in this 693 // context. Thread and frame contexts will be cleared. 694 // If "process_sp" is not valid, all shared pointers are reset. 695 //------------------------------------------------------------------ 696 void 697 SetContext (const lldb::ProcessSP &process_sp); 698 699 //------------------------------------------------------------------ 700 // Set the execution context using a thread shared pointer. 701 // 702 // If "thread_sp" is valid, then set the thread, process and target 703 // in this context. The frame context will be cleared. 704 // If "thread_sp" is not valid, all shared pointers are reset. 705 //------------------------------------------------------------------ 706 void 707 SetContext (const lldb::ThreadSP &thread_sp); 708 709 //------------------------------------------------------------------ 710 // Set the execution context using a frame shared pointer. 711 // 712 // If "frame_sp" is valid, then set the frame, thread, process and 713 // target in this context 714 // If "frame_sp" is not valid, all shared pointers are reset. 715 //------------------------------------------------------------------ 716 void 717 SetContext (const lldb::StackFrameSP &frame_sp); 718 719 //------------------------------------------------------------------ 720 /// Returns true the ExecutionContext object contains a valid 721 /// target. 722 /// 723 /// This function can be called after initializing an ExecutionContext 724 /// object, and if it returns true, calls to GetTargetPtr() and 725 /// GetTargetRef() do not need to be checked for validity. 726 //------------------------------------------------------------------ 727 bool 728 HasTargetScope () const; 729 730 //------------------------------------------------------------------ 731 /// Returns true the ExecutionContext object contains a valid 732 /// target and process. 733 /// 734 /// This function can be called after initializing an ExecutionContext 735 /// object, and if it returns true, calls to GetTargetPtr() and 736 /// GetTargetRef(), GetProcessPtr(), and GetProcessRef(), do not 737 /// need to be checked for validity. 738 //------------------------------------------------------------------ 739 bool 740 HasProcessScope () const; 741 742 //------------------------------------------------------------------ 743 /// Returns true the ExecutionContext object contains a valid 744 /// target, process, and thread. 745 /// 746 /// This function can be called after initializing an ExecutionContext 747 /// object, and if it returns true, calls to GetTargetPtr(), 748 /// GetTargetRef(), GetProcessPtr(), GetProcessRef(), GetThreadPtr(), 749 /// and GetThreadRef() do not need to be checked for validity. 750 //------------------------------------------------------------------ 751 bool 752 HasThreadScope () const; 753 754 //------------------------------------------------------------------ 755 /// Returns true the ExecutionContext object contains a valid 756 /// target, process, thread and frame. 757 /// 758 /// This function can be called after initializing an ExecutionContext 759 /// object, and if it returns true, calls to GetTargetPtr(), 760 /// GetTargetRef(), GetProcessPtr(), GetProcessRef(), GetThreadPtr(), 761 /// GetThreadRef(), GetFramePtr(), and GetFrameRef() do not need 762 /// to be checked for validity. 763 //------------------------------------------------------------------ 764 bool 765 HasFrameScope () const; 766 767 protected: 768 //------------------------------------------------------------------ 769 // Member variables 770 //------------------------------------------------------------------ 771 lldb::TargetSP m_target_sp; ///< The target that owns the process/thread/frame 772 lldb::ProcessSP m_process_sp; ///< The process that owns the thread/frame 773 lldb::ThreadSP m_thread_sp; ///< The thread that owns the frame 774 lldb::StackFrameSP m_frame_sp; ///< The stack frame in thread. 775 }; 776 } // namespace lldb_private 777 778 #endif // liblldb_ExecutionContext_h_ 779