124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Thread.h ------------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_Thread_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Thread_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h" 1594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham#include "lldb/Core/Broadcaster.h" 1694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham#include "lldb/Core/Event.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UserID.h" 1820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham#include "lldb/Core/UserSettingsController.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContextScope.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrameList.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define LLDB_THREAD_MAX_STOP_EXC_DATA 8 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Inghamclass ThreadProperties : public Properties 27ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham{ 28ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Inghampublic: 29ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham ThreadProperties(bool is_global); 30745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham 31ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham virtual 32ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham ~ThreadProperties(); 33ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham 34ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham //------------------------------------------------------------------ 35ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham /// The regular expression returned determines symbols that this 36ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham /// thread won't stop in during "step-in" operations. 37ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham /// 38ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham /// @return 39ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham /// A pointer to a regular expression to compare against symbols, 40ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham /// or NULL if all symbols are allowed. 41ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham /// 42ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham //------------------------------------------------------------------ 43ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham const RegularExpression * 44ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham GetSymbolsToAvoidRegexp(); 45ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham 46ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham bool 47ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham GetTraceEnabledState() const; 48ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham}; 49ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham 50102b2c2681c9a830afe25bfea35557421905e42cGreg Claytontypedef std::shared_ptr<ThreadProperties> ThreadPropertiesSP; 5120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 52ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Inghamclass Thread : 53102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton public std::enable_shared_from_this<Thread>, 5473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton public ThreadProperties, 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public UserID, 5694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham public ExecutionContextScope, 5794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham public Broadcaster 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 6094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham //------------------------------------------------------------------ 6194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham /// Broadcaster event bits definitions. 6294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham //------------------------------------------------------------------ 6394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham enum 6494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham { 6594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham eBroadcastBitStackChanged = (1 << 0), 6694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham eBroadcastBitThreadSuspended = (1 << 1), 6794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham eBroadcastBitThreadResumed = (1 << 2), 682e2812388b75d3c62c9518cc1a6550ce29325aa6Jim Ingham eBroadcastBitSelectedFrameChanged = (1 << 3), 692e2812388b75d3c62c9518cc1a6550ce29325aa6Jim Ingham eBroadcastBitThreadSelected = (1 << 4) 7094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham }; 7194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 7294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham static ConstString &GetStaticBroadcasterClass (); 7394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 7494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham virtual ConstString &GetBroadcasterClass() const 7594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham { 7694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham return GetStaticBroadcasterClass(); 7794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham } 7894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 7994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham class ThreadEventData : 8094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham public EventData 8194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham { 8294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham public: 8394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham ThreadEventData (const lldb::ThreadSP thread_sp); 8494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 8594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham ThreadEventData (const lldb::ThreadSP thread_sp, const StackID &stack_id); 8694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 8794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham ThreadEventData(); 8894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 8994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham virtual ~ThreadEventData(); 9094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 9194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham static const ConstString & 9294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham GetFlavorString (); 9394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 9494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham virtual const ConstString & 9594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham GetFlavor () const 9694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham { 9794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham return ThreadEventData::GetFlavorString (); 9894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham } 9994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 10094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham virtual void 10194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham Dump (Stream *s) const; 10294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 10394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham static const ThreadEventData * 10494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham GetEventDataFromEvent (const Event *event_ptr); 10594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 10694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham static lldb::ThreadSP 10794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham GetThreadFromEvent (const Event *event_ptr); 10894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 10994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham static StackID 11094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham GetStackIDFromEvent (const Event *event_ptr); 11194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 11294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham static lldb::StackFrameSP 11394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham GetStackFrameFromEvent (const Event *event_ptr); 11494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 11594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham lldb::ThreadSP 11694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham GetThread () const 11794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham { 11894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham return m_thread_sp; 11994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham } 12094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 12194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham StackID 12294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham GetStackID () const 12394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham { 12494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham return m_stack_id; 12594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham } 12694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 12794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham private: 12894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham lldb::ThreadSP m_thread_sp; 12994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham StackID m_stack_id; 13094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham DISALLOW_COPY_AND_ASSIGN (ThreadEventData); 13194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham }; 13294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 13394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham // TODO: You shouldn't just checkpoint the register state alone, so this should get 13415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // moved to protected. To do that ThreadStateCheckpoint needs to be returned as a token... 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class RegisterCheckpoint 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterCheckpoint() : 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id (), 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_sp () 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterCheckpoint (const StackID &stack_id) : 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id (stack_id), 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_sp () 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~RegisterCheckpoint() 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham const RegisterCheckpoint& 15615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham operator= (const RegisterCheckpoint &rhs) 15715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 15815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (this != &rhs) 15915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 16015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham this->m_stack_id = rhs.m_stack_id; 16115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham this->m_data_sp = rhs.m_data_sp; 16215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 16315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham return *this; 16415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 16515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 16615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham RegisterCheckpoint (const RegisterCheckpoint &rhs) : 16715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham m_stack_id (rhs.m_stack_id), 16815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham m_data_sp (rhs.m_data_sp) 16915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 17015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 17115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StackID & 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetStackID() 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stack_id; 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetStackID (const StackID &stack_id) 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id = stack_id; 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::DataBufferSP & 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetData() 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data_sp; 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb::DataBufferSP & 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetData() const 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data_sp; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner protected: 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackID m_stack_id; 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::DataBufferSP m_data_sp; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham struct ThreadStateCheckpoint 20215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 20315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham uint32_t orig_stop_id; // Dunno if I need this yet but it is an interesting bit of data. 20415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham lldb::StopInfoSP stop_info_sp; // You have to restore the stop info or you might continue with the wrong signals. 20515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham RegisterCheckpoint register_backup; // You need to restore the registers, of course... 20636de3c01c2f3ceac59b8e34b47c17fac200e27a1Jim Ingham uint32_t current_inlined_depth; 20736de3c01c2f3ceac59b8e34b47c17fac200e27a1Jim Ingham lldb::addr_t current_inlined_pc; 20815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham }; 20915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 210990de7bb41d3afec6b789155408ff322187d8682Greg Clayton static void 2112a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice SettingsInitialize (); 212990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 213990de7bb41d3afec6b789155408ff322187d8682Greg Clayton static void 2142a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice SettingsTerminate (); 215990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 21673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton static const ThreadPropertiesSP & 21773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton GetGlobalProperties(); 21820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 21994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham Thread (Process &process, lldb::tid_t tid); 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ~Thread(); 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 222f4124deeb9532044a38c0774ced872f2709347daGreg Clayton lldb::ProcessSP 223f4124deeb9532044a38c0774ced872f2709347daGreg Clayton GetProcess() const 22437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 225f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return m_process_wp.lock(); 22637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int 229123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton GetResumeSignal () const 230123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton { 231123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton return m_resume_signal; 232123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton } 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 235123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton SetResumeSignal (int signal) 236123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton { 237123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton m_resume_signal = signal; 238123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton } 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetState() const; 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetState (lldb::StateType state); 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType 247123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton GetResumeState () const 248123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton { 249123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton return m_resume_state; 250123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton } 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 253123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton SetResumeState (lldb::StateType state) 254123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton { 255123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton m_resume_state = state; 256123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton } 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // This function is called on all the threads before "ShouldResume" and 259a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // "WillResume" in case a thread needs to change its state before the 260a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // ThreadList polls all the threads to figure out which ones actually 261a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // will get to run and how. 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetupForResume (); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 265a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // Do not override this function, it is for thread plan logic only 266a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton bool 267a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton ShouldResume (lldb::StateType resume_state); 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // Override this to do platform specific tasks before resume. 270a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton virtual void 271a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton WillResume (lldb::StateType resume_state) 272a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton { 273a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton } 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This clears generic thread state after a resume. If you subclass this, 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be sure to call it. 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidResume (); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2801f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // This notifies the thread when a private stop occurs. 2811f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor virtual void 2821f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor DidStop (); 2831f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RefreshStateAfterStop() = 0; 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WillStop (); 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ShouldStop (Event *event_ptr); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton Vote 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ShouldReportStop (Event *event_ptr); 2957c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham 296b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton Vote 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ShouldReportRun (Event *event_ptr); 2983c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham 299cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Clayton void 300cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Clayton Flush (); 301cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Clayton 302649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // Return whether this thread matches the specification in ThreadSpec. This is a virtual 303649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // method because at some point we may extend the thread spec with a platform specific 304649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // dictionary of attributes, which then only the platform specific Thread implementation 305649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // would know how to match. For now, this just calls through to the ThreadSpec's 306649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // ThreadPassesBasicTests method. 3073c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham virtual bool 3083c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham MatchesSpec (const ThreadSpec *spec); 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3106297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham lldb::StopInfoSP 311643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetStopInfo (); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3133acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton lldb::StopReason 3143acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton GetStopReason(); 3153acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 31615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // This sets the stop reason to a "blank" stop reason, so you can call functions on the thread 31715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // without having the called function run with whatever stop reason you stopped with. 31815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham void 31915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham SetStopInfoToNothing(); 32015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadStoppedForAReason (); 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3247826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice static const char * 3257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice RunModeAsCString (lldb::RunMode mode); 3267826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 3277826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice static const char * 3287826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice StopReasonAsCString (lldb::StopReason reason); 3297826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 33137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton GetInfo () 33237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 33337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton return NULL; 33437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetName () 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetQueueName () 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual uint32_t 349fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetStackFrameCount() 350fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 3512450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton return GetStackFrameList()->GetNumFrames(); 352fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual lldb::StackFrameSP 355fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetStackFrameAtIndex (uint32_t idx) 356fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 3572450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton return GetStackFrameList()->GetFrameAtIndex(idx); 358fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 35908d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton 36008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton virtual lldb::StackFrameSP 36108d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton GetFrameWithConcreteFrameIndex (uint32_t unwind_idx); 3625c4b1607e8783a3d3f1f28fa66fcaa89ac246bd1Jim Ingham 3630c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham bool 3640c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham DecrementCurrentInlinedDepth() 3650c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham { 3660c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham return GetStackFrameList()->DecrementCurrentInlinedDepth(); 3670c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham } 3680c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham 3690c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham uint32_t 3700c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham GetCurrentInlinedDepth() 3710c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham { 37236de3c01c2f3ceac59b8e34b47c17fac200e27a1Jim Ingham return GetStackFrameList()->GetCurrentInlinedDepth(); 3730c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham } 3740c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham 375a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham Error 37694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham ReturnFromFrameWithIndex (uint32_t frame_idx, lldb::ValueObjectSP return_value_sp, bool broadcast = false); 377a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham 378a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham Error 37994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham ReturnFromFrame (lldb::StackFrameSP frame_sp, lldb::ValueObjectSP return_value_sp, bool broadcast = false); 380a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham 3815c4b1607e8783a3d3f1f28fa66fcaa89ac246bd1Jim Ingham virtual lldb::StackFrameSP 382b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton GetFrameWithStackID (const StackID &stack_id) 383fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 384d1ddde0c443e67b37f9303b5bdff19aad9f54fdcGreg Clayton if (stack_id.IsValid()) 385d1ddde0c443e67b37f9303b5bdff19aad9f54fdcGreg Clayton return GetStackFrameList()->GetFrameWithStackID (stack_id); 386d1ddde0c443e67b37f9303b5bdff19aad9f54fdcGreg Clayton return lldb::StackFrameSP(); 387fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 389c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton uint32_t 390fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetSelectedFrameIndex () 391fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 3922450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton return GetStackFrameList()->GetSelectedFrameIndex(); 393fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 394c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StackFrameSP 396fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetSelectedFrame () 397fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 3982450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton lldb::StackFrameListSP stack_frame_list_sp(GetStackFrameList()); 3992450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton return stack_frame_list_sp->GetFrameAtIndex (stack_frame_list_sp->GetSelectedFrameIndex()); 400fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 40394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham SetSelectedFrame (lldb_private::StackFrame *frame, bool broadcast = false); 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 405be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 406bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham bool 40794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham SetSelectedFrameByIndex (uint32_t frame_idx, bool broadcast = false); 408fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham 409be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham bool 410be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham SetSelectedFrameByIndexNoisily (uint32_t frame_idx, Stream &output_stream); 411be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 412fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham void 413fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham SetDefaultFileAndLineToSelectedFrame() 414fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 4152450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton GetStackFrameList()->SetDefaultFileAndLineToSelectedFrame(); 416fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41808d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton virtual lldb::RegisterContextSP 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetRegisterContext () = 0; 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42108d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton virtual lldb::RegisterContextSP 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateRegisterContextForFrame (StackFrame *frame) = 0; 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 425782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton ClearStackFrames (); 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4279acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton virtual bool 4289acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton SetBackingThread (const lldb::ThreadSP &thread_sp) 4299acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton { 4309acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton return false; 4319acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton } 4325042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton 4335042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton virtual lldb::ThreadSP 4345042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton GetBackingThread () const 4355042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton { 4365042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton return lldb::ThreadSP(); 4375042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton } 4389acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton 4399acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton virtual void 4409acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton ClearBackingThread () 4419acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton { 4429acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // Subclasses can use this function if a thread is actually backed by 4439acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // another thread. This is currently used for the OperatingSystem plug-ins 4449acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // where they might have a thread that is in memory, yet its registers 4459acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // are available through the lldb_private::Thread subclass for the current 4469acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // lldb_private::Process class. Since each time the process stops the backing 4479acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // threads for memory threads can change, we need a way to clear the backing 4489acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // thread for all memory threads each time we stop. 4499acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton } 4509acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 452a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton DumpUsingSettingsFormat (Stream &strm, uint32_t frame_idx); 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread Plan Providers: 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This section provides the basic thread plans that the Process control 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // machinery uses to run the target. ThreadPlan.h provides more details on 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // how this mechanism works. 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The thread provides accessors to a set of plans that perform basic operations. 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The idea is that particular Platform plugins can override these methods to 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // provide the implementation of these basic operations appropriate to their 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // environment. 463008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // 464008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // NB: All the QueueThreadPlanXXX providers return Shared Pointers to 465008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // Thread plans. This is useful so that you can modify the plans after 466008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // creation in ways specific to that plan type. Also, it is often necessary for 467008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // ThreadPlans that utilize other ThreadPlans to implement their task to keep a shared 468008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // pointer to the sub-plan. 469008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // But besides that, the shared pointers should only be held onto by entities who live no longer 470008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // than the thread containing the ThreadPlan. 471008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // FIXME: If this becomes a problem, we can make a version that just returns a pointer, 472008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // which it is clearly unsafe to hold onto, and a shared pointer version, and only allow 473008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // ThreadPlan and Co. to use the latter. That is made more annoying to do because there's 474008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // no elegant way to friend a method to all sub-classes of a given class. 475008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham // 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the base plan for a thread. 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The version returned by Process does some things that are useful, 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// like handle breakpoints and signals, so if you return a plugin specific 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// one you probably want to call through to the Process one for anything 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// your plugin doesn't explicitly handle. 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 490008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham /// A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued. 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 492008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham virtual lldb::ThreadPlanSP 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueFundamentalPlan (bool abort_other_plans); 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the plan used to step over a breakpoint at the current PC of \a thread. 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The default version returned by Process handles trap based breakpoints, and 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// will disable the breakpoint, single step over it, then re-enable it. 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 505008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham /// A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued. 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 507008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham virtual lldb::ThreadPlanSP 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepOverBreakpointPlan (bool abort_other_plans); 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the plan used to step one instruction from the current PC of \a thread. 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] step_over 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we step over calls to functions, false if we step in. 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 524008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham /// A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued. 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 526008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham virtual lldb::ThreadPlanSP 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepSingleInstruction (bool step_over, 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool abort_other_plans, 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads); 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 532f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// Queues the plan used to step through an address range, stepping over 533f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// function calls. 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] type 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Type of step to do, only eStepTypeInto and eStepTypeOver are supported by this plan. 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] range 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The address range to step through. 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] addr_context 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// When dealing with stepping through inlined functions the current PC is not enough information to know 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// what "step" means. For instance a series of nested inline functions might start at the same address. 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The \a addr_context provides the current symbol context the step 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// is supposed to be out of. 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Currently unused. 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 556008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham /// A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued. 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 558008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham virtual lldb::ThreadPlanSP 559f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham QueueThreadPlanForStepOverRange (bool abort_other_plans, 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const AddressRange &range, 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const SymbolContext &addr_context, 562f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham lldb::RunMode stop_other_threads); 563f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham 564f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham //------------------------------------------------------------------ 565f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// Queues the plan used to step through an address range, stepping into functions. 566f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// 567f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// @param[in] abort_other_plans 568f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// \b true if we discard the currently queued plans and replace them with this one. 569f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// Otherwise this plan will go on the end of the plan stack. 570f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// 571f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// @param[in] type 572f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// Type of step to do, only eStepTypeInto and eStepTypeOver are supported by this plan. 573f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// 574f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// @param[in] range 575f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// The address range to step through. 576f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// 577f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// @param[in] addr_context 578f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// When dealing with stepping through inlined functions the current PC is not enough information to know 579f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// what "step" means. For instance a series of nested inline functions might start at the same address. 580f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham // The \a addr_context provides the current symbol context the step 581f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// is supposed to be out of. 582f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham // FIXME: Currently unused. 583f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// 584f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// @param[in] step_in_target 585f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// Name if function we are trying to step into. We will step out if we don't land in that function. 586f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// 587f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// @param[in] stop_other_threads 588f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// \b true if we will stop other threads while we single step this one. 589f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// 590f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// @param[in] avoid_code_without_debug_info 591f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// If \b true we will step out if we step into code with no debug info. 592f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// 593f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham /// @return 594008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham /// A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued. 595f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham //------------------------------------------------------------------ 596008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham virtual lldb::ThreadPlanSP 597f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham QueueThreadPlanForStepInRange (bool abort_other_plans, 598f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham const AddressRange &range, 599f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham const SymbolContext &addr_context, 600f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham const char *step_in_target, 6018f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton lldb::RunMode stop_other_threads, 6028f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton bool avoid_code_without_debug_info); 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queue the plan used to step out of the function at the current PC of 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a thread. 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] addr_context 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// When dealing with stepping through inlined functions the current PC is not enough information to know 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// what "step" means. For instance a series of nested inline functions might start at the same address. 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The \a addr_context provides the current symbol context the step 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// is supposed to be out of. 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Currently unused. 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] first_insn 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if this is the first instruction of a function. 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_vote 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] run_vote 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// See standard meanings for the stop & run votes in ThreadPlan.h. 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 630008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham /// A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued. 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 632008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham virtual lldb::ThreadPlanSP 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepOut (bool abort_other_plans, 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext *addr_context, 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool first_insn, 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 637b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton Vote stop_vote, // = eVoteYes, 638b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton Vote run_vote, // = eVoteNoOpinion); 6391ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton uint32_t frame_idx); 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Gets the plan used to step through the code that steps from a function 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// call site at the current PC into the actual function call. 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 645038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham /// 646038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham /// @param[in] return_stack_id 647038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham /// The stack id that we will return to (by setting backstop breakpoints on the return 648038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham /// address to that frame) if we fail to step through. 649038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham /// 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 658008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham /// A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued. 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 660008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham virtual lldb::ThreadPlanSP 661038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham QueueThreadPlanForStepThrough (StackID &return_stack_id, 662038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham bool abort_other_plans, 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads); 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Gets the plan used to continue from the current PC. 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// This is a simple plan, mostly useful as a backstop when you are continuing 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// for some particular purpose. 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] target_addr 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The address to which we're running. 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 681008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham /// A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued. 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 683008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham virtual lldb::ThreadPlanSP 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForRunToAddress (bool abort_other_plans, 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address &target_addr, 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads); 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 688008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham virtual lldb::ThreadPlanSP 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepUntil (bool abort_other_plans, 6901ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton lldb::addr_t *address_list, 6911ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton size_t num_addresses, 6921ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton bool stop_others, 6931ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton uint32_t frame_idx); 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 695008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham virtual lldb::ThreadPlanSP 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForCallFunction (bool abort_other_plans, 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address& function, 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t arg, 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 700b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool unwind_on_error = false, 701b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool ignore_breakpoints = true); 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread Plan accessors: 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Gets the plan which will execute next on the plan stack. 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the next executed plan. 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan * 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetCurrentPlan (); 715be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 716be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham //------------------------------------------------------------------ 717be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham /// Unwinds the thread stack for the innermost expression plan currently 718be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham /// on the thread plan stack. 719be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham /// 720be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham /// @return 721be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham /// An error if the thread plan could not be unwound. 722be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham //------------------------------------------------------------------ 723be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham 724be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham Error 725be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham UnwindInnermostExpression(); 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 727f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghamprivate: 728f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool 7292bcbaf625afd8f521da03ddaa146e7ea7650ee38Jim Ingham PlanIsBasePlan (ThreadPlan *plan_ptr); 7302bcbaf625afd8f521da03ddaa146e7ea7650ee38Jim Ingham 73194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham void 73294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham BroadcastSelectedFrameChange(StackID &new_frame_id); 73394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham 734f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghampublic: 735f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 7371586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// Gets the outer-most plan that was popped off the plan stack in the 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// most recent stop. Useful for printing the stop reason accurately. 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the last completed plan. 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ThreadPlanSP 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetCompletedPlan (); 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 7471586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// Gets the outer-most return value from the completed plans 7481586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// 7491586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// @return 7501586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// A ValueObjectSP, either empty if there is no return value, 7511586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// or containing the return value. 7521586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham //------------------------------------------------------------------ 7531586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham lldb::ValueObjectSP 7541586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham GetReturnValueObject (); 7551586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 7561586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham //------------------------------------------------------------------ 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Checks whether the given plan is in the completed plans for this 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// stop. 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] plan 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Pointer to the plan you're checking. 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns true if the input plan is in the completed plan stack, 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// false otherwise. 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IsThreadPlanDone (ThreadPlan *plan); 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Checks whether the given plan is in the discarded plans for this 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// stop. 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] plan 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Pointer to the plan you're checking. 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns true if the input plan is in the discarded plan stack, 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// false otherwise. 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WasThreadPlanDiscarded (ThreadPlan *plan); 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues a generic thread plan. 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] plan_sp 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The plan to queue. 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the last completed plan. 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlan (lldb::ThreadPlanSP &plan_sp, bool abort_other_plans); 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Discards the plans queued on the plan stack of the current thread. This is 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// arbitrated by the "Master" ThreadPlans, using the "OkayToDiscard" call. 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // But if \a force is true, all thread plans are discarded. 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DiscardThreadPlans (bool force); 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 810ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham /// Discards the plans queued on the plan stack of the current thread up to and 811ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham /// including up_to_plan_sp. 812ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham // 813ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham // @param[in] up_to_plan_sp 814ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham // Discard all plans up to and including this one. 815ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham //------------------------------------------------------------------ 816ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham void 817ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham DiscardThreadPlansUpToPlan (lldb::ThreadPlanSP &up_to_plan_sp); 818ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham 81988e3de205708f14431559072ca258899b5ac31ccJim Ingham void 82088e3de205708f14431559072ca258899b5ac31ccJim Ingham DiscardThreadPlansUpToPlan (ThreadPlan *up_to_plan_ptr); 82188e3de205708f14431559072ca258899b5ac31ccJim Ingham 822ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham //------------------------------------------------------------------ 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Prints the current plan stack. 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] s 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The stream to which to dump the plan stack info. 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpThreadPlans (Stream *s) const; 83120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 83215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham virtual bool 83315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham CheckpointThreadState (ThreadStateCheckpoint &saved_state); 83415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 83515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham virtual bool 83676b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham RestoreRegisterStateFromCheckpoint (ThreadStateCheckpoint &saved_state); 83776b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham 83876b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham virtual bool 83915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham RestoreThreadStateFromCheckpoint (ThreadStateCheckpoint &saved_state); 84015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 841745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham void 842745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham EnableTracer (bool value, bool single_step); 843745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham 844745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham void 845745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham SetTracer (lldb::ThreadPlanTracerSP &tracer_sp); 846745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham 847a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton //------------------------------------------------------------------ 848a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // Get the thread index ID. The index ID that is guaranteed to not 849a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // be re-used by a process. They start at 1 and increase with each 850a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // new thread. This allows easy command line access by a unique ID 851a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // that is easier to type than the actual system thread ID. 852a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton //------------------------------------------------------------------ 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetIndexID () const; 855cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham 856a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton 857a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton //------------------------------------------------------------------ 858a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // The API ID is often the same as the Thread::GetID(), but not in 859a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // all cases. Thread::GetID() is the user visible thread ID that 860a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // clients would want to see. The API thread ID is the thread ID 861a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // that is used when sending data to/from the debugging protocol. 862a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton //------------------------------------------------------------------ 863a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton virtual lldb::user_id_t 864a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton GetProtocolID () const 865a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton { 866863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton return GetID(); 867a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton } 868a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lldb::ExecutionContextScope pure virtual functions 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 872289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton virtual lldb::TargetSP 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateTarget (); 874289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton 875289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton virtual lldb::ProcessSP 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateProcess (); 877289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton 878289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton virtual lldb::ThreadSP 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateThread (); 880289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton 881289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton virtual lldb::StackFrameSP 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateStackFrame (); 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 885a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton CalculateExecutionContext (ExecutionContext &exe_ctx); 886ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham 887ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham lldb::StackFrameSP 888ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham GetStackFrameSPForStackFramePtr (StackFrame *stack_frame_ptr); 889abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 890abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton size_t 891abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton GetStatus (Stream &strm, 892abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t start_frame, 893abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames, 894abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames_with_source); 895abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 896abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton size_t 897abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton GetStackFrameStatus (Stream& strm, 898abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t first_frame, 899abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames, 900abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool show_frame_info, 901a7d3dc75ec4f46033c3f991f11fb58a058091a85Greg Clayton uint32_t num_frames_with_source); 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9033feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton // We need a way to verify that even though we have a thread in a shared 9043feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton // pointer that the object itself is still valid. Currently this won't be 9053feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton // the case if DestroyThread() was called. DestroyThread is called when 9063feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton // a thread has been removed from the Process' thread list. 9073feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton bool 9083feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton IsValid () const 9093feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton { 910d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham return !m_destroy_called; 9113feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton } 91206b84494c72ceb559ca07ff5e2ccd2fe645b6363Jim Ingham 913375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // Sets and returns a valid stop info based on the process stop ID and the 914375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // current thread plan. If the thread stop ID does not match the process' 915375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // stop ID, the private stop reason is not set and an invalid StopInfoSP may 916375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // be returned. 917375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // 918375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // NOTE: This function must be called before the current thread plan is 919375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // moved to the completed plan stack (in Thread::ShouldStop()). 920375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // 921375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // NOTE: If subclasses override this function, ensure they do not overwrite 922375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // the m_actual_stop_info if it is valid. The stop info may be a 923375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // "checkpointed and restored" stop info, so if it is still around it is 924375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // right even if you have not calculated this yourself, or if it disagrees 925375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea // with what you might have calculated. 92606b84494c72ceb559ca07ff5e2ccd2fe645b6363Jim Ingham virtual lldb::StopInfoSP 927863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton GetPrivateStopInfo (); 928863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton 929863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton //---------------------------------------------------------------------- 930863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // Ask the thread subclass to set its stop info. 931863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // 932863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // Thread subclasses should call Thread::SetStopInfo(...) with the 933863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // reason the thread stopped. 934863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // 935863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // @return 936863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // True if Thread::SetStopInfo(...) was called, false otherwise. 937863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton //---------------------------------------------------------------------- 938863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton virtual bool 939863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton CalculateStopInfo () = 0; 94006b84494c72ceb559ca07ff5e2ccd2fe645b6363Jim Ingham 9413acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton //---------------------------------------------------------------------- 9423acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // Gets the temporary resume state for a thread. 9433acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // 9443acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // This value gets set in each thread by complex debugger logic in 945a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // Thread::ShouldResume() and an appropriate thread resume state will get 9463acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // set in each thread every time the process is resumed prior to calling 9473acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // Process::DoResume(). The lldb_private::Process subclass should adhere 9483acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // to the thread resume state request which will be one of: 9493acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // 9503acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // eStateRunning - thread will resume when process is resumed 9513acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // eStateStepping - thread should step 1 instruction and stop when process 9523acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // is resumed 9533acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // eStateSuspended - thread should not execute any instructions when 9543acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton // process is resumed 9553acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton //---------------------------------------------------------------------- 9563acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton lldb::StateType 9573acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton GetTemporaryResumeState() const 9583acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton { 9593acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton return m_temporary_resume_state; 9603acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton } 9613acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton 962a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton void 963a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton SetStopInfo (const lldb::StopInfoSP &stop_info_sp); 964a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton 9657c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham void 9667c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham SetShouldReportStop (Vote vote); 9677c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 96932f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton 97032f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton friend class ThreadPlan; 97113d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton friend class ThreadList; 97281f4b8953db5db67bec754dc895a5a83c96c84fbAndy Gibbs friend class ThreadEventData; 973782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton friend class StackFrameList; 9740c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham friend class StackFrame; 975a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton friend class OperatingSystem; 976cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham 977cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham // This is necessary to make sure thread assets get destroyed while the thread is still in good shape 978cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham // to call virtual thread methods. This must be called by classes that derive from Thread in their destructor. 979cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham virtual void DestroyThread (); 98032f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PushPlan (lldb::ThreadPlanSP &plan_sp); 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PopPlan (); 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DiscardPlan (); 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan *GetPreviousPlan (ThreadPlan *plan); 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector<lldb::ThreadPlanSP> plan_stack; 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham virtual bool 995e426d855032b9b1962b98028b42e3a4e88975b03Peter Collingbourne SaveFrameZeroState (RegisterCheckpoint &checkpoint); 99615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 99715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham virtual bool 998e426d855032b9b1962b98028b42e3a4e88975b03Peter Collingbourne RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint); 999a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham 1000a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham // register_data_sp must be a DataSP passed to ReadAllRegisterValues. 1001a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham bool 1002a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham ResetFrameZeroRegisters (lldb::DataBufferSP register_data_sp); 100315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 100471219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham virtual lldb_private::Unwind * 100537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton GetUnwinder (); 100671219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham 10076bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham // Check to see whether the thread is still at the last breakpoint hit that stopped it. 10081a00ab35c98b2acd393bb1ceee3e0e2bf4e02768Filipe Cabecinhas virtual bool 10096bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham IsStillAtLastBreakpointHit(); 10106bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham 1011a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // Some threads are threads that are made up by OperatingSystem plugins that 1012a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // are threads that exist and are context switched out into memory. The 1013a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // OperatingSystem plug-in need a ways to know if a thread is "real" or made 1014a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton // up. 1015a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton virtual bool 1016a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton IsOperatingSystemPluginThread () const 1017a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton { 1018a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton return false; 1019a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton } 1020a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton 1021a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton 10222450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton lldb::StackFrameListSP 1023782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton GetStackFrameList (); 102415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 102515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham struct ThreadState 10266297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham { 102715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham uint32_t orig_stop_id; 102815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham lldb::StopInfoSP stop_info_sp; 102915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham RegisterCheckpoint register_backup; 103015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham }; 10316297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Classes that inherit from Process can see and modify these 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 1035f4124deeb9532044a38c0774ced872f2709347daGreg Clayton lldb::ProcessWP m_process_wp; ///< The process that owns this thread. 1036863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton lldb::StopInfoSP m_stop_info_sp; ///< The private stop reason for this thread 1037863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton uint32_t m_stop_info_stop_id; // This is the stop id for which the StopInfo is valid. Can use this so you know that 1038863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton // the thread's m_stop_info_sp is current and you don't have to fetch it again 1039f4124deeb9532044a38c0774ced872f2709347daGreg Clayton const uint32_t m_index_id; ///< A unique 1 based index assigned to each thread for easy UI/command line access. 1040f4124deeb9532044a38c0774ced872f2709347daGreg Clayton lldb::RegisterContextSP m_reg_context_sp; ///< The register context for this thread's current register state. 1041f4124deeb9532044a38c0774ced872f2709347daGreg Clayton lldb::StateType m_state; ///< The state of our process. 1042f4124deeb9532044a38c0774ced872f2709347daGreg Clayton mutable Mutex m_state_mutex; ///< Multithreaded protection for m_state. 1043f4124deeb9532044a38c0774ced872f2709347daGreg Clayton plan_stack m_plan_stack; ///< The stack of plans this thread is executing. 1044f4124deeb9532044a38c0774ced872f2709347daGreg Clayton plan_stack m_completed_plan_stack; ///< Plans that have been completed by this stop. They get deleted when the thread resumes. 1045f4124deeb9532044a38c0774ced872f2709347daGreg Clayton plan_stack m_discarded_plan_stack; ///< Plans that have been discarded by this stop. They get deleted when the thread resumes. 10462450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton mutable Mutex m_frame_mutex; ///< Multithreaded protection for m_state. 1047f4124deeb9532044a38c0774ced872f2709347daGreg Clayton lldb::StackFrameListSP m_curr_frames_sp; ///< The stack frames that get lazily populated after a thread stops. 1048f4124deeb9532044a38c0774ced872f2709347daGreg Clayton lldb::StackFrameListSP m_prev_frames_sp; ///< The previous stack frames from the last time this thread stopped. 1049f4124deeb9532044a38c0774ced872f2709347daGreg Clayton int m_resume_signal; ///< The signal that should be used when continuing this thread. 1050f4124deeb9532044a38c0774ced872f2709347daGreg Clayton lldb::StateType m_resume_state; ///< This state is used to force a thread to be suspended from outside the ThreadPlan logic. 1051149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham lldb::StateType m_temporary_resume_state; ///< This state records what the thread was told to do by the thread plan logic for the current resume. 1052a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton /// It gets set in Thread::ShoudResume. 1053102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<lldb_private::Unwind> m_unwinder_ap; 1054f4124deeb9532044a38c0774ced872f2709347daGreg Clayton bool m_destroy_called; // This is used internally to make sure derived Thread classes call DestroyThread. 10557c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham LazyBool m_override_should_notify; 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For Thread only 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 106015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DISALLOW_COPY_AND_ASSIGN (Thread); 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_Thread_h_ 1068