Thread.h revision 5205f0b6585a127acc6ed210021abb6091220a89
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" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UserID.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContextScope.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrameList.h" 1871219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham#include "libunwind/include/libunwind.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define LLDB_THREAD_MAX_STOP_EXC_DATA 8 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// I forward declare these here so I don't have to #include ThreadPlan, so in turn I 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// can use Thread.h in ThreadPlan.h. 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Thread : 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public UserID, 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public ExecutionContextScope 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class RegisterCheckpoint 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterCheckpoint() : 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id (), 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_sp () 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterCheckpoint (const StackID &stack_id) : 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id (stack_id), 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_sp () 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~RegisterCheckpoint() 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StackID & 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetStackID() 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stack_id; 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetStackID (const StackID &stack_id) 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id = stack_id; 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::DataBufferSP & 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetData() 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data_sp; 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb::DataBufferSP & 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetData() const 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data_sp; 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner protected: 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackID m_stack_id; 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::DataBufferSP m_data_sp; 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread (Process &process, lldb::tid_t tid); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ~Thread(); 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process & 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetProcess() { return m_process; } 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Process & 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetProcess() const { return m_process; } 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetResumeSignal () const; 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetResumeSignal (int signal); 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetState() const; 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ThreadSP 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetSP (); 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetState (lldb::StateType state); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetResumeState () const; 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetResumeState (lldb::StateType state); 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This function is called on all the threads before "WillResume" in case 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a thread needs to change its state before the ThreadList polls all the 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // threads to figure out which ones actually will get to run and how. 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetupForResume (); 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Override this to do platform specific tasks before resume, but always 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // call the Thread::WillResume at the end of your work. 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WillResume (lldb::StateType resume_state); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This clears generic thread state after a resume. If you subclass this, 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be sure to call it. 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidResume (); 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RefreshStateAfterStop() = 0; 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WillStop (); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ShouldStop (Event *event_ptr); 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::Vote 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ShouldReportStop (Event *event_ptr); 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::Vote 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ShouldReportRun (Event *event_ptr); 1433c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham 144649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // Return whether this thread matches the specification in ThreadSpec. This is a virtual 145649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // method because at some point we may extend the thread spec with a platform specific 146649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // dictionary of attributes, which then only the platform specific Thread implementation 147649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // would know how to match. For now, this just calls through to the ThreadSpec's 148649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // ThreadPassesBasicTests method. 1493c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham virtual bool 1503c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham MatchesSpec (const ThreadSpec *spec); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton StopInfo * 153643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetStopInfo (); 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadStoppedForAReason (); 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetInfo () = 0; 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetName () 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetQueueName () 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual uint32_t 17471219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham GetStackFrameCount(); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual lldb::StackFrameSP 17771219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham GetStackFrameAtIndex (uint32_t idx); 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StackFrameSP 180c833295baeec641086f536e78050388af36784f8Jim Ingham GetSelectedFrame (); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 183c833295baeec641086f536e78050388af36784f8Jim Ingham SetSelectedFrame (lldb_private::StackFrame *frame); 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 186c833295baeec641086f536e78050388af36784f8Jim Ingham SetSelectedFrameByIndex (uint32_t frame_idx); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual RegisterContext * 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetRegisterContext () = 0; 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SaveFrameZeroState (RegisterCheckpoint &checkpoint) = 0; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint) = 0; 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual RegisterContext * 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateRegisterContextForFrame (StackFrame *frame) = 0; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 201782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton ClearStackFrames (); 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpInfo (Stream &strm, 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool show_stop_reason, 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool show_name, 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool show_queue, 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t frame_idx);// = UINT32_MAX); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread Plan Providers: 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This section provides the basic thread plans that the Process control 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // machinery uses to run the target. ThreadPlan.h provides more details on 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // how this mechanism works. 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The thread provides accessors to a set of plans that perform basic operations. 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The idea is that particular Platform plugins can override these methods to 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // provide the implementation of these basic operations appropriate to their 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // environment. 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the base plan for a thread. 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The version returned by Process does some things that are useful, 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// like handle breakpoints and signals, so if you return a plugin specific 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// one you probably want to call through to the Process one for anything 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// your plugin doesn't explicitly handle. 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueFundamentalPlan (bool abort_other_plans); 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the plan used to step over a breakpoint at the current PC of \a thread. 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The default version returned by Process handles trap based breakpoints, and 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// will disable the breakpoint, single step over it, then re-enable it. 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepOverBreakpointPlan (bool abort_other_plans); 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the plan used to step one instruction from the current PC of \a thread. 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] step_over 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we step over calls to functions, false if we step in. 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepSingleInstruction (bool step_over, 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool abort_other_plans, 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads); 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the plan used to step through an address range, stepping into or over 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// function calls depending on the value of StepType. 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] type 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Type of step to do, only eStepTypeInto and eStepTypeOver are supported by this plan. 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] range 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The address range to step through. 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] addr_context 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// When dealing with stepping through inlined functions the current PC is not enough information to know 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// what "step" means. For instance a series of nested inline functions might start at the same address. 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The \a addr_context provides the current symbol context the step 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// is supposed to be out of. 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Currently unused. 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepRange (bool abort_other_plans, 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StepType type, 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const AddressRange &range, 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const SymbolContext &addr_context, 3068f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton lldb::RunMode stop_other_threads, 3078f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton bool avoid_code_without_debug_info); 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queue the plan used to step out of the function at the current PC of 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a thread. 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] addr_context 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// When dealing with stepping through inlined functions the current PC is not enough information to know 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// what "step" means. For instance a series of nested inline functions might start at the same address. 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The \a addr_context provides the current symbol context the step 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// is supposed to be out of. 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Currently unused. 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] first_insn 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if this is the first instruction of a function. 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_vote 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] run_vote 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// See standard meanings for the stop & run votes in ThreadPlan.h. 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepOut (bool abort_other_plans, 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext *addr_context, 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool first_insn, 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::Vote stop_vote = lldb::eVoteYes, 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::Vote run_vote = lldb::eVoteNoOpinion); 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Gets the plan used to step through the code that steps from a function 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// call site at the current PC into the actual function call. 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepThrough (bool abort_other_plans, 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads); 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Gets the plan used to continue from the current PC. 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// This is a simple plan, mostly useful as a backstop when you are continuing 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// for some particular purpose. 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] target_addr 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The address to which we're running. 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForRunToAddress (bool abort_other_plans, 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address &target_addr, 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepUntil (bool abort_other_plans, 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t *address_list, 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_addresses, 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_others); 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForCallFunction (bool abort_other_plans, 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address& function, 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t arg, 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool discard_on_error = false); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForCallFunction (bool abort_other_plans, 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address& function, 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueList &args, 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool discard_on_error = false); 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread Plan accessors: 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Gets the plan which will execute next on the plan stack. 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the next executed plan. 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan * 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetCurrentPlan (); 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Gets the inner-most plan that was popped off the plan stack in the 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// most recent stop. Useful for printing the stop reason accurately. 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the last completed plan. 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ThreadPlanSP 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetCompletedPlan (); 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Checks whether the given plan is in the completed plans for this 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// stop. 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] plan 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Pointer to the plan you're checking. 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns true if the input plan is in the completed plan stack, 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// false otherwise. 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IsThreadPlanDone (ThreadPlan *plan); 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Checks whether the given plan is in the discarded plans for this 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// stop. 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] plan 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Pointer to the plan you're checking. 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns true if the input plan is in the discarded plan stack, 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// false otherwise. 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WasThreadPlanDiscarded (ThreadPlan *plan); 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues a generic thread plan. 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] plan_sp 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The plan to queue. 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the last completed plan. 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlan (lldb::ThreadPlanSP &plan_sp, bool abort_other_plans); 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Discards the plans queued on the plan stack of the current thread. This is 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// arbitrated by the "Master" ThreadPlans, using the "OkayToDiscard" call. 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // But if \a force is true, all thread plans are discarded. 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DiscardThreadPlans (bool force); 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Prints the current plan stack. 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] s 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The stream to which to dump the plan stack info. 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpThreadPlans (Stream *s) const; 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the thread index ID. The index ID that is guaranteed to not be 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // re-used by a process. They start at 1 and increase with each new thread. 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This allows easy command line access by a unique ID that is easier to 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type than the actual system thread ID. 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetIndexID () const; 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lldb::ExecutionContextScope pure virtual functions 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Target * 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateTarget (); 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Process * 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateProcess (); 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Thread * 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateThread (); 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual StackFrame * 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateStackFrame (); 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Calculate (ExecutionContext &exe_ctx); 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 51832f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton 51932f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton friend class ThreadPlan; 520782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton friend class StackFrameList; 52132f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PushPlan (lldb::ThreadPlanSP &plan_sp); 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PopPlan (); 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DiscardPlan (); 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan *GetPreviousPlan (ThreadPlan *plan); 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 533643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual lldb::StopInfoSP 534643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetPrivateStopReason () = 0; 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector<lldb::ThreadPlanSP> plan_stack; 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53871219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham virtual lldb_private::Unwind * 53971219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham GetUnwinder () = 0; 54071219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham 541782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton StackFrameList & 542782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton GetStackFrameList (); 543782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Classes that inherit from Process can see and modify these 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process & m_process; ///< The process that owns this thread. 548643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton lldb::StopInfoSP m_public_stop_info_sp; ///< The public stop reason for this thread 549643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton lldb::StopInfoSP m_actual_stop_info_sp; ///< The private stop reason for this thread 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t m_index_id; ///< A unique 1 based index assigned to each thread for easy UI/command line access. 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::RegisterContextSP m_reg_context_sp; ///< The register context for this thread's current register state. 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType m_state; ///< The state of our process. 553782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton mutable Mutex m_state_mutex; ///< Multithreaded protection for m_state. 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner plan_stack m_plan_stack; ///< The stack of plans this thread is executing. 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner plan_stack m_immediate_plan_stack; ///< The plans that need to get executed before any other work gets done. 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner plan_stack m_completed_plan_stack; ///< Plans that have been completed by this stop. They get deleted when the thread resumes. 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner plan_stack m_discarded_plan_stack; ///< Plans that have been discarded by this stop. They get deleted when the thread resumes. 558f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton std::auto_ptr<StackFrameList> m_curr_frames_ap; ///< The stack frames that get lazily populated after a thread stops. 5595205f0b6585a127acc6ed210021abb6091220a89Greg Clayton lldb::StackFrameListSP m_prev_frames_sp; ///< The previous stack frames from the last time this thread stopped. 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int m_resume_signal; ///< The signal that should be used when continuing this thread. 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType m_resume_state; ///< The state that indicates what this thread should do when the process is resumed. 56271219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham std::auto_ptr<lldb_private::Unwind> m_unwinder_ap; 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For Thread only 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DISALLOW_COPY_AND_ASSIGN (Thread); 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_Thread_h_ 574